设计与声明
条款18:让接口容易被正确使用,不易被误用
条款19:设计class犹如设计type
条款20:宁以pass-by-value-to-const替换pass-by-value
缺省情况下C++以by value方法给对象传递参数,函数参数都是对象的副本,这些副本是由对象的copy构造函数产出,这可能使得函数调用操作更加费时(一次copy构造函数的调用,函数结束时一次析构函数的调用)。
可以将函数声明为下面的形式,这样将不会有任何额外的构造函数和析构函数的调用:
void func (const Student& student)
参数声明中的const是重要的,可以让调用者知道函数内不会对student做出任何修改。
这种方法还可以避免参数作为其父类传入函数后,函数内仅仅留下父类对象的情况。
这个规则并不适用于内置类型、STL的迭代器以及函数对象。
条款21:必须返回对象时,别妄想返回其reference
任何函数返回一个reference指向某个local对象结果都将是错误的,因为local对象在函数结束后就会被销毁。
条款22:将成员变量声明为private
条款23:宁以non-member、non-friend替换member函数
non-member、non-friend函数能提供比member函数更高的封装性。
封装的好处在于我们能改变事物而只影响有限的客户。可以粗略的说,越多函数可以访问到一个类,这个类的封装性越差。
通常的做法是让non-member函数跟相对应的类放到同一命名空间下:
namespace WebBrowserStuff { class WebBrowser { ... }; void clearBrowser() { ... }; ... }
条款24:若所有参数皆需类型转换,请为此采用non-member函数
条款25:考虑写出一个不抛异常的swap函数