再读Effective C++

Effective C++ 笔记

10年后再读Effective C++ 3rd(English),没有对细节的追问,更多的是对C++设计思路的思考,各章节标题为是个章节的归纳和总结java

让本身习惯C++

  • C++由多个部分构成c++

    C, Object-Oriented, Template, STL
  • 尽可能多的使用const,enums,inline代替define面试

    更好的静态检查
  • 尽可能多用const编程

    不只是防护式编程,更重要的是再检验设计的合理性
  • RAII 资源获取即初始化安全

    c++编程里永不过期的一句,不管声明一个变量或者得到某种资源

默认生成的函数们

  • 留意C++自动生成的代码:构造,析构,copy构造,operator =函数

    自动生成代码运行的机制,绝对是笔试,面试中的常客
  • 若是不须要,就显式的禁用自动生成的代码this

    各类笔试,面试常常出现只能栈上分配,堆上分配,不能继承,不能copy等等都是变种
  • 多态基类的析构必须是虚函数设计

    毋庸置疑,C++派生规则中必须遵照的一条,简单粗暴点就是基类的析构必定是虚函数
  • 析构函数不要抛异常code

    抛了异常就会致使析构传递断裂,资源泄漏在所不免
  • 构造/析构中不要调用虚函数对象

    笔试,面试中常常出现
  • operator = 返回 *this

    链式使用不可少
  • 处理好operator = 自赋值

    一样经典,必不可少
  • 拷贝构造必定要拷贝全

    不要为何,若是copy少了,必须是copy错了

资源管理

  • 使用对象管理资源

    3年经验的必须懂
  • 资源管理类的copy行为要慎重

  • 资源管理类提供访问Raw-Resource的方法

    std::string::c_cstr()要明白
  • new/delete 形式要对应

    new <=> delete, new [] <=> delete []
  • 存储new分配的资源在smart pointer中单独处理

    void foo(tr1::shared_ptr<Data> obj);
      foo(new data); // wrong
      tr1::shared_ptr<Data> pd (new Data());
      foo(pd); // all right

设计和声明

  • 接口好用不易错

    类型转换处理好
      语意上天然
  • 类设计就是类型设计

    类设计的基本规则之一
  • 常引用传递代替值传递

    不只减小对象生成消亡的开销,还能够简化代码
  • 该返回对象时,勿返回引用

    c++不是java,没有天生的引用计数机制
  • 数据成员私有

    多一层保护多一层自由,要不C#也不会搞属性,Java搞setter/getter出来
  • 使用非成员,非友元函数替代成员函数

    加强封装,弹性以及功能扩展,简单的说,没必要要的不要放在内部
  • 当参数都须要类型变化时,声明为非成员函数

    负数类operator + , 若是能够接受 int,char,double那么就声明为非成员函数,你们都开心
  • 支持无异常交换

    swap很重要,不管是在拷贝构造仍是赋值运算中

实现

  • 尽可能推迟变量的定义

    首先你要弄清楚什么是定义,哈哈
  • 最小化CAST

    尽可能不用,尤为是dynamic_cast,必须用的时候尽可能封装到函数里,优先C++ style, no C
  • 避免返回对象的内部处理细节

    对于这样的代码情何以堪:
      const Rect r(left, up, right, down);
      rect.getLeftup().setX(x);
      另外,临时对象也很难hold住
  • 异常安全

    这个怎么说都不过度
  • 明白inline函数的输入输出

    內联函数短小精悍,二进制升级要考虑好。
  • 最小化文件编译依赖

    如今的代码彷佛根本不在意这一套

继承和面向对象设计

  • 继承要符合“is-a”模型

    关键在于怎么理解企鹅是鸟不会飞这样的无厘头
  • 避免隐藏继承来的名字

    这个就是所谓的“隐藏规则”,笔试,面试都会有
  • 区别接口继承和实现继承

    virtual的都要设计成接口,非虚的都是实现
  • 考虑虚函数之外的其余选择

    解决问题的方法不止一个
  • 毫不从新定义继承而来的非虚函数

    C++就是这样,虚与实之间的界限有时清晰有时晦涩
  • 毫不从新定义继承而来的有默认参数的函数

    c++默认参数静态绑定
  • 使用组合来表示“A包含B”、“A以B的形式实现”

    弄清楚AB的关系比什么都重要
  • 明智的使用私有继承

    私有继承意味着所有都不能继续继承了
  • 明智的使用多继承

    单继承多实现是个好主意

模版和范型

  • 理解隐式接口,编译期多态

    理解接口,理解编译期多态,理解万岁
  • 理解typename的两个含义

    1:和class同样在模版中,2:表示后面是一个类型
  • 如何访问模板化基类中的名字

    1:this, 2:using 3:fullname
  • 把与参数无关的代码抽离templates

    模版生成代码膨胀要注意
  • 模版函数尽可能多的兼容类型

    多多益善
  • 须要类型转换时请为模板定义非成员函数

    放在里面很别扭
  • 使用traits classes表现类型信息

    典型的函数式思路和STL实现
  • 了解模版元编程

    运行期放到编译期

自定义new和delete

  • 理解new-handler

    new的内部细节
  • 理解替换new和delete的时机

    没有特别的理由无需重载
  • 按照约定实现new和delete

    new和delete都有本身的格式
  • 放置new和放置delete

    new和delete必定要对应
相关文章
相关标签/搜索