在本笔记中主要对《Effective C++》一书中的重要条款做学习笔记,提取当中主要的知识点和面试考点,读者在进行C plus plus
岗位面试前可细读该篇文章的(重要)部分。
1 条款1:视C++为一个语言联邦
在C++中我们总会有一种错觉,那就是人为C++主要就是面向对象的编程,但是这是不全面的,作为从C中延伸的语言,它保留了C的特性,也集成了许多新的功能,你可理解成:
- C:以C为基础。
- 面向对象的C++:添加面向对象特性。
- 模板C++:泛型编程概念,使用模板。
- STL:使用STL的容器、迭代器、算法、及函数对象。
四者的集合
2 条款2:尽量用编译器替换预处理器
在C/C++中,我们明白一个程序流程为预处理-->编译-->汇编-->链接
,在预处理阶段中,我们对文件内的进行头文件展开、宏替换和去注释等预处理操作。那么也就是说像宏定义相关的定义从未被编译器看见 上面的记号名称1
ASPECT_RATIO
也许在编译器开始处理源码之前它就被预处理器移走了,于是该记号就没有进入记号表(在二进制文件即生成的.o
文件中)。那么当你运用此常量但获得一个编译错误信息时,这个错误信息也许只会提到1.653
而不是ASPECT_ARTIO
,而它又被定义在一个非你所写的头文件,那么你对1.635
来自何处毫无概念,你要耗费大量时间寻找它。
用const
替换#define
: 作为一个常量,它肯定能被编译器看到并放到符号表内。1
const double AspectRatio=1.635;
基于上述的一个讲解,因此对于条款2有一下准则:
- 对于单纯常量,尽量以
const
对象或enums
枚举来代替#define。 - 若用
define
的可能会导致程序出出现多份目标码,而常量不会出现这种情况 - 取一
enum
的地址就不合法,这种行为和define
类似因此可以用此来代替define
,如果你不想让别人获得一个pointer
或reference
指向你的某个整数常量,enum
可以帮助你实现这个约束。 - 对于函数宏,用
inline
函数代替#define
(define
是死板的替换,容易产生传递计算式类似累加多次的问题)
3. 条款3:尽可能使用const(重要)
const
是C++中最为常用、也是最为强大的一个关键字,也是面试过程中极有可能问到的。const
可以修饰变量、指针、引用、函数、static。在说其详细应用时,我们必须先去了解const
规则:
const
修饰指针时分为底层const
和顶层const
。- 非
const
变量可以赋值给const
变量,反之不行。 const
常量必须被初始化- 后续不能对
const
常量做改变