構造体を用いることで、任意の型の要素をまとめられます。
struct MyStruct { char a; int* b; };
C++の構造体とクラスの違いは、メンバが既定でpublicであることだけです。
[template-spec] struct [ms-decl-spec] [tag [: base-list ]] { member-list } [declarators];struct (C++ ) | MSDN
占有するビット数を指定してフィールドを定義します。このとき名前のないフィールドも認められ、それはレイアウトの調整に役立ちます。フィールドは整数か列挙型でなければならず、フィールドのアドレスは取得できません。
struct MyStruct {
bool a : 1;
bool b : 1;
bool : 1; // 名前なし
int c : 8;
};
配列と同様の方法で初期化できます。
struct MyStruct { int num; char* p; char a[2]; }; MyStruct s1 = { 5, "abc", {10,20} }; // s1.num ... 5 // s1.p ... "abc" // s1.a[0] ... 10 // s1.a[1] ... 20
値を指定しないと、ゼロ初期化されます。
MyStruct s2 = {}; // s2.num ... 0 // s2.p ... NULL // s2.a[0] ... 0 // s2.a[1] ... 0 MyStruct s3{}; // s2と同じ
初期化子を指定しないと、Visual C++では0xc (0b1100) で埋められます。
MyStruct s4; // s4.num ... 0xcccccccc (-858993460) // s4.p ... 0xcccccccc // s4.a[0] ... 0xcc (-52) 'フ' // s4.a[1] ... 0xcc (-52) 'フ'
または、かっこ内の式でも可能です。
MyStruct myStruct(1, "A", {1,2});
Cとの互換性から、structキーワードを付けても定義できます。
struct MyStruct myStruct;
これは同一スコープに同名の非構造体が宣言されている場合、それと区別するために必要です。
struct MyStruct {}; void MyStruct();
しかし、そもそもそのような曖昧な名前が付けられているのが問題で、通常はstructキーワードは不要です。
識別子を付けずに構造体を宣言できます。
struct { int a; } myStruct; void main() { myStruct.a = 10; }匿名構造体 - 匿名クラス型 | MSDN
この匿名構造体は、次のように構造体をネストするときに便利です。
struct MyStruct2 { struct { int a; } myStruct1; int b; } myStruct2; void main() { myStruct2.myStruct1.a = 10; myStruct2.b = 10; }