Effective C++读书笔记(一)

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

  • 把C++看成4部分
    • C: 以后当有人问C和C++之间的关系时我们可以回答,C++是以C为基础的,多数语法,基本数据类型,预处理器等统统来自于C
    • Object-Oriented C++: C++是可以面向对象的,这部分让C++有了这样的功能
    • Template C++
    • STL:STL包括containers, iterators, algorithms,他们为编程提供了很大的便利

条款2: 尽量以const, enum, inline替换#define

  • #define直接替换代码,如果define的是常数,debug时只能看到这个常数而不能看到具体对应的变量,用const可以避免此问题
  • #define直接替换代码,有些时候会引起难以察觉的错误。例如优先级问题等。

条款3: 尽可能多的使用const

  • 在函数声明内使用const可以防止参数(指针)被修改
    • const在星号左边代表被指物是常量
    • const在星号右边代表指针是常量
    • 出现在星号两边代表都是常量
  • 令函数返回一个常量值可以降低函数使用者因错误使用造成的意外
  • 类中两个函数如果只是常量性不同,可以被重载(可以设置两个相同名字的函数处理const对象和非const对象)
  • 在C++中,只有被声明为const的成员函数才能被一个const类对象调用
  • 编译器实现bitwise const,即成员函数不改变对象内任何non-static成员变量,编写程序时亦应注意逻辑上保证正确
  • 当const和non-const版本有实质等价的实现时,可以让non-const版本转型并调用const版本成员函数

条款4: 确定对象被使用前已先被初始化

  • 简单int x并不保证x一定会被初始化为0
  • 确保每一个构造函数都将对象的每一个成员初始化
    • 带参数的构造函数
    • 注意赋值和初始化的区别
    • 初始化动作发生在进入构造函数本体之前
    • 使用member initialization list替换赋值动作(否则会调用default构造函数初始化,是一种浪费)
    • 最好以声明次序作为成员初值列顺序(条款12)
  • 不同编译单元内定义之non-local static对象
    • 函数内的static对象称为local static对象,其余为non-local
    • 编译单元(translation unit)指产出单一目标文件的源码
    • Singleton模式的get()可解决这一问题
    • 加强设计