我将其作为个人练习进行,并希望确保我正确理解并正确理解了这一点。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。声根根根的基础上的。我有一个带有成员行和列的坐标课。我想重载+和+ =运算符。这是我的代码:
Coordinate& Coordinate :: operator+= (const Coordinate& rhs){
this->m_Row += rhs.m_Row;
this->m_Column += rhs.m_Column;
return *this;
}
Coordinate& operator+ (const Coordinate& lhs, const Coordinate& rhs) {
return Coordinate(lhs) += rhs;
}
在哪里
friend Coordinate& operator + (const Coordinate& lhs, const Coordinate& rhs);
是在Coordinate类中定义的 friend 函数。
这段代码有什么陷阱吗?
这是我对这些工作原理的理解:
operator +=
将
rhs
m_Row和m_Column添加到this
成员。返回reference to the object pointed by this pointer
,从而避免由于复制构造函数而创建另一个对象。operator +
使用复制构造函数(让我们将其称为
lhs
)创建一个lhs
的本地对象(因为localObj
是一个常量,我们不想修改其内容)。在执行添加操作的+=
上调用localObj
成员运算符。返回一个reference to this localObj
,这样我们就不会由于复制构造函数而创建另一个对象,否则。现在,最后一条语句与我有关,因为我正在返回对本地对象的引用。一旦函数(operator +)超出范围,
localObj
将被销毁,并且返回的引用将指向已被销毁的对象。我理解这个正确吗?如果是这样,我应该如何解决?
编辑:
在所有答案和我学到的知识之后:这是我的Coordinate类现在的样子:http://rextester.com/MJJI7394
最佳答案
您不必担心,这里返回的是对临时目录的引用:
Coordinate& operator+ (const Coordinate& lhs, const Coordinate& rhs) {
return Coordinate(lhs) += rhs;
}
您需要按值返回
Coordinate
,例如:Coordinate operator+ (Coordinate lhs, const Coordinate& rhs) {
return lhs += rhs;
}
在上面的示例中,我们复制了第一个参数,而不是获取引用,然后将其复制到函数主体中。然后,我们按值返回
+=
的结果。使用此设置,无需将
operator+
声明为 friend 。有关更多信息,请参见this SO link,并感谢@Blastfurnace指出了这一点。