More Effective c++

  • 指针和引用
    • 引用对象必须存在,即不能引用空值,指针可以指向空值,引用必须初始化指向一个对象
    • 指针可以改变指向的对象,引用不能改变所引用的对象
    • 不改变指向对象使用引用,改变指向对象使用指针
    • 重载[]时必须返回引用,以保证返回对象可以被赋值改变
  • 类型转换
    • (type)expression -> static_cast
    • const_cast : 转换掉const 属性
    • dynamic_cast: 向下转型
  • 不对数组使用多态:避免子类向基类转型导致切割
  • 避免无用的缺省构造函数
    • 建立数组时,无法默认构造,即不能构建数组
  • 尽量不重载|| 和&& 操作符,避免与系统内置布尔表达式短路算法的不一致
  • new操作符:分配足够内存容纳所需类型对象,对象内存初始化
    • operator new 仅分配内存
    • placement new 仅初始化内存中对象
  • 析构函数防止资源泄漏:使用智能指针,离开作用于自动释放空间,或者将资源封装为类对象,实现自动释放
  • 在构造函数中防止资源泄露:指针默认初始化为0,构造参数不空则指向参数,析构函数释放指针内容(不管指针内容是否为空)(c++释放空指针是可以的)
    • 对象在构造过程中抛出异常,c++不负责析构
    • 指针数据对象必须初始化,初始化过程必须注意初始化失败的情况,捕捉异常并local释放指针,抛出异常;
    • 在异常传递前,清理空间,然后传递异常
    • 避免异常在析构函数中抛出,在异常内部捕获

      More Effective c++
  • 通过指针抛出异常,避免拷贝对象,同时避免传出一个被释放的异常对象指针
  • 通过引用捕获异常,避免对象重复构造,又不会指向被释放内存
  • 分期计算,每次迭代计算结果,缓存结果:预取和缓存
  • 尽量避免临时对象的产生,任何常量引用都有可能导致临时对象绑定参数的的可能**??
  • 重载避免隐式类型转换
  • 用operate+= 实现operate+,减少命名对象使用,临时对象开销更小

  • 虚函数与多态
    • 调用虚函数时,执行代码必须与调用函数对象的动态类型一致
    • 虚函数表:每个类的虚函数表有继承基类的虚函数(未被覆盖),自己声明的虚函数,全部以指针形式指向函数地址
    • 每个声明了虚函数的对象包含一个虚表指针,指向对应类的虚函数表
    • 每个类的vtbl[0]处包含一个type_info指针,指向RTTI信息

      More Effective c++

    • 虚继承内存模型

      More Effective c++

More Effective c++

More Effective c++

  • 堆中建立对象:禁止隐式构造和析构即可实现禁止new 以外的构造
    • private 析构函数,设置伪析构函数调用析构函数实现析构,析构函数私有则不能在栈上创建类对象(无法自动析构)
  • 封装和抽象,考虑通用化
  • 非尾端类设计为抽象类,方便继承和实例化
上一篇:第二次项目冲刺(Beta阶段)5.25


下一篇:《java入门第一季》之面向对象面试题(形式参数的问题)