第四章类和函数:设计与声明
条款18: 争取使类的接口完整并且最小
原因:“第一,接口中函数越多,以后的潜在用户就越难理解。”,“难以维护”,“导致长的头文件”。
条款19: 分清成员函数,非成员函数和友元函数
原因:与常规类的操作函数保持一致。
条款20: 避免public接口出现数据成员
原因:“一致性”“功能分离”。效率可能存在区别,测试代码如下:
#include <iostream>
#include <time.h>
struct A
{
private:
int i;
public:
int Geti(){return i;}
A():i(0x7FFFFF){}
~A(){}
};
struct B
{
public:
int i;
B():i(0x7FFFFF){}
~B(){}
};
int main(void)
{
A a; B b; int i = 0; time_t tStart, tEnd;
tStart = clock();
for(i = 0; i < a.Geti(); ++i);
tEnd = clock();
printf("A.Geti():%d/n", tEnd - tStart);
tStart = clock();
for(i = 0; i < b.i; ++i);
tEnd = clock();
printf("B.i:%d/n", tEnd - tStart);
return 0;
}
条款21: 尽可能使用const
条款21: 尽可能使用const
原因:编译器进行访问控制,提高安全性。“const char * const p = "hello";// const指针,const数据。画一条垂直线穿过指针声明中的星号(*)位置,如果const出现在线的左边,指针指向的数据为常量;如果const出现在线的右边,指针本身为常量;如果const在线的两边都出现,二者都是常量。”
条款22: 尽量用“传引用”而不用“传值”
条款22: 尽量用“传引用”而不用“传值”
原因:避免不必要的构造、拷贝、析构损耗。“ 通过引用来传递参数还有另外一个优点:它避免了所谓的“切割问题(slicing problem)”。当一个派生类的对象作为基类对象被传递时,它(派生类对象)的作为派生类所具有的行为特性会被“切割”掉,从而变成了一个简单的基类对象。”
条款23: 必须返回一个对象时不要试图返回一个引用
原因:“尽可能地让事情简单,但不要过于简单。”。安全性问题。
条款24: 在函数重载和设定参数缺省值间慎重选择
原因:二义性。安全性。
条款25: 避免对指针和数字类型重载
原因:二义性。安全性。
条款26: 当心潜在的二义性
原因:安全性。
条款27: 如果不想使用隐式生成的函数就要显式地禁止它
原因:赋值运算符属于那种与众不同的成员函数,当你没有去写这个函数时,C++会帮你写一个(见条款45)。构造、析构函数也会有默认函数。避免误用了默认函数,将代码控制权握在自己手里。
条款28: 划分全局名字空间
原因:避免名字冲突。