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的,那么,为什么是必要的回报? 类似地,在c1 = c2 + c3中,使用重载的+运算符添加c2和c3,并将该值返回给c1,但不会变为c1 =,所以我们不应该使用another =运算符来分配c2和c3之和为c1?我很困惑。

+0

相关:http://stackoverflow.com/questions/2447696/overloading-assignment-operator-in-c和http://stackoverflow.com/questions/2649068/has-anyone-found-the-need-to -declare最返回参数的,一个拷贝赋值-O/2649576#2649576 – 2012-04-11 16:25:09

回答

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

通过返回一个新的对象,因为你正在做的,肯定是不规范的,因为它创建不必要的临时。

2

这是为了支持a = b = c的习语。

你也做错了;退货应该是circle &而不是circle,退货应该是return *this;

0

您可以从您的赋值运算符函数返回* this来返回对当前对象的引用。您也可以的

circle& operator = (circle& c) 
{ 
// do assignments 
    return *this; 
} 
3

这不是强制性的价值,而是返回一个参考*this让人们链的分配,你可以与基本类型。

但是,只有赋值运算符根据值或const引用采用其参数时才会起作用;你的电话号码为非const,这是你在特殊情况下应该做的事情。

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

有了这样的运营商,c4=c2=c1将编译,将分配给c1c2,那么c2新值分配给c4的效果。

相关问题