4

C++ を学習していますが、int 変数の初期化について少し混乱しています。

このコード (コメントを含む) は、このトピックの Nawaz の回答からのコピー/貼り付けです。Why does C++ require a user-provided default constructor to default-const object?

struct POD
{
  int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized

p2 については、次のことが起こっていることを理解しています。

  • デフォルトのコンストラクター POD() が呼び出され、一時 POD オブジェクトが作成されます。コンストラクターはユーザー定義ではないため、暗黙的です。int のような組み込み型の場合、暗黙のデフォルト コンストラクターは何もしません (初期化しません)。したがって、はいくつかのランダムなものを含んでいます。
  • コピー コンストラクターが呼び出され、一時 POD オブジェクト ( iがまだ初期化されていない) を使用して p2 が作成されます。したがって、p2 の i メンバーも初期化しないでください。

ただし、コメントには、p2が初期化されていると書かれています! どんな説明でも大歓迎です。ありがとう。

4

2 に答える 2

3

クラス型PODにユーザー定義のコンストラクターがない場合 (例の場合のように)、POD() default constructor は呼び出されません。代わりに、オブジェクトはコンストラクターをまったく使用せずに作成されます。コンパイラは、一時オブジェクトのいわゆる値の初期化を実行します。値の初期化は、必ずしもコンストラクターを使用しない自己完結型の初期化方法です。代わりに、オブジェクト全体の値の初期化は、そのすべてのサブオブジェクトの値の初期化を次々と再帰的に実行します。intタイプvalue-initializationのメンバーの場合、ゼロ初期化を意味します。

POD().iこれが、ゼロであることが保証されている理由です。そのゼロは、コンストラクターによってそこに配置されませんでした。そのゼロは、値の初期化によってそこに配置されました。

于 2013-07-17T02:57:53.157 に答える