码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++ 条款21

时间:2015-06-26 11:04:44      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

必须返回对象时,别妄想返回其reference

我们上节分析了对象引用传递的好处,现在说明函数返回引用对象带来的种种坏处。
先来一段代码:

class Rational{
public:
    Rational(int numerator=0, int denominator=1);
    ……
private:
    int n, d;
    friend
    const Rational operator*(const Rational& lhs,
                             const Rational& rhs);
};

const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
    Rational result(lhs.n* rhs.n, lhs.d* rhs.d);
    return result;
}


Rational a(1,2),b(3,4);
Rational &r=a*b;

大家看看以上代码有没有问题,很显然此时的r是返回值的引用。很明显对象本体已在operator*函数范围外被销毁,此时的r指向的对象已经被系统回收,程序很容易出现错误。

那么,如果在函数体内动态创建对象呢?
如下代码:

const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
    Rational* result=new Rational(lhs.n* rhs.n, lhs.d* rhs.d);
    return *result;
}

Rational w,x,y,z;
w=x*y*z;

上面代码有什么问题?
很显然造成了内存泄露,两次调用 operator*函数,创建两个动态内存对象,但是最后却没有delete。

如果创建static 对象呢?

const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
    static Rational result;
    result=……;
    return result;
}

bool operator==(const Rational& lhs, const Rational& rhs);
Rational a, b, c, d;
……
if((a*b)==(c*d))
{
    doSomething();
}
else
{
    doOtherthing();
}

上面代码有什么问题?
答案是上面代码中(a*b)==(c*d)的值一直为真。这是static的特性!所以,operator*的函数设计不合理,导致operator==出错。

说到现在总结一下。
很简单就想题目所说函数必须返回对象时,别妄想返回其reference。那返回什么?很明显返回对象的值而不是引用。

Effective C++ 条款21

标签:

原文地址:http://blog.csdn.net/u011058765/article/details/46646545

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!