gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:14 25 4
gpt4 key购买 nike

假设我有一个非常简单的类

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

并且我想重载运算符 += 这样

C foo(8, 42);
C bar(1, 1);
C zoo(9, 43);
foo += bar;
assert(foo == zoo);

运行良好。

据我读过别人的代码,我应该写这样的东西

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

但据我所知,returning something 是没有用的。事实上,即使我将 += 重载为

,上面的断言也不会失败
void operator+= (C c) {
this->_a += c.a();
this->_b += c.b();
}

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

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

最佳答案

+= 的预期行为是它评估为自己的第一个操作数( x 中的 x += y ),作为随后可以分配给的值。这是如何+=适用于内置类型,一般来说,自定义运算符的行为应该与内置运算符一样,除非您有特定的原因(例如 I/O 的 operator<<operator>>)。

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

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

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

if ((foo += bar) == zoo) { ... }

(foo += bar) += baz;

这对于内置类型是可能的,并且有时(尽管不可否认并不经常)实际上很有用。

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

关于c++ - 为什么重载 += 永远不会在其他人的代码中返回任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32692462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com