条款20:以pass-by-reference-to-const替换pass-by-value
意思是:参数传递最好用传const引用代替普通的传值
为什么呢?
- 传引用可以直接将实参本体传递进函数,而不用调用各种构造函数以及析构函数(完成副本的创建及销毁);注意:效率的提高并不只是减少了一次副本对象的拷贝构造以及析构,副本内可能含有多个同样需要拷贝构造的对象也需要创建并销毁
- 传const引用可以告诉函数,以只读的形式对待实参
- 在形参是父类对象,实参是子类对象的时候,传值的方式会直接将实参进行对象切割,构造的副本完全的父类类型,该副本调用的成员方法和、使用的成员变量也完全是父类的
但是,对于内置类型、STL迭代器和函数对象,还是传值好一点
条款21:必须返回对象时,别妄想返回其reference
意思是:不要迷信传引用可以代替普通的传值方式
在条款20中说到:传引用的方式比传值高效。但是有些情况下,传值(比如返回一个新对象)相比于传引用(比如返回一个旧对象的引用)就很有必要
- 不要返回指向局部对象的指针或引用
- 不要返回一个建立在堆上的对象的引用(因为有可能无法delete)
条款22:将成员变量声明为private
假设有一个public成员变量和一个protected成员变量,但是最终取消了,那么:
- 所有使用该public成员变量的代码(不仅该class内、还包括class外的客户代码)都会被破坏
- 所有使用该protected成员变量的代码(不仅该class内、还包括所有使用它的子类代码)都会被破坏
这就导致需要程序员和客户都需要重新写代码,很恐怖
所以,将所有的成员变量声明为private,使用成员函数取控制、访问成员变量
条款23:宁以non-member、non-friend替换member函数
首先注意:能够访问private成员变量的函数只有class的成员函数加上友元函数
如果要在一个成员函数(可以访问private成员变量、也能调用private成员函数)和一个non-member non-friend函数之间做选择,很明显,后者更好地保护了class对内部成员的封装性,使用起来也更安全
|