我将其作为个人练习进行,并希望确保我正确理解并正确理解了这一点。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。声根根根的基础上的。我有一个带有成员行和列的坐标课。我想重载+和+ =运算符。这是我的代码:

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指出了这一点。

10-04 16:42