16

昨日、初期化子リスト項目へのパラメーターの指定はオプションであることを知りました。しかし、この場合に何が起こるかについての規則は何ですか?

次の例では、ptrは0に初期化され、falseに切り替わり、Barはデフォルトで構築されますか?未指定の引数値==未定義の動作の場合、初期化子リストにはほとんど意味がないため、この質問は一種の冗長だと思います。

初期化子リスト項目に引数が与えられていない場合の動作を示すC++標準のセクションも指摘できますか?

class Bar
{
    Bar() { }
};

class SomeClass;
class AnotherClass
{
public:
    SomeClass *ptr;
    bool toggle;
    Bar bar;

    AnotherClass() : ptr(), toggle(), bar() { }
    // as opposed to...
    // AnotherClass() : ptr(NULL), toggle(false), bar(Bar()) { }
};
4

3 に答える 3

14

はい、メンバーはそれぞれゼロとデフォルトで構築されたオブジェクトに初期化されます。

C ++ 11標準では、12.6.2/7でこの動作が指定されています。

mem-initializerのexpression-listまたはbraced-init-listは、直接初期化の8.5の初期化規則に従って、指定されたサブオブジェクト(または、委任コンストラクターの場合は完全なクラスオブジェクト)を初期化するために使用されます。

次に、8.5/10は次のように読み取ります。

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。

8.5 / 7項では、値の初期化を定義しています。

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

  • Tがユーザー提供のコンストラクター(12.1)を持つ(おそらくcv修飾された)クラスタイプ(条項9)の場合、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化は不正な形式になります) ;
  • Tがユーザー提供のコンストラクターのない(おそらくcv修飾された)非ユニオンクラスタイプである場合、オブジェクトはゼロで初期化され、Tの暗黙的に宣言されたデフォルトコンストラクターが自明でない場合、そのコンストラクターが呼び出されます。
  • Tが配列型の場合、各要素は値で初期化されます。
  • それ以外の場合、オブジェクトはゼロで初期化されます。

そして最後に、8.5 /5はゼロで初期化されたものを定義します:

タイプTのオブジェクトまたは参照をゼロで初期化するということは、次のことを意味します。

  • Tがスカラー型(3.9)の場合、オブジェクトは値0(ゼロ)に設定され、積分定数式と見なされ、Tに変換されます。
  • Tが(おそらくcv修飾された)非ユニオンクラスタイプである場合、各非静的データメンバーと各基本クラスサブオブジェクトはゼロで初期化され、パディングはゼロビットに初期化されます。
  • Tが(おそらくcv修飾された)共用体型である場合、オブジェクトの最初の非静的な名前付きデータメンバーはゼロで初期化され、パディングはゼロビットに初期化されます。
  • Tが配列型の場合、各要素はゼロで初期化されます。
  • Tが参照型の場合、初期化は実行されません。
于 2013-01-10T14:07:26.363 に答える
6

次の例では、ptrは0に初期化され、falseに切り替わり、Barはデフォルトで構築されますか?

はい。メンバー初期化子が空の括弧で初期化子リストに表示される場合、そのメンバーは値初期化されます。これは、数値型がゼロ、nullへのポインター、およびそのコンストラクターを使用するデフォルトのコンストラクターを持つクラスに初期化されることを意味します。

初期化子リストにメンバーをまったく含めない場合、代わりにデフォルトで初期化されます。その場合。数値型とポインタ型は初期化されないままになります。

初期化子リスト項目に引数が与えられていない場合の動作を示すC++標準のセクションも指摘できますか?

C ++ 11 12.6.2/7は、ルールが直接初期化の場合と同じであることを指定しています。

C ++ 11 8.5 / 16は、初期化子がの場合()、オブジェクトは値で初期化されることを指定しています。

C ++ 11 8.5 / 7は、値の初期化を定義します。

于 2013-01-10T14:07:57.323 に答える
2

初期化は[dcl.init](別名8.5)でカバーされています

ポイント10は言う:

初期化子が空の括弧のセット、つまり()であるオブジェクトは、値で初期化されます。

値の初期化は、簡単に言えば、クラスのデフォルトの構造であり、非クラス型のゼロの初期化です。

于 2013-01-10T14:07:06.920 に答える