EffectiveCPP

  1. 视C++为一个语言联邦
    C、面向对象、泛型和模板、STL

  2. 尽量以const, enum, inline替换 #define
    宏定义不够安全

  3. 尽可能使用 const
    const * int p; // 被指向物是常量

  • const int p; // 指针本身是常量
  1. 确定对象被使用前已先被初始化
    初始化列表,初始化次序

  2. 了解C++默默编写并调用哪些函数
    默认构造函数、拷贝构造函数、赋值运算符、析构函数

  3. 若不想使用编译器自动生成的函数,就应该明确拒绝
    使用private封装不想被调用的函数

  4. 为多态基类声明virtual析构函数
    析构时,先调用最底层派生类的析构函数,再往上调用父类的析构函数

  5. 别让异常逃离析构函数

  6. 绝不在构造和析构过程中调用virtual函数
    构造时,先基类,派生类还未构造,如果下降到更底层的虚函数,会产生未定义行为;
    析构时,先派生类,来到基类时,派生类已经释放,如果下降也会产生未定义行为。

  7. 令 operator= 返回一个指向 *this 的引用
    string, vector, shared_ptr都采用这个标准。

  8. 在 operator= 中处理“自我赋值”
    证同测试

  9. 复制对象时勿忘其每一个成分
    深拷贝

  10. 以对象管理资源
    管理对象,工厂模式,RAII观念(资源取得时机就是初始化时机)

  11. 在资源管理类中小心coping行为
    禁止复制、引用计数法、复制底部资源、转移底部资源的拥有权

  12. 在资源管理类中提供对原始资源的访问
    get()函数的设计,隐式转换更方便,显式转换更安全

  13. 成对使用 new 和 delete 时要采取相同形式
    new[]和delete[]一一对应

  14. 以独立语句将newed对象置入智能指针
    函数参数调用顺序不确定

  15. 让接口容易被正确使用,不易被误用
    防止接口误用

  16. 设计 class 犹如设计 type
    把class的设计当作新类型的设计,仔细思考所有的细节再做决定

  17. 宁传 const 引用也不要直接传值
    临时对象

  18. 必须返回对象时,别妄想返回其引用
    不要返回指向本地栈的指针或引用。

  19. 将成员变量声明为 private
    private可保证客户访问数据的一致性,而protected的封装性不如public

  20. 尽量用非成员、非友元函数替换成员函数
    对于功能整合的便利函数,尽量写在class之外,namespace之内,增加封装性、可扩充性。

  21. 若所有参数都需要类型转换,请采用非成员函数

  22. 写出一个不抛出异常的swap函数
    当std::swap()对自定义类型效率不高时,提供一个swap成员函数,并确定它不会抛出异常。

  23. 尽可能延后变量定义式的出现时间

  24. 尽量少做转型动作
    const_cast() 常量性转除
    dynamic_cast() 继承
    reinterpret_cast() 低级转换
    static_cast() 强制隐式转换

  25. 避免返回指向对象内部成分的句柄
    帮助const成员函数的行为的确像个const。

  26. 为异常安全而努力是值得的
    即使发生异常也不会泄露资源或破坏任何数据结构。

  27. 透彻了解 inline 的里里外外
    stl::max()和stl::min()就是inline的。
    class内成员函数默认内联。

  28. 将文件的编译依存关系降到最低
    将一个class分割成两个class,一个只提供接口,另一个负责实现该接口,减少编译依赖关系。

  29. 确定 public 继承构成 is-a 关系
    基类的每一件事情一定也要适用于派生类。

  30. 避免遮掩继承而来的名称
    作用域问题。

  31. 区分接口继承和实现继承
    纯虚函数:只指定接口继承
    非纯虚函数:指定接口继承及缺省实现继承
    非虚函数:指定接口继承及强制性实现继承

  32. 考虑 virtual 函数以外的其他选择
    virtual函数的替代方案包括NVI手法以及多种设计模式。

  33. 绝不重新定义继承而来的非虚函数

  34. 绝不重新定义继承而来的缺省参数值

  35. 通过复合构造出 has-a 或 “根据某物实现出” 的结构

  36. 明智而审慎地使用private继承

  37. 明治而审慎地使用多重继承
    多重继承:
    单一继承:

  38. 了解隐式接口和编译器多态
    对于class,接口是显式的,多态通过虚函数发生于运行期;
    对于template,接口是隐式的,多态通过template具现化和函数重载发生于编译器。

  39. 了解 typename 的双重意义
    一般情况下和class等价。

  40. 学习处理模板化基类内的名称

  41. 将与参数无关的代码抽离 templates

  42. 运用成员函数模板接受所有兼容类型

  43. 需要类型转换时请为模板定义非成员函数

  44. 请使用 traits classes 表现类型信息

  45. 认识 template 元编程

  46. 了解new-handler的行为

  47. 了解new和delete的合理替换时机
    重载new和delete运算符。

  48. 编写new和delete时需固守常规

  49. 写了placement new 也要写placement delete

  50. 不要轻忽编译器的警告

  51. 让自己熟悉包括 TR1 在内的标准程序库
    智能指针,tr1::function,tr1::bind,tr1::unordered_set,正则表达式,tr1::tuple,
    tr1::array,tr1::mem_fn,tr1::reference_wrapper,随机数,数学特殊函数,C99兼容。

  52. 让自己熟悉Boost

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值