在重载时返回运算符类型+ =

时间:2016-03-26 05:58:46

标签: c++ c++11 operator-overloading

我在互联网上浏览了一些运算符重载的示例,其中operator+=的返回类型为T&。由于我们无法像+=那样链T a = b = c;,因此可以将返回类型声明为void。使用void时,一切似乎都正常。有什么情况我们必须避免吗?

例如:

class MyInteger{
    private:
        int x;
    public:
        MyInteger(const int& a):x(a){}
        void operator+=(const MyInteger& rhs){
            x += rhs.x;
        }
};

MyInteger a(10);
a += a;  //No need to return anything because we can't chain
a = a + (a += a);

2 个答案:

答案 0 :(得分:3)

正如@Ant已经指出的那样,可以被链接,但它并不是唯一的考虑因素。考虑

cout << (a += b);
例如,如果没有回报,这将无法运作。

算术运算符本身只不过是一种人类约定。从技术上讲,你甚至可以+=-= - 它将构建并可能为你运行(只要你遵循新的私人约定)。在C ++中,您应该遵循该语言的约定:代码的客户端将期望+=自我增量,并且

cout << (a += b);

将打印出结果。

答案 1 :(得分:3)

您希望operator +=返回对当前对象的引用的另一个原因是您希望重载operator +。由于您正在编写一个整数类,如果+=可用,则没有多大意义,但+不可用。

以下是operator +的样子:

MyInteger MyInteger::operator+(const MyInteger& rhs)
{
   MyInteger temp(*this);
   return temp += rhs;  // <-- Uses operator +=
}

如果operator +=未返回引用,则上述操作无效(甚至无法编译)。