0%

Effective C++

在本笔记中主要对《Effective C++》一书中的重要条款做学习笔记,提取当中主要的知识点和面试考点,读者在进行C plus plus岗位面试前可细读该篇文章的(重要)部分。

1 条款1:视C++为一个语言联邦

在C++中我们总会有一种错觉,那就是人为C++主要就是面向对象的编程,但是这是不全面的,作为从C中延伸的语言,它保留了C的特性,也集成了许多新的功能,你可理解成:

  • C:以C为基础。
  • 面向对象的C++:添加面向对象特性。
  • 模板C++:泛型编程概念,使用模板。
  • STL:使用STL的容器、迭代器、算法、及函数对象。

四者的集合

2 条款2:尽量用编译器替换预处理器

在C/C++中,我们明白一个程序流程为预处理-->编译-->汇编-->链接,在预处理阶段中,我们对文件内的进行头文件展开、宏替换和去注释等预处理操作。那么也就是说像宏定义相关的定义从未被编译器看见

1
#define ASPECT_RATIO 1.645
上面的记号名称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 ,如果你不想让别人获得一个pointerreference指向你的某个整数常量,enum可以帮助你实现这个约束。
  • 对于函数宏,用inline函数代替#definedefine是死板的替换,容易产生传递计算式类似累加多次的问题)
3. 条款3:尽可能使用const(重要)

const是C++中最为常用、也是最为强大的一个关键字,也是面试过程中极有可能问到的。const可以修饰变量、指针、引用、函数、static。在说其详细应用时,我们必须先去了解const规则:

  • const修饰指针时分为底层const和顶层const
  • const变量可以赋值给const变量,反之不行。
  • const常量必须被初始化
  • 后续不能对const常量做改变