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)
将rhs
m_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
你担心这是对的,你在这里回复一个临时的引用:
Coordinate& operator+ (const Coordinate& lhs, const Coordinate& rhs) {
return Coordinate(lhs) += rhs;
}
Run Code Online (Sandbox Code Playgroud)
您需要返回一个Coordinate
by值,例如:
Coordinate operator+ (Coordinate lhs, const Coordinate& rhs) {
return lhs += rhs;
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我们复制第一个参数而不是引用,然后在函数体中复制.然后我们+=
按值返回结果.
使用此设置,无需声明operator+
为好友.
有关详细信息,请参阅此SO链接,感谢@Blastfurnace指出.