この方法で関数を呼び出すと、次のようになります。
foo(MyClass a)
オブジェクトa
が値渡しされているということは、それがコピーされているということです。
私の質問は、どのようにコピーされているのですか? 私のクラスにはコピーコンストラクターがないと言います。したがって、浅いコピーを使用して渡された場合、オブジェクトは関数内で変更される可能性がありますか?
この方法で関数を呼び出すと、次のようになります。
foo(MyClass a)
オブジェクトa
が値渡しされているということは、それがコピーされているということです。
私の質問は、どのようにコピーされているのですか? 私のクラスにはコピーコンストラクターがないと言います。したがって、浅いコピーを使用して渡された場合、オブジェクトは関数内で変更される可能性がありますか?
コンパイラは、コピー コンストラクターのコードを自動的に生成し、メンバーごとのコピーを実行します。コンパイラーが呼び出すコピーコンストラクターは、メンバーごとのコピーを行いますが、これは実際には浅いコピーです。
クラスにポインタが存在する場合、オブジェクトを値渡しすることはお勧めできません。ポインターが存在しなくても、他に多数のデータ メンバーが存在する場合、それらをコピーするのに多くの時間がかかります。参照渡ししconst
、値を変更したくない場合は作成します。
2 つの可能性があります。
この場合、デフォルトのコピー コンストラクターMyClass::MyClass(MyClass const&)
が使用されます。これは、 のすべてのメンバーのコピー構築を試みますMyClass
(これらはメンバー自体を持っている可能性があるため、再帰的に)。したがって、これらのメンバーのいずれかがコピー構築可能でない場合、デフォルトのコピー コンストラクターも失敗します (次のポイントを参照)。
delete
d しました (C++11 の場合)。この場合、コンパイラはコピー コンストラクターへのアクセスを必要とするため、この関数には何も渡すことができません。これにより、コンパイル時のエラーが発生します。
コンパイラは、既定のコピー コンストラクターを作成します。