2

この方法で関数を呼び出すと、次のようになります。

foo(MyClass a)

オブジェクトaが値渡しされているということは、それがコピーされているということです。

私の質問は、どのようにコピーされているのですか? 私のクラスにはコピーコンストラクターがないと言います。したがって、浅いコピーを使用して渡された場合、オブジェクトは関数内で変更される可能性がありますか?

4

3 に答える 3

11

コンパイラは、コピー コンストラクターのコードを自動的に生成し、メンバーごとのコピーを実行します。コンパイラーが呼び出すコピーコンストラクターは、メンバーごとのコピーを行いますが、これは実際には浅いコピーです。

クラスにポインタが存在する場合、オブジェクトを値渡しすることはお勧めできません。ポインターが存在しなくても、他に多数のデータ メンバーが存在する場合、それらをコピーするのに多くの時間がかかります。参照渡ししconst、値を変更したくない場合は作成します。

于 2012-09-07T19:26:15.197 に答える
5

2 つの可能性があります。

最初:コピー コンストラクターを指定していません。

この場合、デフォルトのコピー コンストラクターMyClass::MyClass(MyClass const&)が使用されます。これは、 のすべてのメンバーのコピー構築を試みますMyClass(これらはメンバー自体を持っている可能性があるため、再帰的に)。したがって、これらのメンバーのいずれかがコピー構築可能でない場合、デフォルトのコピー コンストラクターも失敗します (次のポイントを参照)。

2 番目: コピー コンストラクターを private と宣言したか、実際にdeleted しました (C++11 の場合)。

この場合、コンパイラはコピー コンストラクターへのアクセスを必要とするため、この関数には何も渡すことができません。これにより、コンパイル時のエラーが発生します。

于 2012-09-07T19:29:34.580 に答える
1

コンパイラは、既定のコピー コンストラクターを作成します。

于 2012-09-07T19:25:42.593 に答える