2016-11-20 43 views
0

我总是覆盖运营商这样的首选方式:什么是重写的C运算符++

class MyClass { 
public: 
    ... 
    MyClass operator+(const MyClass&) const; 

private: 
    int some_number = 5; 
} 

MyClass MyClass::operator+(const MyClass& rhs) const 
{ 
    return MyClass(some_number + rhs.some_number); 
} 

但是今天我才明白,你可以用“朋友”关键字创建运营商太:

class MyClass { 
public: 
... 
friend MyClass operator+(const MyClass&, const MyClass&); 

private: 
    int some_number = 5; 
} 

MyClass operator+(const MyClass& lhs, const Myclass& rhs) 
{ 
    return MyClass(lhs.some_number + rhs.some_number); 
} 

考虑到我想要左侧和右侧操作员,我也(尝试)遵循核心指导原则,哪种方法是首选方法?

+1

Fyi,这值得一读:[运算符重载](https://stackoverflow.com/questions/4421706/operator-overloading)。特别是[会员与非会员之间的决定]部分(http://stackoverflow.com/questions/4421706/operator-overloading/4421729#4421729)。 – WhozCraig

+0

不要混淆**重载**和**覆盖**。这些是非常不同的东西! –

回答

0

的首选方法是,甚至不能让它的朋友:

MyClass operator+(MyClass lhs, Myclass const& rhs) 
{ 
    return lhs += rhs; 
} 

当然,这也依赖于operator+=但毕竟是更基本的操作。 +=改变其左侧,应该是一个成员。