57

構造内のメンバーを初期化できないのはなぜですか?

例:

struct s {
   int i = 10;
};
4

6 に答える 6

40

宣言で非静的メンバーを初期化する場合:struct

C ++(Cではない)では、structsクラスとほぼ同義であり、コンストラクターでメンバーを初期化できます。

struct s {
    int i;

    s(): i(10)
    {
    }
};

インスタンスを初期化する場合:

CまたはC++の場合:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99には、指定された初期化子と呼ばれる機能もあります。

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

C99指定の初期化子と非常によく似たGNUC拡張機能もありますが、より移植性の高いものを使用することをお勧めします。

struct s s_instance = {
    i: 10,
};
于 2008-10-22T10:03:43.267 に答える
37

直接的な答えは、構造定義が初期化可能な変数ではなく型を宣言しているためです。あなたの例は次のとおりです。

struct s { int i=10; };

これは変数を宣言するのではなく、型を定義します。変数を宣言するには、}と の間に名前を追加し、;後で初期化します。

struct s { int i; } t = { 10 };

Checkers が指摘したように、C99 では、指定された初期化子を使用することもできます (これは素晴らしい改善です。C は、Fortran 66 がデータの初期化のために持っていた他の機能に追いつき、主に指定された回数だけ初期化子を繰り返します)。この単純な構造では、利点はありません。たとえば、20 個のメンバーを持つ構造体があり、そのうちの 1 つだけを初期化する必要がある場合 (たとえば、構造体の残りの部分が初期化されているかどうかを示すフラグがあるため)、より便利です。

struct s { int i; } t = { .i = 10 };

この表記法は、共用体を初期化し、共用体のどの要素を初期化するかを選択するためにも使用できます。

于 2008-10-22T15:14:12.797 に答える
20

C++ 11 では、次の宣言が許可されるようになったことに注意してください。

struct s {
   int i = 10;
};

これは古い質問ですが、Google で上位にランクされているため、明確にする必要があります。

于 2016-05-31T16:12:45.143 に答える
8

Edit2:この回答は 2008 年に書かれたもので、C++98 に関連しています。メンバーの初期化の規則は、言語の後続のバージョンで変更されました。

編集:質問はもともとタグ付けさc++れていましたが、投稿者はそれが関連していると述べたcので、質問にタグを付け直しましたが、答えは残しています...

C++ では、 astructはメンバーと継承ではなくclassデフォルトのa です。publicprivate

C++ でのみ、static const整数メンバーをインラインで初期化できます。他のメンバーは、コンストラクターで初期化する必要があります。または、初期化リスト内structPODである場合 (変数を宣言するとき)。

struct bad {
    static int answer = 42; // Error! not const
    const char* question = "what is life?"; // Error! not const or integral
};

struct good {
    static const int answer = 42; // OK
    const char* question;
    good() 
        : question("what is life?") // initialization list
        { }
};

struct pod { // plain old data
    int answer;
    const char* question;
};
pod p = { 42, "what is life?" };
于 2008-10-22T10:05:30.017 に答える
2

実際に行っていること以外の構造を宣言したときに、コンパイラにそれらの存在、つまりそのためにメモリが割り当てられていないこと、およびそのためのメモリなしでメンバーを初期化することを通知するだけなので、初期化できません。通常、変数コンパイラがその変数にメモリを割り当てると宣言した場所に依存する変数を初期化するとどうなりますか。

int a = 10;
  • 割り当てようとしているスタックメモリよりも自動の場合
  • データセクションメモリよりもグローバルである場合、メモリが割り当てられます

したがって、そのデータを保持するにはどのようなメモリが必要ですが、構造体の場合はメモリがないため、初期化できません。

于 2016-03-14T18:14:19.370 に答える
0

あなたが言ったように、それは変数ではなく単なるメンバーです。変数を宣言すると、コンパイラは、値を入れることができる変数用のメモリ空間も提供します。構造体メンバーの場合、コンパイラはそのためのメモリ空間を与えていないため、その構造体型の変数を作成しない限り、構造体メンバーに値を割り当てることはできません。

于 2016-05-31T16:26:06.623 に答える