-1

編集:私の質問をより意味のあるものに変更しました

クラスがある場合:

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

できます。この振る舞いを私に説明してください。

4

3 に答える 3

1

次のようになります。

template<class T>
class A {
public:
     int nr;
     T *a;
     A();
};

template<class T>
A<T>::A() : nr(0), a( new T[42]) { }
于 2012-09-27T11:28:13.817 に答える
1

nr(0)データ メンバの初期化子ですnr

{a = new T[10]; }初期化子リストの初期化が実行されたa 、データ メンバーに値を代入するコンストラクター本体です。

{}空のコンストラクター本体です。これは、コンストラクターが何もしないことを意味します (nrもちろん、初期化リストにあるため、 initialize 以外は)。

a = new int[10]初期化子リストとコンストラクター本体の間は意味がありません。言語の構文では許可されていません。コンパイルするべきではありませんが、それを受け入れてクラッシュするコンパイラを見つけた場合は、そのコンパイラのドキュメントで説明を確認する必要があります。

于 2012-09-27T11:27:17.047 に答える
0

どちらもコンパイルしないでください。適切な方法は次のとおりです。

  • 最初のケース:A::A(): nr( 0 ), a( new int[5] ){}
  • 2番目のケース:A<T>::A(): nr( 0 ), a( new T[10] ){}
于 2012-09-27T11:22:53.940 に答える