従ったコードサンプルに違いがある場合は?
ClassTwo ClassTwo::getOwnOne(){
return *this;
}
ClassTwo& ClassTwo::getOwnTwo(){
return *this;
}
従ったコードサンプルに違いがある場合は? 同じですか?
ClassTwo ClassTwo::getOwnOne()
これは、呼び出されたオブジェクトのコピーを返します。
ClassTwo& ClassTwo::getOwnTwo()
これは、呼び出されたオブジェクトへの参照を返します。
結果を使用して新しいオブジェクトを作成する場合、どちらも (多かれ少なかれ) 同じことを行います。
ClassTwo c2a = c2.getOwnOne(); // New object
ClassTwo c2b = c2.getOwnTwo(); // New object too
ただし、それらを使用して参照を初期化する場合は異なります。
ClassTwo const & c2a = c2.getOwnOne(); // New object (lifetime tied to reference)
ClassTwo const & c2b = c2.getOwnTwo(); // Reference to c2
ClassTwo & c2a = c2.getOwnOne(); // ERROR
ClassTwo & c2b = c2.getOwnTwo(); // Reference to c2
3 つ目は、変更可能な参照を一時オブジェクトにバインドできないため、エラーになります。
最初のものは をコピー*this
しますが、2 番目のものはコピーしません。
それらは同じではありません。最初のものは暗黙的にコピー コンストラクターを呼び出し、オブジェクトのコピーを返します。2番目のものはそれへの参照を返します。
これは、次のようなコピー コンストラクターをクラスに追加することで確認できます (メッセージを表示するだけの役に立たないものです)。
ClassTwo(const ClassTwo& in)
{
cout << "I am the copy constructor" << endl;
}
メソッドを呼び出すとgetOwnOne()
、メッセージが表示されます。うんざりgetOwnTwo()
。