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;
}

正如您所做的那样,按value返回一个新对象肯定是非标准的,因为它会创建不必要的临时对象。

于 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;
}

使用这样的运算符,c4=c2=c1将编译,并将具有分配 to 的效果c1,然后分配 to的c2新值。c2c4

于 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 回答