35

私はC++を始めたばかりです。代入演算子と逆参照演算子の戻り値の型について少し混乱しています。私は本 C++ Primer に従っています。さまざまな場面で、著者は、代入演算子の戻り値の型は左側のオペランドの型への参照であると述べていますが、後で、戻り値の型は左側のオペランドの型であると述べています。C++11 Standard Sec を参照しました。5.17 では、戻り値の型は「左側のオペランドを参照する左辺値」と記述されています。

同様に、逆参照がポイント先のオブジェクトを返すのか、オブジェクトへの参照を返すのかわかりません。

これらのステートメントは同等ですか? もしそうなら、どうやって?説明をいただければ幸いです。

4

3 に答える 3

40

標準では、代入演算子の戻り値の型が正しく定義されています。実際には、代入操作自体は戻り値に依存しません。そのため、戻り値の型を理解するのは簡単ではありません。

戻り値の型は、連鎖操作にとって重要です。次の構造を検討してくださいa = b = c;。これは と等しい必要があります。a = (b = c)つまり、とにc代入する必要があります。と書き換えます。への代入が正しく機能するためには、 の戻り値の型が内部の代入結果への参照である必要があります (コピーでも機能しますが、これは不要なオーバーヘッドです)。bbaa.operator=(b.operator=(c))ab.operator=(c)

逆参照演算子の戻り値の型は内部ロジックに依存するため、必要に応じて定義してください。

于 2013-03-08T11:41:05.900 に答える
10

どちらも何でもかまいませんが、通常 operator =は参照によって現在のオブジェクトを返します。

A& A::operator = ( ... )
{
   return *this;
}

はい、「左側のオペランドの型への参照」と「左側のオペランドを参照する左辺値」は同じことを意味します。

逆参照演算子は、基本的に任意の戻り値の型を持つことができます。オブジェクトへのポインターではなく、オブジェクトに適用される演算子をオーバーロードしているため、主にプログラムのロジックに依存します。通常、これはスマート ポインターまたはイテレーターに使用され、それらがラップするオブジェクトを返します。

struct smart_ptr
{
   T* innerPtr;
   T* smart_ptr::operator* ()
   {
      return innerPtr;
   }
}

smart_ptr p; 
T* x = *p;  
于 2013-03-08T11:30:13.777 に答える
1

同様の問題を見たことがありますが、使用するのが最善だと思います

X& X::operator=(const X&);

これを使用すると、チェーン割り当てでオブジェクトを再利用できます。

于 2013-03-08T11:30:46.403 に答える