在运算符重载期间始终编写自己的复制构造函数是否安全?
Complex Complex::operator+(const Complex& other)
{
Complex local ;
local.result_real = real + other.real;
local.result_imaginary = imag + other.imag;
return local ;
}
我大部分时间都看过上面的格式,而不是将其作为参考。
我们可以像拇指一样吗 1-始终通过引用传递函数参数。 2-始终通过引用返回对象。
在运算符重载中是否有任何特殊情况我们必须仅按值返回对象?
答案 0 :(得分:1)
我们可以采用拇指规则,例如1-始终通过引用传递函数参数。 2-始终通过引用返回对象。
不,不是真的。即使您找到了返回非悬空引用的方法,添加操作也不应返回引用,因为这没有意义。 a+b
应该返回一个新对象,而对于a+=b
,返回对LHS的引用是有意义的。
关于通过引用传递论据,也没有经验法则。考虑一下:
A operator+(const A& lhs, const A& rhs)
{
A tmp = lhs; // explicitly make a copy
return tmp += rhs;
}
和此:
A operator+(A lhs, const A& rhs)
{
return lhs += rhs;
}
第二个版本按值传递一个参数,从而使代码更简单,并为编译器提供更多机会来删除临时副本。
答案 1 :(得分:0)
对于某些操作符,您应该返回一个引用,对于其他不应该返回的引用,还有一些操作符完全返回其他类型(如比较运算符)。
在你的情况下,你不应该。特别是因为您将返回对 local 变量的引用,该变量在函数返回时无效。