给出以下代码片段,
class Num
{
public:
Num(int iNumber = 0) : m_iNumber(iNumber) {}
Num operator+=(const Num& rhs)
{
this->m_iNumber = (this->m_iNumber + rhs.m_iNumber);
return *this;
}
private:
int m_iNumber;
};
//===========================================================
int _tmain(int argc, _TCHAR* argv[])
{
Num a(10);
Num b(100);
b += a;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何正确超载operator+=.
问题:
如何定义此运算符的签名?特别是,什么应该用于返回值?
如何实现功能体?
如何使用这个重载运算符?
我已经提供了上述解决方案,但我担心这是不正确的.
Pra*_*rav 36
通过引用返回会更好
Num& operator+=(const Num& rhs){
this->m_iNumber += rhs.m_iNumber;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
如果您关注这个Wikibook,您将通过示例找到这些答案:
Type& operator+=(const Type& right) 是正确的签名.注意作为一个附加点(你做得对),复合赋值运算符必须是成员函数.
任何赋值运算符(operator= 或 operator @= 代表您最喜欢的运算符 @)的签名应该是
Class& operator @= (const Class& rhs);
Run Code Online (Sandbox Code Playgroud)
也就是说,该函数通过 const 引用获取其参数(因为它不会修改它),然后返回对该对象的可变引用。您返回非常量引用的原因是,由于历史原因,您可以编写如下代码:
(a += b) += c;
Run Code Online (Sandbox Code Playgroud)
这绝不是好的风格,但它适用于整数,因此您应该努力使其也适用于您的类型。
至于你的函数体,你有什么是完全正确的。但是,一般而言,即使参数是接收器对象,您也应该确保代码有效。例如,如果你写这样的东西
a += a;
Run Code Online (Sandbox Code Playgroud)
这被翻译成
a.operator+= (a);
Run Code Online (Sandbox Code Playgroud)
因此,代码将在参数和接收器都是同一个对象的情况下进行操作。这对于复合赋值运算符通常不会出现(通常只operator=需要担心这一点),但在某些情况下,如果您不小心,您可能会被烧毁。
最后,您可以operator +=像在上面的示例代码中一样使用此函数。任何使用+=自动调用它。
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
69907 次 |
| 最近记录: |