给出以下代码片段,
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;
}
我想知道如何正确地重载operator+=
。
问题:
如何定义此运算符的签名?特别是,什么应该用于返回值?
如何实现功能体?
如何使用此重载运算符?
我已经提供了上述解决方案,但我担心这是不正确的。
答案 0 :(得分:30)
通过引用返回会更好
Num& operator+=(const Num& rhs){
this->m_iNumber += rhs.m_iNumber;
return *this;
}
答案 1 :(得分:7)
如果您关注this Wikibook,您将通过示例找到这些答案:
Type& operator+=(const Type& right)
是正确的签名。注意作为一个附加点(你做对了),复合赋值运算符必须是成员函数。
答案 2 :(得分:4)
任何赋值运算符的签名(operator =或operator @ =为您最喜欢的运算符@)应为
Class& operator @= (const Class& rhs);
也就是说,该函数通过const引用获取其参数(因为它不会修改它),然后返回对该对象的可变引用。返回非const引用的原因是,由于历史原因,您可以编写如下代码:
(a += b) += c;
这绝不是好的风格,但它适用于整数,所以你应该努力使它适合你的类型。
至于你的功能,你所拥有的是完全正确的。但是,一般情况下,即使参数是接收器对象,也应确保代码正常工作。例如,如果您编写类似
的内容a += a;
这会被翻译成
a.operator+= (a);
因此代码将在参数和接收器都是同一对象的情况下运行。这通常不适用于复合赋值运算符(通常只有operator=
需要担心这一点),但在某些情况下,如果你不小心,你可能会被烧掉。
最后,您可以像使用上面的示例代码一样使用此operator +=
函数。使用+=
会自动调用它。
希望这有帮助!
答案 3 :(得分:3)
您的示例完全正确:http://codepad.org/PVhQw9sc。
int
匹配,则需要返回Num&
类型,并返回值*this
。答案 4 :(得分:2)
像你一样写下身体。像你一样使用运算符。操作员应返回允许链接的引用。
请参阅here。
答案 5 :(得分:0)
您的操作员功能也可以写为
Num& operator += (const Num& rhs)
{
m_iNumber += rhs.m_iNumber;
return m_iNumber;
}
在成员函数中, *this->m_iNumber
和m_iNumber
本身是相同的,并且在我看来,使用以前的格式更加打字。