C/C++ enum class(C++11), enum enumeration
2022-03-18 06:16:26
列挙とは、C++において、ある種の無限集合を列挙する仕組みのことです。C++11で新しくenumクラス(enum structと同じ)ができましたが、enumとはどう違うのでしょうか?
enumの特徴。
enumのメンバーは、指定されている場合は指定された値で初期化されます。指定されていない場合は、前のメンバーの値に1を加えた値になり、最初のメンバーが指定されていない場合は0になります。
- Shape-shiftingへの暗黙の変換。
- スコープの問題で、enum クラスにすでに占有されているメンバー名がある場合、それを再度定義することはできません。
- コンパイラによって型が異なる可能性があります。
一例として
#include
using namespace std;
enum color {
red,
yellow = 4,
blue = 0xFFFFFF00U
};
enum mycolor {
//red,
//not definable, as it is defined in color
white,
pink
};
void func(int c)
{
cout<<"call func\n"<<<endl;
}
int main()
{
color c(red);//red scope is visible
func(c);//conversion occurs, enum color to int
cout<< red << endl;
cout<< yellow << endl;
cout<< blue << endl;
return 0;
}
上のような出力になります。
call func
0
4
4294967040
また、以下のような場合もあります。
call func
0
4
-1
列挙の基礎となるデータ型が指定されていないため、コンパイラによって結果が異なる。
そして、enum.のいくつかの問題については、enum.がうまく解決してくれます。
enumクラスの特徴。
- シェイプシフターで型変換が発生しない。
- スコープの問題で、ドメイン演算子でアクセスする必要がある。
- デフォルトの基礎となるデータ型は int です。
例として
#include
using namespace std;
enum class color{
red,
yellow,
blue
};
void fun_int(int x)
{
cout<<"fun int: "<<<x<<endl;
}
int main()
{
color c(static_cast<color>(1));
//error
//fun_int(c);
fun_int(static_cast<int>(c));
fun_int(static_cast<int>(color::red));
//error
//fun_int(static_cast
(red));
return 0;
}
その結果は.
fun int: 1
fun int: 0
enum class color:int と宣言すると、エラーになります。
192:~ lurongming$ g++ main.cc
main.cc:26:6: warning: scoped enumerations are a C++11 extension [-Wc++11-extensions]
enum class color:int{
^
main.cc:26:12: error: ISO C++ forbids forward references to 'enum' types
enum class color:int{
^
main.cc:26:17: error: expected unqualified-id
enum class color:int{
^
main.cc:45:27: warning: use of enumeration in a nested name specifier is a C++11 extension [-Wc++11-extensions]
fun_int(static_cast<int>(color::red));
^
main.cc:45:27: error: incomplete type 'color' named in nested name specifier
fun_int(static_cast<int>(color::red));
^~~~~~~
2 warnings and 3 errors generated.
ISO C++ではenum型への前方参照を禁止しています。
enum は指定された型を禁止しています。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例