23

重複の可能性:
C ++で次のフレーズはどういう意味ですか:ゼロ、デフォルト、および値の初期化?

たとえば、クラスがある場合:

class Info
{
   int x;
   int y;
};

オブジェクトを作成するために使用したもの、

Info *p = new Info();

情報の横の括弧は、私がそれを初期化する価値があることを意味しますか?これとどう違うのInfo *p = new Info;

新しいC++言語と古いC++言語の異なる意味を区別する質問があることは知っていますが、デフォルトと値の初期化の意味の違いを知りたいです。たとえば、値の初期化は何かをゼロに初期化することを意味しますか?

4

1 に答える 1

33

宣言された変数は、ゼロ初期化値初期化、またはデフォルト初期化にすることができます。

あなたの例では:

Info *p = new Info();    <------- Value Initialization
Info *p = new Info;      <------- Default Initialization

C++03標準8.5/5は、それぞれを適切に定義します。

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

— Tがスカラータイプ(3.9)の場合、オブジェクトはTに変換された0(ゼロ)の値に設定されます。
— Tが非ユニオンクラスタイプの場合、各非静的データメンバーと各基本クラスサブオブジェクト
はゼロで初期化されます。
— Tが共用体型の場合、オブジェクトの最初の名前付きデータメンバーはゼロで初期化されます。
— Tが配列型の場合、各要素はゼロで初期化されます。
— Tが参照型の場合、初期化は実行されません。

タイプTのオブジェクトをデフォルトで初期化
するということは、次のことを意味します 。— Tが非PODクラスタイプの場合(9節)、Tのデフォルトコンストラクターが呼び出されます(Tにアクセス可能なデフォルトコンストラクターがない場合、初期化の形式が正しくありません)。
— Tが配列型の場合、各要素はデフォルトで初期化されます。
—それ以外の場合、オブジェクトはゼロで初期化されます。

タイプTのオブジェクトを値初期化
するということは、次のことを意味します 。— Tがユーザー宣言コンストラクター(12.1)を持つクラスタイプ(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(Tの場合、初期化は不正な形式になります)アクセス可能なデフォルトコンストラクタはありません);
— Tがユーザー宣言コンストラクターのない非ユニオンクラスタイプである場合、Tのすべての非静的データメンバーと基本クラスコンポーネントは値で初期化されます。
— Tが配列型の場合、各要素は値で初期化されます。
—それ以外の場合、オブジェクトはゼロで初期化されます

于 2012-01-14T07:19:16.113 に答える