为什么重载+ =永远不会在其他人的代码中返回任何内容?

Giu*_*inò 2 c++ operator-overloading

假设我有一个非常简单的课程

class C { 
    private:
        int _a; 
        int _b; 
    public:
        C (int a, int b) :_a { a }, _b { b } {}
        int a () { return _a; }
        int b () { return _b; }
        bool operator== (C c) {
            return this->_a == c.a() && this->_b == c.b();
        }
};
Run Code Online (Sandbox Code Playgroud)

我想重载操作+=,使得

C foo(8, 42);
C bar(1, 1); 
C zoo(9, 43);
foo += bar;
assert(foo == zoo);
Run Code Online (Sandbox Code Playgroud)

运行正常.

至于我读过其他人的代码,我应该写一些类似的东西

C operator+= (C c) {
    return { this->_a += c.a(), this->_b += c.b() };
}
Run Code Online (Sandbox Code Playgroud)

但根据我的理解,return某些东西是无用的.实际上,即使我超载+=,上面的断言也不会失败

void operator+= (C c) {
    this->_a += c.a();
    this->_b += c.b();
}
Run Code Online (Sandbox Code Playgroud)

要么

C operator+= (C c) {
    this->_a += c.a();
    this->_b += c.b();
    return C(0,0);
}
Run Code Online (Sandbox Code Playgroud)

TL; DR:为什么我不应该在重载时返回void+=

小智 5

预期的行为+=是它作为自己的第一个操作数(xin x += y)计算,作为随后可以赋值的值.这是怎样+=的工作原理内置类型,并且一般来说,运营商定制的行为应该像内置的运营商,除非你有特殊原因不能(如operator<<operator>>用于I/O).

这意味着实现应该如下所示:

C &operator+= (C c) {
    this->_a += c.a();
    this->_b += c.b();
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

这意味着用户可以编写如下代码

if ((foo += bar) == zoo) { ... }
Run Code Online (Sandbox Code Playgroud)

要么

(foo += bar) += baz;
Run Code Online (Sandbox Code Playgroud)

这些内置类型是可能的,并且有时(尽管不可否认)实际上是有用的.

你的断言说明了副作用operator+=,而不是结果,这就是为什么你没有注意到基于返回类型的任何可能的差异.