構造体

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

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

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

構文

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

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

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

struct Foo {
    bool a : 1;
    bool b : 1;
    bool : 1; // 名前なし
    int c : 8;
};

参考

初期化

配列と同様の方法で初期化できます。

struct Foo
{
    int num;
    char* p;
    char a[2];
};

Foo f1 = { 5, "abc", {10,20} };
// f1.num ... 5
// f1.p   ... "abc"
// f1.a[0] ... 10
// f1.a[1] ... 20

値を指定しないと、ゼロ初期化されます。

Foo f2 = {};
// f2.num ... 0
// f2.p   ... NULL
// f2.a[0] ... 0
// f2.a[1] ... 0

Foo f3{}; // f2と同じ

初期化子を指定しないと、Visual C++では0xc (0b1100) で埋められます。

Foo f4;
// f4.num ... 0xcccccccc (-858993460)
// f4.p   ... 0xcccccccc
// f4.a[0] ... 0xcc (-52) 'フ'
// f4.a[1] ... 0xcc (-52) 'フ'

または、かっこ内の式でも可能です。

Foo f(1, "A", {1,2});

Cとの互換性から、structキーワードを付けても定義できます。

struct Foo f;

これは同一スコープに同名の非構造体が宣言されている場合、それと区別するために必要です。

struct Foo {};
void Foo();

しかし、そもそもそのような曖昧な名前が付けられているのが問題で、通常はstructキーワードは不要です。

匿名構造体 (Anonymous Structures)

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

struct
{
    int  a;
} foo;

void main()
{
    foo.a = 10;
}
匿名構造体 - 匿名クラス型 | MSDN

この匿名構造体は、次のように構造体をネストするときに便利です。

struct Bar
{
    struct
    {
        int  a;
    } foo;
    int b;
} bar;

void main()
{
    bar.foo.a = 10;
    bar.b = 10;
}

参考

参考書

MSDN (Microsoft Developer Network) から検索