我正在进行个人练习,并希望确保我的理解是正确的。我有一个包含行和列成员的坐标类。我想要重载+和+=运算符。以下是我的代码:
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类中定义的友元函数。
这段代码有什么注意事项吗?
以下是我对它们工作原理的理解:
operator +=
将
rhs
的 m_Row 和 m_Column 添加到 this
成员中。返回一个指向此指针指向的对象的引用,从而避免由于复制构造函数而创建另一个对象。operator +
创建一个名为
localObj
的本地对象,使用复制构造函数从lhs
中创建它(因为lhs
是一个常量,我们不想修改它的内容)。在localObj
上调用+=
成员运算符进行加法操作。返回对此localObj
的引用,以避免由于复制构造函数而创建另一个对象。
现在,最后一条语句让我担心,因为我正在返回对本地对象的引用。当函数(operator+)超出范围时,localObj
将被销毁,返回的引用将指向已被销毁的对象。我的理解正确吗?
如果是这样,我该如何修复它?
编辑: 在所有答案和我学到的东西之后:现在我的Coordinate类看起来像这样:http://rextester.com/MJJI7394
operator +
返回了本地对象的引用。 - Mr.Anubisoperator+
声明为友元,因为它只访问Coordinate
的公共接口。 - celtschk