編集:私の質問をより意味のあるものに変更しました
クラスがある場合:
class A{
public:
int nr;
int *a;
A();
};
A::A(): nr(0), a = new int[10]{}
これはchrasesですが、私が持っている場合
A::A(): nr(0) {a = new int[10];}
できます。この振る舞いを私に説明してください。
編集:私の質問をより意味のあるものに変更しました
クラスがある場合:
class A{
public:
int nr;
int *a;
A();
};
A::A(): nr(0), a = new int[10]{}
これはchrasesですが、私が持っている場合
A::A(): nr(0) {a = new int[10];}
できます。この振る舞いを私に説明してください。
次のようになります。
template<class T>
class A {
public:
int nr;
T *a;
A();
};
template<class T>
A<T>::A() : nr(0), a( new T[42]) { }
nr(0)
データ メンバの初期化子ですnr
。
{a = new T[10]; }
初期化子リストの初期化が実行されたa
後、データ メンバーに値を代入するコンストラクター本体です。
{}
空のコンストラクター本体です。これは、コンストラクターが何もしないことを意味します (nr
もちろん、初期化リストにあるため、 initialize 以外は)。
a = new int[10]
初期化子リストとコンストラクター本体の間は意味がありません。言語の構文では許可されていません。コンパイルするべきではありませんが、それを受け入れてクラッシュするコンパイラを見つけた場合は、そのコンパイラのドキュメントで説明を確認する必要があります。
どちらもコンパイルしないでください。適切な方法は次のとおりです。
A::A(): nr( 0 ), a( new int[5] ){}
A<T>::A(): nr( 0 ), a( new T[10] ){}