目录
一、使用const提高函数的健壮性
看到const关键字,C++程序员首先想到的可能是const常量。这可不是良好的条件反射。如果只知道用const定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。
1、用const修饰函数的参数
const只能修饰输入参数:
● 如果输入参数采用“指针传递”,那么加const修饰可以防止意外地改动该指针,起到保护作用。
● 如果输入参数采用“值传递”,由于函数将自动产生临时变量用于复制该参数,该输入参数本来就无需保护,所以不要加const修饰。
“const &"修饰输入参数的用法总结一下:
内部数据类型就是编译器可以识别的,不需要用户定义。 非内部数据类型就是编译器不认识的,需要用户定义才可以识别。 比如int就是内部数据类型,class A{...};A就是非内部数据类型内部数据作为函数的输入参数就是内部数据类型的输入参数,非内部数据作为函数的输入参数就是非内部数据类型的输入参数。
2、用const修饰函数的返回值
● 如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
● 如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。
● 函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
3、const成员函数
任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
二、提高程序的效率
[规则11-2-1] 不要一味地追求程序的效率,应当在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率。
[规则11-2-2] 以提高程序的全局效率为主,提高局部效率为辅。
[规则11-2-3] 在优化程序的效率时,应当先找出限制效率的“瓶颈”,不要在无关紧要之处优化。
[规则11-2-4] 先优化数据结构和算法,再优化执行代码。
[规则11-2-5] 有时候时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折中。例如多花费一些内存来提高性能。
[规则11-2-6] 不要追求紧凑的代码,因为紧凑的代码并不能产生高效的机器码。
三、一些有益的建议
[建议11-3-1] 当心那些视觉上不易分辨的操作符发生书写错误。我们经常会把“==”误写成“=”,像“||”、“&&”、“<=”、 “>=”这类符号也很容易发生“丢1”失误。然而编译器却不一定能自动指出这类错误。
[建议11-3-2] 变量(指针、数组)被创建之后应当及时把它们初始化,以防止把未被初始化的变量当成右值使用。
[建议11-3-3] 当心变量的初值、缺省值错误,或者精度不够。
[建议11-3-4] 当心数据类型转换发生错误。尽量使用显式的数据类型转换(让人们知道发生了什么事),避免让编译器轻悄悄地进行隐式的数据类型转换。
[建议11-3-5] 当心变量发生,上溢或下溢,数组的下标越界。
[建议11-3-6] 当心忘记编写错误处理程序,当心错误处理程序本身有误。
[建议11-3-7] 当心文件I/O有错误。
[建议11-3-8] 避免编写技巧性很高代码。
[建议11-3-9] 不要设计面面俱到、非常灵活的数据结构。
[建议11-3-10] 如果原有的代码质量比较好,尽量复用它。但是不要修补很差劲的代码,应当重新编写。
[建议11-3-11] 尽量使用标准库函数,不要“发明”已经存在的库函数。
[建议11-3-12] 尽量不要使用与具体硬件或软件环境关系密切的变量。
[建议11-3-13] 把编译器的选择项设置为最严格状态。
[建议11-3-14] 如果可能的话,使用PC-Lint、LogiScope 等工具进行代码审查。