12

重複の可能性:
C 配列メンバーはコピー制御関数でどのように処理されますか?

クラスの をオーバーライドしないoperator =と、デフォルトのメンバーごとの割り当てが使用されます。

しかし、それはどういう意味ですか?

struct A {
    int array[100];
};
A a;
A b=a;

エラーなし。どのようbに対処しaますarrayか?通常array_b = array_aは無効です。

別の例:

struct A {
    vector<int> vec;
};
A a;
A b=a;

どのようbに対処しaますvecか?割り当て(vec_b = vec_a)、コンストラクタ(vec_b = vector<int>(vec_a))または他の謎の方法を介して?

4

2 に答える 2

9
A b=a;

代入ではなく、コピー初期化と呼ばれます。

b暗黙的に生成されたコピー コンストラクターが呼び出され、既存のオブジェクトから新しいオブジェクトが作成されますa
暗黙的に生成されたコピー コンストラクターは、arrayメンバーのコピーを作成します。

完全を期すために、マークされた複製からの標準的な引用をここに追加します。

C++03 標準: 12.8 (クラス オブジェクトのコピー)

各サブオブジェクトは、そのタイプに適した方法でコピーされます。

  • サブオブジェクトがクラス型の場合、クラスのコピー コンストラクターが使用されます。
  • サブオブジェクトが配列の場合、要素の型に適した方法で各要素がコピーされます。
  • サブオブジェクトがスカラー型の場合、組み込み代入演算子が使用されます。
于 2012-05-05T11:52:11.907 に答える
1

メンバーにコピー コンストラクターがある場合は、それらが呼び出されます。そうでない場合、デフォルトのコピー コンストラクターは memcpy と同等の処理を行います。メンバーごとの代入と初期化を参照してください。

非ポインター配列の場合、各要素がコピーされます。

于 2012-05-05T11:54:00.783 に答える