条款一:视C++为一个语言联邦
四大联邦:C、Object-Oriented C++、Template C++、STL
条款二、三:尽量以const,enum,inline替换#define
此条款旨在阐述“尽量以编译器代替预处理器”这个概念。我们首先带分析一下#defined的不好之处:
(1)利用#define定义一个常量,比如#define PI 3.14,记号名称PI也许从未被编译器看见过,在预处理的时候就被3.14代替了,于是PI有可能没进入记号表内。当产生错误的时候,编译器很可能会提到3.14而不是PI,十分不利于调试
(2)可能会使形式参数产生副作用。比如#define MAX(a,b) (((a) > (b)) ? (a) : (b)) ,如果采用这样调用的方式:MAX(a++,b++),会被展开成:
(((a++)>(b++))?(a++):(b++))
因此我们最好用inline来代替#define
下面我们来分析一下const的一些特性:(1)const默认为内部链接,C++中是编译器期间常量,一般会采用常量折叠。只有在必要情况下,比如使用extern、解引用才会被分配内存。但是注意在C语言中,const是运行时常量,默认为外部链接。所以在C++中使用const常量作为数组大小的定义是可以的,但是在C语言中就不行
(2)在函数参数和返回值中使用const。注意临时量一般都是const,对临时对象取地址、引用都是不允许的
(3)const在类中的作用。类成员变量为const时,必须在初始化列表中初始化,const可以用于重载标识,并且non-const对象可以调用const对象
(4)static的两种作用:在静态存储区上分配内存,初始化一次,默认为内部链接
(5)static 和 const在类中的应用:如果只有static修饰,则只能在类外初始化;同时又static和const修饰,类外类内都可以初始化;const只能在初始化列表中初始化;普通成员可在初始化列表和构造函数内初始化
前面说到,在C语言中用const常量定义一个数组大小是不合法的,但是我们又不想用#define,这可如何是好?这时我们可以用enum。enum比较像#define,不可以取地址(对const可以)。
条款四:确定对象被使用前已先被初始化
没什么好讲的.....
1、为内置型对象进行手工初始化,因为C++不保证初始化它们
2、构造函数最好使用成员初始列(效率会高一点),并且保证次序和申明时一样
3、为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象(因为static是内部链接,其它编译单元不可见)
all right,第一章结束!!!