構造体

構造体を用いることで、任意の型の要素をまとめられます。

struct MyStruct {
    char a;
    int* b;
};

C++の構造体とクラスの違いは、メンバが既定でpublicであることだけです。

構文

[template-spec] struct [ms-decl-spec] [tag [: base-list ]]
{
    member-list
} [declarators];
struct (C++ ) | MSDN

ビットフィールド (bit field)

占有するビット数を指定してフィールドを定義します。このとき名前のないフィールドも認められ、それはレイアウトの調整に役立ちます。フィールドは整数か列挙型でなければならず、フィールドのアドレスは取得できません。

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キーワードは不要です。

匿名構造体 (Anonymous Structures)

識別子を付けずに構造体を宣言できます。

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;
}

参考

参考書

Microsoft Learnから検索