web-dev-qa-db-ja.com

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

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

例:

struct s {
   int i = 10;
};
49
Santhosh

初期化する場合非静的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,
};

また、GNU C拡張機能もあります。これは、C99指定のイニシャライザーに非常に似ていますが、より移植性の高いものを使用することをお勧めします。

struct s s_instance = {
    i: 10,
};
38
Alex B

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

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

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

33

C++ 11では、次の宣言が許可されるようになりました。

struct s {
   int i = 10;
};

これは古い質問ですが、Googleで上位にランクされており、明確にされる可能性があります。

13
Turtlesoft

編集:質問には元々c++というタグが付けられていましたが、ポスターはcに関するものだと言ったので、質問に再度タグを付けました。私は答えを残しています...

C++では、structは単なるclassであり、デフォルトではメンバーと継承のpublicではなく、privateになります。

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

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?" };
8
Motti

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

int a = 10;
  • スタックメモリ内で割り当てるよりも自動の場合
  • データセクションのメモリよりもグローバルな場合

そのため、そのデータを保持するために必要なメモリはどれですか。ただし、構造の場合はメモリがないため、初期化することはできません。

2
Anup Raj Dubey