c ++中的overload +和+ =运算符

bra*_*ter 3 c++ reference operator-overloading return-by-reference

我这样做是为了个人练习,并希望确保我做对了并正确理解它.我有一个带成员行和列的坐标类.我想重载+和+ =运算符.这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

哪里

friend Coordinate& operator + (const Coordinate& lhs, const Coordinate& rhs);
Run Code Online (Sandbox Code Playgroud)

是Coordinate类中定义的友元函数.

这段代码有什么缺陷吗?

以下是我对这些工作原理的理解:

operator += 
Run Code Online (Sandbox Code Playgroud)

rhsm_Row和m_Column 添加到this成员.返回a reference to the object pointed by this pointer,从而避免由于复制构造函数而创建另一个对象.

operator +
Run Code Online (Sandbox Code Playgroud)

使用复制构造函数创建一个本地对象lhs(因为它lhs是一个常量,我们不想修改它的内容)(让我们调用它localObj).调用执行添加的+=成员运算符localObj.返回a,reference to this localObj以便我们不会因复制构造函数而创建另一个对象,否则.

现在,最后一个语句关注我,因为我正在返回对本地对象的引用.一旦函数(运算符+)超出范围,localObj将被销毁并返回引用将指向已被销毁的对象.我理解这个是正确的吗?

如果是这样,我该如何解决?

编辑: 在所有答案和我学到的东西之后:这是我的Coordinate课程现在的样子:http://rextester.com/MJJI7394

jua*_*nza 6

你担心这是对的,你在这里回复一个临时的引用:

Coordinate& operator+ (const Coordinate& lhs, const Coordinate& rhs) {
    return Coordinate(lhs) += rhs;
}
Run Code Online (Sandbox Code Playgroud)

您需要返回一个Coordinateby值,例如:

Coordinate operator+ (Coordinate lhs, const Coordinate& rhs) {
    return lhs += rhs;
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我们复制第一个参数而不是引用,然后在函数体中复制.然后我们+=按值返回结果.

使用此设置,无需声明operator+为好友.

有关详细信息,请参阅此SO链接,感谢@Blastfurnace指出.

  • @brainydexter是的,没有.允许编译器执行[copy elision](http://en.wikipedia.org/wiki/Copy_elision),特别是*返回值优化*.为什么不通过引用传递`lhs`?因为我们无法对其进行修改,并且我们最终可能最终会创建一个副本,因此通过值传递可以让编译器执行比通过引用传递更多的复制精度. (2认同)