《Effective C++》第一章:让自己习惯C++

来源:互联网 发布:知乎 立体几何 编辑:程序博客网 时间:2024/04/29 15:34

条款一:视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,第一章结束!!!

原创粉丝点击