2017-12-26 20 views
1

私はコードスニペットhereを読んでいます。セクションにアクセスするには、「Constクラスデータメンバー」を検索してください。コードは以下のようなものです:constメンバーをC++コンストラクタで初期化できますか?

class Test 
{ 
    const int i; 
    public: 
    Test (int x) 
    { 
    i=x; 
    } 
}; 

int main() 
{ 
Test t(10); 
Test s(20); 
} 

は、私はそれが正しいではありません、私を警告VS2013を使用しています。私が知っているように、constメンバ変数は、初期化リストによってのみ初期化できます。 Sth。以下のような:

Test (int x):i(x){} 

は(?もしそうなら、変更は、右の違いは思わない関数本体で初期化し、合理的に聞こえる)ことをサポートするための新しいC++標準の更新をしましたか?または文書が間違っている(私はそれが間違いをしないと推測している)。

+1

最初のコードスニペットは、どのC++標準でも正しくありません。 – DeiDei

+3

はい、初期化できます。しかし、あなたはそれを初期化していません、あなたはそれに割り当てています。 – StoryTeller

+0

チュートリアルを続行してください。コンストラクタのイニシャライザリストについては、後ほど説明します。http://www.studytonight.com/cpp/initializer-list-in-cpp.php –

答えて

2

ルールは変更されませんでした(C++ 98から)。

コンストラクタの本体内のi=x;は、初期化ではなく代入であることに注意してください。彼らは違うものです。 constメンバーのために、彼らは唯一のそのような参照のメンバーとconst修飾型など、デフォルトの初期化することができないメンバーについてはinitialized

することができ、メンバー初期化子を指定する必要があります。

Test (int x):i(x){}

しかし、彼らは割り当てることができない、

Test (int x) 
{ 
    i=x; // assignment is not allowed 
    ... 
    i=42; // assignment again; that makes no sense for const at all 
} 
0

はい、constメンバーは、あなたのコードスニペットに示すように、(初期化リストを使用して)初期化に割り当てられていないことができます。いいえ、新しいC++標準ではコンストラクタの割り当てをサポートするようにこれを更新していません。

このコードスニペットを含む問題のチュートリアルは間違っています。私はそのようなチュートリアルを読んではならないことをアドバイスしたいと思います。

+0

@EdHeal私は週末にプログラムをするのが好きです。歌はちょうどパートタイムです。 –

関連する問題