11.1 使用const 提高函数的健壮性
看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的
魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。
11.1.1 用const 修饰函数的参数
如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。
const 只能修饰输入参数:
1.如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。
例如StringCopy 函数:
void StringCopy(char *strDestination, const char *strSource);
其中strSource 是输入参数,strDestination 是输出参数。给strSource 加上const
修饰后,如果函数体内的语句试图改动strSource 的内容,编译器将指出错误。
2.如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const 修饰。
例如不要将函数void Func1(int x) 写成void Func1(const int x)。同理不要将
函数void Func2(A a) 写成void Func2(const A a)。其中A 为用户自定义的数据类型。
3.对于非内部数据类型的参数而言,象void Func(A a) 这样声明的函数注定效率比较低。
因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。
11.1.2 用const 修饰函数的返回值
11.1.3 const 成员函数
11.2 提高程序的效率
【规则11-2-1】不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、
可读性等质量因素的前提下,设法提高程序的效率。
【规则11-2-2】以提高程序的全局效率为主,提高局部效率为辅。