读书笔记之《Effective C++》解读篇

2019-01-14  本文已影响5人  046ef6b0df68

文|Seraph

解读篇主要记录整个理解过程,用作知识点详细解析以及引申和扩展。

卷首语

孔子云:取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣。
我们平常想问题,一定要尽量站到更高处去想问题,只从当前角色的角度思考会限制个人的思维方向。比如学生看问题的角度和教师看问题的角度就不一样,学生只需要看明白当前的问题,而老师需要理清知识点在知识体系中的位置,同时还需要了解怎么叙述让学生更好地理解这个问题。
结合孔子这句话就是:你只有站在更上层的角度去看事物,才能深度理解当前层面的所有知识。

中英术语对照表

因为我们一般是阅读中文文档入门计算机的,但很多前沿的技术还是英文的比较及时,后期阅读英文文档是必须的,所以中英的专业术语转换还是很重要的。
以下是本书的翻译中英术语表:(可以的话,后续自己专门整理下计算机范围内中英术语对照表)

英文术语 中文译词
abstract 抽象的
abstraction 抽象性、抽象件

导读

  1. 对于代码编写,我们不仅仅要明白怎么写代码能执行对,还要注意:程序的可读性、维护难度、扩展性、效率高低、可能发生的错误。
    这些知识是很重要,当然也比入门知识难学,说白了就是怎么去践行最佳实践,这需要我们不断的学习,而来自程序员的好经验,往往会缩短我们学习过程。
    这本书就是大部分条款式的经验,所以需要你在对C++语言有一定的了解的情况下阅读。
    本书的目的是强调那些常常被漠视的C++编程方向与观点。

  2. 定义式(definition)的任务是提供编译器一些声明式所遗漏的细节。

  1. 构造函数要不没有参数,要不就是每个参数都是缺省值。

  2. TR1("Technical Report 1")是一份规范,描述加入C++标准程序库的诸多新机能。
    所有TR1组件都被置于命名空间tr1内,后者嵌套于命名空间std内。

  3. Boost是一个组织,亦是一个网站,提供可移植、同僚复审、源码开放的C++程序库。

一、让自己习惯C++

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

C++高效编程守则状况而变化,取决于你使用C++的哪一部分。
C++有以下四个次语言:

条款 02:尽量以const、enum、inline替换#define
  1. #define不被视为语言的一部分,它定义的名称可能没有进入记号表(sysmbol table)内,从而如发生错误信息,不能与该名称关联。
  2. 宏定义盲目地替换定义,会导致目标码出现多份。
  3. 无法利用#define创建一个class专属常量,因为#define并不重视作用域。
  4. "the enum hack"的方法可以补偿:某些编译器不能在class编译期间给定初始值(即类内)的问题。同时,取enum的地址是不合法的,这点和#define也刚好类似。
  5. C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放到符号表中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间(大对象)。还有一些情况下也需要分配存储空间,例如强制声明为extern的符号常量或取符号常量的地址等操作。(这还需要视具体的编译器来定)
  6. 宏定义的函数会有副作用,导致与理解逻辑有偏差。所以,尽量使用template inline函数替换宏函数。
  7. class内非静态常量可以在构造函数的初始化列表中初始化。
条款 03:尽可能使用const

不修改的变量,尽量用const修饰

  1. 两个成员函数如果只是常量性(constness)不同,可以被重载。
条款 04:确定对象使用前被初始化

二、构造/析构/赋值运算

条款 05:C++默认编写并调用的函数
条款 06:不想使用默认生成的函数,可以明确拒绝
条款 07:多态基类声明virtual析构函数
条款 08:别让异常逃离析构函数
条款 09:不要在构造和析构函数调用virtual函数
条款 10:令operator=返回reference to *this
条款 11:在operator=中处理"自我赋值"
条款 12:复制对象的时候勿忘其每个部分

三、资源管理

条款 13:以对象管理资源
条款 14:在资源管理类中小心copy行为
条款 15:在资源管理类中提供对原始资源的访问
条款 16:成对的使用new和delete
条款 17:以单独的语句将newed对象置入shared_ptr

四、设计与生命

条款 18、让接口容易被正确使用,不易被误用
条款 19、设计class
条款 20、以pass-by-reference-const替换pass-by-value
条款 21、不要返回临时对象的引用
条款 22、将成员变量声明为private
条款 23、宁以non-member、non-friend函数替换member函数
条款 24、若所有参数皆需类型转换,那么请采用non-member函数
条款 25、写一个不抛出异常的swap函数

五、实现

条款 26、尽可能延后变量定义得时间
条款 27、尽量避免转型
条款 28、避免返回一个指针、引用或者迭代器指向类内的成员
条款 29、异常安全函数
条款 30、inline 函数
条款 31、编译依存关系降低至最低

六、继承与面向对象设计

条款 32、确保public继承是is-a关系
条款 33、名称遮掩问题
条款 34、接口继承与实现继承
条款 35、考虑virtual函数以外的选择
条款 36、不要重新定义继承来的non-virtual函数
条款 37、不要重新定义重写函数(virtual)的默认参数
条款 38、类与类之间的关系:复合(has a的关系)
条款 39、私有继承
条款 40、多重继承

七、模板与泛型编程

条款 41、隐式接口和编译器多态
条款 42、了解typename
条款 43、调用基类模板成员
条款 44、将与template参数无关的代码抽离到模板外
条款 45、运用成员函数模板接受所有兼容类型
条款 46、需要类型转换时请为模板定义非成员函数
条款 47、traits编程技巧
条款 48、模板元编程

八、定制new和delete

条款 49、了解new-handler的行为
条款 50、了解new和delete的合理替换时机
条款 51:编写new和delete时需固守常规
条款 52:写了placemant new也要写placement delete

九、杂项讨论

条款 53:不要轻忽编译器的警告
条款 54:让自己熟悉包括TR1在内的标准程序库
条款 55:让自己熟悉Boost
上一篇下一篇

猜你喜欢

热点阅读