参考effective c++ 条款21。
class Rational{
public:
Rational(int number = 0, int denominator =1); // 这里为什么不用explict
private:
int n, d;
const Rational operator* (const Rational& lhs, const Rational* rhs);
}
然后计算为:
Rational a(1, 2);
Rational b(3, 5);
Rational c = a * b;
如果operator以 reference 返回
const Rational& operator* (const Rational& lhs, const Rational& rhs)
{
Rational result(lhs.n * rhs.n, lhs.d * rhs.d); // 糟糕的代码!!!
return result;
/*
这个函数返回一个reference 指向result,但result是个local对象,而local对象在函数退出前就被摧毁了。
*/
}
如果operator以pointer 返回
const Rational& operator* (const Rational& lhs, const Rational& rhs)
{
Rational* result = new Rational(lhs.n * rhs.n, lhs.d * lhs.d); // 更糟糕的写法
return *result;
/*
如果Rational w, x, y, z;
w = x * y * z;
这里,同一个语句内调用了两次operator* ,因而两次使用new, 也就是需要两次delete。
但却没有合理的办法让他们取得operator* 返回的reference背后隐藏的那个指针。这样做绝对会内存泄漏!!!
*/
}
如果让operator* 返回一个reference指向一个被定义于函数内部的static Rational对象:
const Rational& operator* (const Rational& lhs, const Rational& rhs)
{
static Rational result; // 又是很糟糕的代码,static对象,此函数将返回其reference。
result = .....;
return result;
}
一个”必须返回新对象”的函数正确用法:
inline const Rational operator* (const Rational& lhs, const Rational& rhs)
{
return Ration(lhs.n * rhs.n, lhs.d * rhs.d);
}