标签:style class blog code ext color
(一)
一定要避免传递一些references去指向其实并不存在的对象。
看下面这个类:
class Rational {
public:
Rational(int numerator = 0, int denominator = 1);
private:
int n, d;
friend const Rational operator*(const Rational& lhs, const Rational& rhs);
};这个函数不能返回引用,
(二)在stack中分配local对象:
const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
Rational result(lhs.n * rhs.n, lhs.d * rhs.d); //警告!糟糕的代码!
return result;
}这是错误的!(三)在heap中分配对象:
const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
Rational* result = new Rational(lhs.n * rhs.n, lhs.d * rhs.d); //更糟的代码!
return *result;
}这是错误的!谁该对着被你new出来的对象实施delete?没有合理的办法让他们取到operator*返回的reference背后隐藏的那个指针。这绝对导致资源泄漏。
(四)
让operator*返回reference指向一个被定义于函数内部的static Rational对象”
const Rational& operator*(const Rational& lhs, const Rational& rhs) {
static Rational result; //又是一堆烂代码。
result = ...; //lhs*rhs
return result;
}当用户写下如下代码时:
bool operator=(const Rational& lhs, const Rational& rhs);
Rational a, b, c, d;
if ((a*b) == (c*d)){
...
}else{
...
}表达式if ((a*b) == (c*d))总是被核算为true, 不论a,b, c,d是什么。因为虽然两次调用operator*都改变了static
Rational对象的值, 但是返回的reference, 调用端看到的永远是static Rational的现值。(六)一个“必须返回新对象”的函数的正确写法:就让那个函数返回一个新对象。
inline const Rational operator*(const Rationa& lhs, const Rational& rhs){
return Rational(lhs.n * rhs.n, lhs.d * rhs.d);
}
Effective C++:条款21:必须返回对象时别妄想返回其reference,布布扣,bubuko.com
Effective C++:条款21:必须返回对象时别妄想返回其reference
标签:style class blog code ext color
原文地址:http://blog.csdn.net/u010470972/article/details/31013657