C++同一运算符的多个运算符重载

ela*_*dan 10 c++ operator-overloading operators

我知道我可以通过生成代码轻松地回答这个问题并查看它是否编译.但由于我找不到类似的问题,我认为这是值得分享的知识.假设我正在为MyClass重载+运算符.我可以多次超载吗?不同类型的不同过载.像这样:

class MyClass{
...
inline const MyClass operator+(const MyClass &addend) const {
    cout<<"Adding MyClass+MyClass"<<endl;
    ...//Code for adding MyClass with MyClass
}
inline const MyClass operator+(const int &addend) const {
    cout<<"Adding MyClass+int"<<endl;
    ...//Code for adding MyClass with int
}
...
};
int main(){
    MyClass c1;
    MyClass c2;
    MyClass c3 = c1 + c2; 
    MyClass c4 = c1 + 5;
}
/*Output should be:
  Adding MyClass+MyClass
  Adding MyClass+in*/
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我正在构建一个我希望尽可能优化的类.性能是我最关心的问题.因此,在操作员+重载功能内部铸造和使用开关盒不是一种选择.我注意到,我把内插的重载都做了.让我们假设编译器确实内联我的重载,然后在编译时预先确定哪个代码将运行,并且我将调用保存到一个函数(通过内联)+一个复杂的开关案例场景(实际上,将会有+运算符的5+重载,但我仍然能够使用基本算术运算符轻松编写读取代码.那么,我会得到理想的行为吗?

ken*_*ytm 11

是.


这些操作符函数只是具有特殊名称的普通函数operator@.他们不能超载是没有限制的.实际上,<<iostream使用的运算符是具有多个重载的运算符.


sbi*_*sbi 9

规范的实现形式operator+()是一种基于的免费功能operator+=(),当您拥有时,您的用户会期望这种功能+.+=改变它的左手参数,因此应该是一个成员.在+对待它的参数对称,并因此应该是免费的功能.

这样的事情应该做:

//Beware, brain-compiled code ahead!
class MyClass {
public:
    MyClass& operator+=(const MyClass &rhs) const
    {
      // code for adding MyClass to MyClass
      return *this;
    }
    MyClass& operator+=(int rhs) const
    {
      // code for adding int to MyClass
      return *this;
    }
};


inline MyClass operator+(MyClass lhs, const MyClass& rhs) {
  lhs += rhs;
  return lhs;
}
inline MyClass operator+(MyClass lhs, int rhs) {
  lhs += rhs;
  return lhs;
}
// maybe you need this one, too
inline MyClass operator+(int lhs, const MyClass& rhs) {
  return rhs + lhs; // addition should be commutative
}
Run Code Online (Sandbox Code Playgroud)

(请注意,使用其类定义定义的成员函数是隐式的inline.另请注意,在其中MyClass,前缀MyClass::不需要甚至是错误的.)