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+=,而不是结果,这就是为什么你没有注意到基于返回类型的任何可能的差异.
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |