读书笔记之《Effective C++》解读篇
文|Seraph
解读篇主要记录整个理解过程,用作知识点详细解析以及引申和扩展。
卷首语
孔子云:取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣。
我们平常想问题,一定要尽量站到更高处去想问题,只从当前角色的角度思考会限制个人的思维方向。比如学生看问题的角度和教师看问题的角度就不一样,学生只需要看明白当前的问题,而老师需要理清知识点在知识体系中的位置,同时还需要了解怎么叙述让学生更好地理解这个问题。
结合孔子这句话就是:你只有站在更上层的角度去看事物,才能深度理解当前层面的所有知识。
中英术语对照表
因为我们一般是阅读中文文档入门计算机的,但很多前沿的技术还是英文的比较及时,后期阅读英文文档是必须的,所以中英的专业术语转换还是很重要的。
以下是本书的翻译中英术语表:(可以的话,后续自己专门整理下计算机范围内中英术语对照表)
英文术语 | 中文译词 |
---|---|
abstract | 抽象的 |
abstraction | 抽象性、抽象件 |
导读
-
对于代码编写,我们不仅仅要明白怎么写代码能执行对,还要注意:程序的可读性、维护难度、扩展性、效率高低、可能发生的错误。
这些知识是很重要,当然也比入门知识难学,说白了就是怎么去践行最佳实践,这需要我们不断的学习,而来自程序员的好经验,往往会缩短我们学习过程。
这本书就是大部分条款式的经验,所以需要你在对C++语言有一定的了解的情况下阅读。
本书的目的是强调那些常常被漠视的C++编程方向与观点。 -
定义式(definition)的任务是提供编译器一些声明式所遗漏的细节。
- 对对象而言,定义式是编译器为此对象拨内存的地点;
- 对funciton或funciton template而言,定义式提供了代码本体;
- 对class或class template而言,定义式列出他们的成员 。
-
构造函数要不没有参数,要不就是每个参数都是缺省值。
-
TR1("Technical Report 1")是一份规范,描述加入C++标准程序库的诸多新机能。
所有TR1组件都被置于命名空间tr1内,后者嵌套于命名空间std内。 -
Boost是一个组织,亦是一个网站,提供可移植、同僚复审、源码开放的C++程序库。
一、让自己习惯C++
条款 01:视C++为一个语言联邦
C++高效编程守则状况而变化,取决于你使用C++的哪一部分。
C++有以下四个次语言:
- C
- Object-Oriented C++
- Template C++
- STL
条款 02:尽量以const、enum、inline替换#define
-
#define
不被视为语言的一部分,它定义的名称可能没有进入记号表(sysmbol table)内,从而如发生错误信息,不能与该名称关联。 - 宏定义盲目地替换定义,会导致目标码出现多份。
- 无法利用#define创建一个class专属常量,因为#define并不重视作用域。
- "the enum hack"的方法可以补偿:某些编译器不能在class编译期间给定初始值(即类内)的问题。同时,取enum的地址是不合法的,这点和#define也刚好类似。
- C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到
符号表
中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间(大对象)。还有一些情况下也需要分配存储空间,例如强制声明为extern的符号常量或取符号常量的地址等操作。(这还需要视具体的编译器来定) - 宏定义的函数会有副作用,导致与理解逻辑有偏差。所以,尽量使用template inline函数替换宏函数。
- class内非静态常量可以在构造函数的初始化列表中初始化。
条款 03:尽可能使用const
不修改的变量,尽量用const修饰
- 两个成员函数如果只是常量性(constness)不同,可以被重载。