Effective cpp 读书笔记1

本周内,每天更新。

01.视C++为一个语言联邦

  1. C++的特性主要来源四个大方面(四个次语言)

    • 以C为基础

    • Object-oriented C++:面向类的思想,包括封装、继承、多态

    • Template C++:

    • 模板类 STL

  2. 结论:

    • C++高效编程守则视状况而变化,取决于你用C++的哪部分

02.尽量以const,enum,inline替换#define

  1. 坏处

    • define不被视为语言的一部分,在预编译的时候可能就被对应数据和字符取代,编译器看不到相关的记号

    • 宏定义的函数存在非安全性

  2. 用const取代

    • 定义常量指针:注意const的放置

    • class专属常量:可以声明的同时初始化;也可以在实现文件内初始化

  3. 用enum取代

    • 无法取对应的地址(#define也得到,功能相似)

    • 不想别人获得pointer或reference指向该资源

  4. 用inline取代

    • 某些时候,宏定义的函数不安全,可以用template inline的函数取代;因为inline的函数也相当于内部直接插入一段代码
  5. 结论:

    • 对於单纯常量,最好以const对象或enums替换#defines

    • 对于形如函数的宏,最好改用inline函数替换


03.尽可能使用const

  1. 注意:

    • const出现在型号左边,表示被指物是常量;在右边表示指针自身是常量

    • STL的静态指针: const std::vector::iterator 表示指针自身是常量,不能++;std::vector::const_iterator 表示被指物是常量

  2. const成员函数

    • 是为了确认该成员函数可作用于const对象身上

    • 真实程序中,const大多用于passed by pointer-to-const或passed by reference-to-const

  3. bitwise constness(编译器就是这种)和logical constness:

    • bitwise constness是成员函数只有在不更改对象的任何成员变量时就认为是符合const,这个定义存在一定不足,因为即使编译器查不出更改也可能存在更改

    • logical constness是一个const成员可以修改它所处对象内的某些bits,但只有在客户端侦测不出的情况下才可以

    • 通过mutable关键字,可以释放掉non-static成员变量的bitwise constness约束,从而在const函数内也可以修改所在对象的mutable成员变量

  4. 在const和non-const成员函数中避免重复

    • 实现常量性转除。消除const的性质,具体的做法是在non-const的函数里调用对应的const函数,并实现强制转换(const_cast可以强制消除const属性,static_cast可以实现强制转换)
  5. 结论:

    • 将某些东西声明为const可帮助编译器真测出错误用法编译器强制实施bitwise constness, 但编程应该使用“概念常量性”(具体问题具体分析,编译器不可靠的意思)

    • 当const和non-const成员函数存在等价实现,用non-const函数调用const版本可以避免代码重复


04.确定对象被使用前已先初始化

  1. 手工初始化:

    • 对于无任何成员的内置类型,需要手工初始化
  2. 构造函数最好使用成员初值列,而不要在构造函数内赋值操作。初值列列出的成语变量,其排列次序应该和它们在class中的声明次序相同

    • 要区分赋值和初始化,对于class的对象,在构造函数内赋值实际上是先调用了它们的默认构造函数,然后做赋值操作,比较低效

    • 成员的初始化列表本质是调用复制构造函数,效率较高

    • 规则:总是在初值列中列出所有成员变量,以免还需记住那些成员变量无需初值

  3. 为了免除“跨编译单元之初始化次序”的问题(就是定义文件之间的初始化没有先后顺序),应该以local static对象替换non-local static对象

    • non-local static:函数外的static对象就是non-local static变量

    • 编译单元:产出单一目标文件的源码,基本上它是单一源码文件加上其所含的头文件

    • 问题:C++对于不同编译单元内的non-local static对象的初始化次序没有明确定义

    • 解决:用singleton的思想。将每个non-local static变量搬到专属函数内,这些函数返回一个reference指向它所含的对象,然后用户调用这些函数,不直接调用对象。这时,non-local static变成了local static

    • 这种reference-returning函数的形式:定义并初始化一个local static, 然后返回它

发布了33 篇原创文章 · 获赞 21 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章