0

これらの2つの前のスレッドを例として使用する

最初のスレッド: オーバーロードされた代入演算子がクラスへの参照を返すのはなぜですか?

2番目のスレッド: コピー代入演算子が参照/定数参照を返さなければならないのはなぜですか?

オーバーロードされた代入演算子の戻り型はクラスですか、それともクラスへの参照ですか?私は両方を見ました:

Point& Point::operator = (const Point& sourcePoint)
{
// As in the first thread I pasted above
return *this;
}

Point Point::operator = (const Point& sourcePoint)
{
// As in the second thread I pasted above
return *this;
}

どちらが正しいですか?

同様に、次の違いは何ですか。

int exFunction()
{
     int i = 5;
     int* iPtr = &i;
     return *iPtr;
}

対:

int& exFunction2()
{
     int j = 5;
     int* jPtr = &j;
     return *jPtr;
}

ありがとう!

4

1 に答える 1

1

2つのことはまったく「似ていません」。

まず、代入演算子。チェーンで使用できるように、オブジェクト自体への参照を返す必要があります。

Foo x, y, z;

x = y = z;   // makes y equal to z and returns a reference to self,
             // which is assigned to x

したがって、常に次のようになります。

Foo & operator=(Foo const &) { /* ... */  return this; }  // copy-assignment

Foo & operator=(/* any other signature */) { /* ... */   return this; }

さて、2 番目の質問: あなたexFunction2は完全に間違っており、壊れています。関数が戻るまでにスコープ外になるローカル変数への参照を返すため、未定義の動作をします。(本質的に と言ってreturn j;います。逆参照の結果は左辺値であることを思い出してください。) その関数を書く唯一の賢明な方法は likeexFunctionで、これは に短縮できますint exFunction() { return 5; }

これは、このトピックに関する関連する質問です。

于 2012-10-25T23:13:14.537 に答える