3

C++2003 以降、値の初期化とデフォルトの初期化があります。つまり:

struct Foo {
    int i;
    std :: string s;
};

Foo f1;          // f1.s is default-constructed, f1.i is uninitialised
Foo f2 = Foo (); // f1.s is default-constructed, f1.i is zero

右?

今、私はこのクラスを持っているとします

class Bar : public Foo {
    int n;
    Foo f [SIZE];
public:
    Bar ();
};

のコンストラクターを作成するとき、親クラスまたはメンバーBarのいずれかをデフォルトまたは値で初期化したい場合があります。f[]親を初期化するための選択は単純だと思います:

Bar :: Bar () : Foo (), n (-1) {} // Parent is value-initialised (Foo::i is zero)
Bar :: Bar () : n (-1)         {} // Parent is default-initialised (Foo::i is undefined)

しかし、f[]メンバーはどうですか?

  • すべてのメンバーをデフォルトで初期化するにはどうすればよいですか?
  • すべてのメンバーの値を初期化するにはどうすればよいですか?
  • C++11 イニシャライザ リストを使用する場合、イニシャライザ リストのサイズが と異なるとどうなりSIZEますか?
4

1 に答える 1

1

実際には、標準的な値の初期化によると、そこで任意の形式のユーザー定義のデフォルトコンストラクターを呼び出すプロセス、またはデフォルトコンストラクターを持たないオブジェクトをゼロ初期化するプロセスのようです (8.5 [decl.init] パラグラフ 7 を参照してください:

タイプ T のオブジェクトを値で初期化するとは、次のことを意味します。

— T がユーザー提供のコンストラクター (12.1) を持つ (おそらく cv 修飾された) クラス型 (第 9 節) である場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化は整形式ではありません)。 );

— T が (おそらく cv 修飾された) 非共用体クラス型であり、ユーザー提供のコンストラクターがない場合、オブジェクトはゼロで初期化され、T の暗黙的に宣言された既定のコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。

— T が配列型の場合、各要素は値で初期化されます。— それ以外の場合、オブジェクトはゼロで初期化されます。

この意味で、C++ 1998 以降f()、メンバー初期化子リストを使用して配列メンバーを値初期化できます。特定の値を使用する場合は、C++ 2011 を初期化リストと共に使用する必要がありますf({ 1, 2, 3 })。要素よりも引数が少ない場合、残りの要素は値が初期化されます。実際には、空のイニシャライザ リストから初期化されます (8.5.1 [dcl.init.aggr] パラグラフ 7)。

集約内のメンバーよりもリスト内の初期化句が少ない場合、明示的に初期化されていない各メンバーは、空の初期化子リストから初期化されます。

...そして、空の初期化子リストからのこの初期化は、8.5.4 [dcl.init.list] パラグラフ 3、箇条書き 7 によると、次のことを意味します。

  • それ以外の場合、イニシャライザ リストに要素がない場合、オブジェクトは値で初期化されます。
于 2012-02-07T09:29:36.843 に答える