2
class sample
{
  private:
    int radius;
    float x,y;
  public:
    circle()
     {

     }
    circle(int rr;float xx;float yy)
     {
      radius=rr;
      x=xx;
      y=yy;
     }

 circle operator =(circle& c)
     {
      cout << endl<<"Assignment operator invoked";
      radius=c.radius;
      x=c.x;
      y=c.y;
      return circle(radius,x,y);
     }


}

int main()
{
 circle c1(10,2.5,2.5);
 circle c1,c4;
 c4=c2=c1;
}

オーバーロードされた「=」関数では、ステートメント

radius=c.radius;
x=c.x;
y=c.y;

それ自体が c2 のすべてのデータ メンバを c1 のデータ メンバと等しくするのに、なぜ return が必要なのでしょうか? 同様に、c1=c2+c3 では、オーバーロードされた + 演算子を使用して c2 と c3 が加算され、値が c1 に返されますが、それは c1= にはなりません。したがって、別の = 演算子を使用して合計を代入するべきではありません。 c2 と c3 の c1 への? よくわかりません。

4

4 に答える 4

6

必須ではありませんが(つまり、戻りタイプは有効です)、標準的な方法では、参照を返し、効率のオーバーヘッドなしで割り当ての連鎖を可能にします。例えば:void*this

class circle
{
    int radius;
    float x, y;

public:
    circle()
      : radius(), x(), y()
    { }

    circle(int rr, float xx, float yy)
      : radius(rr), x(xx), y(yy)
    { }

    circle& operator =(circle const& c)
    {
        std::cout << "Copy-assignment operator invoked\n";
        radius = c.radius;
        x = c.x;
        y = c.y;
        return *this;
    }
};

int main()
{
    circle c1(10, 2.5f, 2.5f);
    circle c2, c3;
    c3 = c2 = c1;
}

あなたがしているように、新しいオブジェクトをで返すことは、不必要な一時的なものを作成するので、確かに非標準です。

于 2012-04-11T16:13:15.230 に答える
3

必須ではありませんが、への参照を返す*thisことで、基本型の場合と同様に、代入を連鎖させることができます。

constただし、代入演算子が値または参照によって引数を取る場合にのみ機能します。これconstは、特別な状況でのみ行うべきことです。

circle & operator=(circle const & c) {
    radius = c.radius;
    x = c.x;
    y = c.y;
    return *this;
}

そのような演算子を使用すると、コンパイルされ、 to に代入してから to の新しい値を代入する効果がc4=c2=c1あります。c1c2c2c4

于 2012-04-11T16:20:54.410 に答える
2

のイディオムをサポートすることですa = b = c

あなたもそれを間違っています。リターンはそうでcircle &はなくcircle、リターンはである必要がありますreturn *this;

于 2012-04-11T16:13:27.050 に答える
0

代入演算子関数から *this を返すだけで、現在のオブジェクトへの参照を返すことができます。の値を作成することもできます。

circle& operator = (circle& c)
{
// do assignments
    return *this;
}
于 2012-04-11T16:18:13.020 に答える