コピー コンストラクターの呼び出しに関する 3 つのケースについて学びました。
1. 変数が同じクラスのオブジェクトから初期化されている
2. クラスの値パラメーターで関数が呼び出される
3. 関数がクラスのオブジェクトである値を返す
また、教科書では、上記の 2 つのケース (case2 と 3) について、コピー コンストラクターの呼び出しを避けるために、参照渡しを使用すると述べています。
いくつかの情報を検索しましたが、正確には理解できません。
例(私は自分のコードを作りました)
class CpClass{
int p;
CpClass(const CpClass &obj){
cout<<"user-defined constructor"<<endl;
p = obj.p;
}
~CpClass(){
cout<<"destructor"<<endl;
}
};
void show1(String &s)
{ cout << "show1 : " << s.p; }
void show2(String s)
{ cout << "show2 : " << s.p; }
int main(){
CpClass c1(10);
CpClass c2(c1);
show1(c2);
show2(c2);
};
これについていくつかの情報を見つけました。
まず、クラスオブジェクトである引数を渡すとき、引数が値ではなく参照形式の場合、関数が終了するとすぐにデストラクタを呼び出しません。メイン関数の終了時にデストラクタを呼び出します
次に、パラメーター形式が値による呼び出しか参照による呼び出しかに関係なく、引数をコピーするときにコンストラクターを呼び出します (コードでは、String &s または String s)。
私は正しいですか?