Effective C++ 条款21必须返回对象时,别妄想返回其reference

1. 虽然一般情况下传参使用const-by-reference-to-const比较好,但返回值有时必须是对象而不是引用:

当reference绑定到函数内创建的局部对象时,函数调用结束后引用绑定在一个不存在的对象;

当reference绑定到堆内存对象时,函数调用后比较容易忽略内存释放,特别对于以下表达式:w=x*y*z.如果operator*返回指向堆内存的引用,那没内存泄露是必然的;

当reference绑定到函数内部创建的static对象时,对于以下表达式if(a*b==c*d)由于返回的引用总是指向同一个static对象,因而判断条件总为真;

2. 综上,函数返回一个引用大多时候是不可行的,即使对象的构造和析构需要成本也必须返回对象(有些时候便一起的优化会避免这一行为).

时间: 2024-10-06 15:42:10

Effective C++ 条款21必须返回对象时,别妄想返回其reference的相关文章

Effective C++:条款21:必须返回对象时别妄想返回其reference

(一) 一定要避免传递一些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对

Item 21:需要返回对象时,不要返回引用 Effective C++笔记

Item 21: Don't try to return a reference when you must return an object Item 20中提到,多数情况下传引用比传值更好.追求这一点是好的,但千万别返回空的引用或指针. 一个典型的场景如下: class Rational{ int n, d; public: Raitonal(int numerator=0, int denominator=1); }; // 返回值为什么是const请参考Item 3 friend con

effective c++ 条款12:复制对象时勿忘其每一个成分

记住:拷贝函数应该确保复制"对象内的所有成员变量"及"所有父类成分".不要尝试以某个拷贝函数实现另一个拷贝函数.应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用. 下面是一个类实现了自己的拷贝函数,一起正常. void logCall(const string& funcName): class Customer { public: ... Customer(const Customer& rhs); Customer& operat

条款21:必须返回对象时,别妄想返回其reference

条款21:必须返回对象时,别妄想返回其reference 引用只是对象的一种别名当使用引用的时候,请确认他的另一个身份在哪? class Rational { public: Rational(int x, int y) : m_x(x), m_y(y){} //返回const是属于类型保护,friend修饰,以后条款详说 friend const Rational operator + (const Rational &lhs, const Rational &rhs) { Ration

Effective C++:条款12:复制对象时勿忘其每一个成分

(一) 一个继承体系的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransaction; }; class PriorityCustomer : public Customer { public: PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator=(const Priori

条款23: 必须返回一个对象时不要试图返回一个引用

class rational { public: rational(int numerator = 0, int denominator = 1); ... private: int n, d; // 分子和分母 friend const rational // 参见条款21:为什么 operator*(const rational& lhs, // 返回值是const const rational& rhs) }; inline const rational operator*(cons

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

条款12:复制对象时请勿忘每一个成分

条款12:复制对象时请勿忘每一个成分 当为一个类实现自己的构造函数,相关赋值函数,析构函数,则必须有责任对类中的每一个成员进行初始化.赋值.释放.因此:如果为一个类添加一个成员,就必须同时相应修改上面几类函数. 看一个简单的类 class Terminal { Terminal(const int termid) : m_termId(termid) {} ~Terminal() {} Terminal(const Terminal & terminal) { this->m_termId

Effective C++ 条款21

必须返回对象时,别妄想返回其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 R