構造内のメンバーを初期化できないのはなぜですか?
例:
struct s {
int i = 10;
};
初期化する場合非静的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,
};
直接的な答えは、構造定義が初期化可能な変数ではなく型を宣言するためです。あなたの例は次のとおりです。
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 };
この表記法は、共用体の初期化、共用体のどの要素を初期化するのにも使用できます。
C++ 11では、次の宣言が許可されるようになりました。
struct s {
int i = 10;
};
これは古い質問ですが、Googleで上位にランクされており、明確にされる可能性があります。
編集:質問には元々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?" };
初期化することはできません。実際に行う構造よりも構造を宣言したとき、コンパイラにその存在を通知するだけです。つまり、そのメモリが割り当てられていない場合、およびそのメモリがないメンバーを初期化する場合です。通常、変数コンパイラを宣言した場所に依存する変数を初期化すると、コンパイラはその変数にメモリを割り当てます。
int a = 10;
そのため、そのデータを保持するために必要なメモリはどれですか。ただし、構造の場合はメモリがないため、初期化することはできません。