17

私がこのクラスを持っているとしましょう:

//Awesome.h
class Awesome
{
    public:
        Awesome();
    private:
        membertype member;
}

//Awesome.cpp
#include "Awesome.h"

Awesome::Awesome()
:member()
{
}

member()のコンストラクターの初期化リストでを省略した場合、のコンストラクAwesomeターはmember自動的に呼び出されますか?memberまた、初期化リストに含めていない場合にのみ呼び出されますか?

4

2 に答える 2

20

はい。変数が初期化子リストに指定されていない場合、デフォルトで自動的に構築されます。

デフォルトの構築とは、 がまたはの場合membertypeはデフォルトで構築され、組み込み配列の場合は各要素がデフォルトで構築され、組み込み型の場合は初期化が実行されないことを意味します (オブジェクトには静的またはスレッドローカルの保存期間があります)。最後のケースは、オブジェクトがスタック上に作成されるか、ヒープ上に割り当てられる場合に、メンバー変数に予測できないガベージが含まれる可能性があることを意味します (多くの場合、含まれる可能性があります)。classstructAwesomeAwesome

于 2012-08-16T18:22:58.587 に答える
10

§8.5から

オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。初期化が実行されない場合、自動または動的な保管期間を持つオブジェクトの値は不確定です。[注:静的またはスレッドの保存期間を持つオブジェクトはゼロで初期化されます。3.6.2を参照してください。—エンドノート]

将来の参照のための更新:さらに、初期化されたデフォルトの意味は次のように定義されます

タイプTのオブジェクトをデフォルトで初期化するということは、次のことを意味します
。— Tが(おそらくcv修飾された)クラスタイプである場合(第9節)、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトがない場合、初期化は不正な形式になります)コンストラクター) ;
— Tが配列型の場合、各要素はデフォルトで初期化されます。
—それ以外の場合、初期化は実行されません。
プログラムがconst修飾型Tのオブジェクトのデフォルトの初期化を要求する場合、Tはユーザー提供のデフォルトコンストラクターを持つクラス型でなければなりません。

さらに、これを参照して初期化された値とは異なります:-

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

于 2012-08-16T18:30:11.033 に答える