/*条款21:必须返回对象时,别妄想返回其引用*/
#include<iostream>
using namespace std;
class Rational{
public:
Rational(int numerator = 0, int denominator = 1):n(numerator),d(denominator){
}
private:
int n, d;
friend const Rational&operator*(const Rational&lhs, const Rational&rhs);
};
const Rational&operator*(const Rational&lhs, const Rational&rhs){
//错误范例1-----------------------
/*Rational result(lhs.n*rhs.n, lhs.d*rhs.d);
return result;*///返回了已经销毁的对象的引用
//错误范例2------------------
/*Rational *result = new Rational(lhs.n*rhs.n, lhs.d*rhs.d);
这种情况无法阻止 Rational w,x,y,z;
w = x*y*z;(与operator*(operator*(x,y),z)相同
因为没有合理方法取得operator*返回的引用背后隐藏的那个指针 导致内存泄漏*/
//错误范例3------------------
/*static Rational result;
result.n = lhs.n*rhs.n;
result.d = lhs.d*rhs.d;
return result;
缺点:1线程安全
2 bool operator==(const Rational&lhs,const Rational&rhs);
if((a*b)==(c*d)){
....
}else {
.....
}
这里无论 a,b,c,d是什么 都永远相等 因为相乘返回同一个对象
*/
//正确写法
return Rational(lhs.n*rhs.n, lhs.d*rhs.d);//这里需要承受返回值借来的构造与析构成本 本函数可以声明为inline
}
int main(){
Rational a(1, 2);
Rational b(3, 5);
Rational c = a*b;
system("pause");
return 0;
}
条款21:必须返回对象时,别妄想返回其引用
最新推荐文章于 2023-11-28 23:34:19 发布