言い換えれば、なぜコンパイラは次のようなことについて不平を言うのですか:
class Integer {
int i = 3;
};
これは非常にばかげた例ですが、デフォルトで何らかの値に初期化できるメンバを持つクラスが多数あります (たとえば、デフォルトで常にゼロに初期化される内部カウンタなど)。クラスコンストラクターの外でこれらのデフォルトの初期化を禁止する理由は何ですか?
言い換えれば、なぜコンパイラは次のようなことについて不平を言うのですか:
class Integer {
int i = 3;
};
これは非常にばかげた例ですが、デフォルトで何らかの値に初期化できるメンバを持つクラスが多数あります (たとえば、デフォルトで常にゼロに初期化される内部カウンタなど)。クラスコンストラクターの外でこれらのデフォルトの初期化を禁止する理由は何ですか?
コンストラクタがあるからです。
class InTeGeR
{
Public:
int i;
InTeGeR()
{
i=3;
}
}
コンストラクタ外の初期化がある場合:
class InTeGeR
{
Public:
int i=3;
InTeGeR()
{
i=5;
}
//now, i could be 3 or 5. Which one?
int j=i+1;
//is j 4 or 6? Very confusing
}
コメントで述べたように、C++ 11 では、実際に示したように実行できます。ただし、C++98/C++03 ではまだ違法です。
編集: ただし、質問に答えるには: わかりません :p おそらく、言語設計者は、C++98 の公開時に誰もそれをやりたがらないとは考えていませんでした。いずれにせよ、C++11 で確実に実行できます。