18、让接口容易被正确使用,不易被误用
(1)设计接口时要考虑客户可能可能做出的错误输入,如参数的形式等。
19、设计class犹如设计type
(1)对象如何被创建和销毁;对象的初始化和赋值的差别;如果被pass by value使用意味着什么;合法值;继承图系;转换;操作符和函数的类型;什么标准函数设置为私有;什么是未声明接口;有多么一般化;真的需要不需要新类型。
20、宁以pass-by-reference-to-const替换pass-by-value
(1)这样做更加高效,且能避免切割问题。
(2)不适用于内置类型、stl迭代器和函数对象,此时pass-by-value效率更高。
21、必须返回对象时,别妄想返回其reference
(1)绝不要返回指针或者引用指向一个局部存放在栈上的对象,或者返回引用指向一个队分配的对象,或者返回一个指针或者引用指向局部静态变量而有可能同时需要多个这样的对象(reference永远看到的是静态量的现值)。
22、将成员变量声明为private
(1)protected 就和public一样缺乏封装性,此时如果成员变量被改变,都会有不可预知的大量代码收到破坏。切忌将成员变量声明为private。
23、宁以non-member、non-friend替换member函数
(1)namespace和class不同,前者可以跨越多个源码文件(在多文件中分段声明)而后者必须整体定义,不能被分割为片片段段。
(2)此种替换方法可以增加封装性、包裹弹性和机能扩充性。封装性越高,越少的人可见,就用于越大的弹性去改变,也具有较低的编译相依度,增加可延展性。当多种函数都提供相同功能时,采用此规则。
24、若所有参数皆需类型转换,请为此采用non-member函数
(1)只有当参数列于参数列内,这个参数才是进行隐式类型转换的合格参与者;而被调用之成员函数所隶属的对象——this对象,不是隐式类型转换的合格参与者,所以此时要采用non-member函数使两者都处于参数位置。
25、考虑写成一个不抛出异常的swap函数
(1)通常不允许改变std命名空间中的任何东西,但可以全特化std内的templates,但不可与添加新的templates。
(2)如果提供一个member swap,也该提供一个non-member swap来调用前者。对于class,也请特化std::swap。
(3)调用swap时应针对std::swap使用using声明式进行曝光,然后调用swap并且不带任何“命名空间资格修饰”。此时编译器首先找专属swap,如果没有就调用std内的swap。