美文网首页
读书笔记之《Effective C++》解读篇

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

作者: 046ef6b0df68 | 来源:发表于2019-01-14 20:29 被阅读5次

    文|Seraph

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

    卷首语

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

    中英术语对照表

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

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

    导读

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

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

    • 对对象而言,定义式是编译器为此对象拨内存的地点;
    • 对funciton或funciton template而言,定义式提供了代码本体;
    • 对class或class template而言,定义式列出他们的成员 。
    1. 构造函数要不没有参数,要不就是每个参数都是缺省值。

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

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

    一、让自己习惯C++

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

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

    • C
    • Object-Oriented C++
    • Template C++
    • STL
    条款 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

    相关文章

      网友评论

          本文标题:读书笔记之《Effective C++》解读篇

          本文链接:https://www.haomeiwen.com/subject/bszjdqtx.html