私はマイヤーズの本を読んでいて、参照/ポインター対値で戻る際の項目に出くわしました。重要なのは、たとえば関数が次のような場合です。
ClassA& AddSomething(ClassA classA)
{
ClassA tempClassA;
//... do something on tempClassA
return tempClassA;
}
スタック上に作成されたオブジェクトへの参照を返しているため、これは機能しません。関数が実行されたため、これは無効になっています。
彼は2つの解決策を与えます:
- 関数内でローカル静的ClassAを使用します。これには問題がありますが、少なくともオブジェクトが存在することを確認できます。
オブジェクトとして返す:
ClassA AddSomething(ClassA classA) { ClassA tempClassA; //... do something on tempClassA return tempClassA; }
今私がする場合:
ClassA obj1;
ClassA obj2 = AddSomething(obj1);
私の混乱は、この行を実行するときです:
- tempClassAの「コピー」が作成され、ClassAのコピーコンストラクターに渡されます(obj2を初期化するため)?また
- コピーコンストラクターは参照を取得するため、tempClassAはClassAのコピーコンストラクターに渡されます。
したがって、基本的に、コピーコンストラクターに渡されるのは、tempClassA(関数内のスタックで作成された)への参照またはtempClassAのコピーへの参照です。
また、私が持っている別の質問は、関数のローカル変数の参照を取得した場合、その場合、ローカル変数は削除されないことを読みました。例えば、
ClassA & classRef = AddSomething(obj1);
この場合、AddSomething()が参照を返す場合、ローカル変数が保持されるため、classRefは削除された参照を指していません。私はこれを正しく理解しましたか?