高质量C/C++编程指南--读书笔记五 5、6章

第五章  常量
 
一、知识点
1、const与#define的比较:(P33)
(1)、const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
(2)、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
 
2、类中的const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。不能再类声明中初始化const数据成员。const数据成员的初始化只能在类构造函数的初始化表中进行。建立在整个类中都恒定的常量,可以使用类中的枚举常量来实现。枚举常量不会占用对象的存储空间,它们在编译时被全部求值。(P34)
 
 
第六章  函数设计
 
一、知识点
1、参数的书写规则:(P36)
(1)、如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
(2)、如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率。 
 
2、返回值书写规则:C语言汇总,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处,却容易被误解为 void 类型。(P37) 
 
3、在正常情况下,getchar 的确返回单个字符。但如果 getchar 碰到文件结束标志或发生读错误,它必须返回一个标志 EOF。为了区别于正常的字符,只好将 EOF 定义为负数(通常为负 1) 。因此函数 getchar 就成了 int 类型。 (P38)
 
4、函数内部实现的规则:(P39)
(1)、在函数体的“入口处”,对参数的有效性进行检查。很多程序错误是由非法参数引起的,我们应该充分理解并正确使用“断言”(assert)来防止此类错误
(2)、在函数体的“出口处” ,对 return 语句的正确性和效率进行检查。注意事项如下:
a、return 语句不可返回指向“栈内存”的“指针”或者“引用” ,因为该内存在函数体结束时被自动销毁。
b、如果函数返回值是一个对象,要考虑 return 语句的效率。例如:
    return String(s1 + s2);
这是临时对象的语法,表示“创建一个临时对象并返回它” 。不要以为它与“先创建一个局部对象 temp 并返回它的结果”是等价的,如
String temp(s1 + s2);
return temp;
实质不然,上述代码将发生三件事。首先,temp 对象被创建,同时完成初始化;然后拷贝构造函数把 temp 拷贝到保存返回值的外部存储单元中;最后,temp 在函数结束时被销毁(调用析构函数) 。然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。 
 
5、断言assert是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。如果assert的参数为假,那么程序就会终止。例如:(P41)
 

6、使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在并且是一定要做出处理的。在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了假定,就要使用断言对假定进行检查。(P42)
 
7、引用可以看作是对象的别名。将b声明为a的引用不需要为b另外开辟内存单元。b和a在内存中是同一个存储单元,它们具有同一个地址。引用的一些规则如下:(P42)
(1)、引用被创建的同时必须被初始化(指针则可以在任何时候被初始化);
(2)、不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
(3)、一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
引用和指针的区别还包括测试时的区别,由于引用不会指向空值,这意味着使用引用之前不用测试它的合法性,而子真需要。因此使用引用的代码效率要比使用指针高。另外,应用也有区别,如果指向一个对象后就不会改变指向,那么应该使用引用,如果指向NULL 或者在不同的时刻指向不同的对象,应使用指针。
 
 
posted on 2012-05-01 09:33  谷堆旁边  阅读(159)  评论(0编辑  收藏  举报