【Effective C++】Effective C++笔记
Effective C++
1. 知道C++为一个语言的联邦而非单种语言
2. 使用const、enum和inline替代宏
3. 尽量使用const
4. 确定对象已被初始化 (编译器不保证变量被初始化,跨平台和编译器的问题)
5. 了解C++默认编译和调用的函数(并取消之)
6. 明确取消不想由编译器自动生成的函数
7. 为多态类实现虚函数(不是多态的就不要用虚函数了)
8. 别让异常逃离析构函数
9. 不在构造和析构过程调用virtual函数(从这里起,想起来要做什么比不要做什么让人更印象深刻)
10.令operator=返回一个reference to *this
11. 处理operator=的自我赋值
12. 复制对象时勿忘其每一个成分
13. 以对象管理资源(看到auto_ptr、智能指针)
14. 资源管理类中小心使用copy行为(智能指针,删除器)
15.在资源管理类中提供对原始资源的访问(智能指针强转)
16.成对使用new和delete时要采取相同形式(数组要用[])
17.以独立语句将newed对象置入智能指针(即对象最好单独写一条语句, 否则可能泄露)
18.让接口容易被正确使用,不易被误用(例如相同作用的函数的名称一致性; 不同dll内的shared_ptr最好声明自己的删除器)
19. 如type一样设计class(创建、销毁、赋值;传递值;合法值、类型转换、操作符;)
20. 宁以pass-by-reference-to-const替换pass-by-value(对非原生类型而言;参数切割可以被避免)
21.必须返回对象时,别妄想返回其reference
22. 将成员变量声明为private
23. 宁以non-member、non-friend替换member函数 (为了更好的封装性;写到命名空间里)
24. 若所有参数需要类型转换,请为其采用non-member函数(non-member函数可以直接变成重载的运算符)
25. 考虑写出一个不抛异常的swap函数
26. 尽可能延后变量定义的出现时间
27. 尽量少做转型操作(dynamic_cast耗费成本很大, 强转为继承类,而且是底层代码用的较多,调用基类的方法只能写清楚类名Base::(而非通过cast))
28. 避免返回handles指向对象内部成分
29. 为“异常安全”而努力是值得的(注意回收资源;防止异常造成对象损坏)
30. 透彻了解inlining的里里外外(带函数指针的参数可能不被inline)
31. 将文件间的编译依存关系降至最低(头文件只写声明不写定义)
32. 确定你的public继承可以模拟出”is-a”关系(书里没给出解决方案)
33. 避免遮盖继承而来的名字(不想遮盖时,using 名称, 多个副本; 用转交函数遮盖继承)
34. 区分接口继承和实现继承(接口继承:全部虚函数; 虚函数被继承会被直接使用,但是不一定所有的函数要都要虚函数)
35. 考虑virtual 函数以外的其他选择(template method模式(跟template无关), 子类不重载高层函数,而是重载底层函数)
36. 绝不重新定义继承而来的non-virtual 函数
37. 绝不重新定义继承而来的缺省参数值(而是用非virtual调用private的virtual,这样只要改private virtual就可以了)
38. 通过复合模拟出has-a或”根据某物实现出”(is a和has a的区别;用包含的方法实现类)
39. 明智而审慎地使用private继承(可以在class里定义类)(EBO: 空白基类最优化)
40. 明智而审慎地使用多重继承
模板与泛型编程
41.了解隐式接口和编译期多态(对template而言)
42.了解typename的双重意义(在STL兼容类型调用内部类型T的时候必须让编译器知道T是个typename)
43. 学习处理模板化基类里的名称
44. 将与参数无关的代码抽离templates
45. 运用成员模板函数接受所有兼容类型
46. 需要类型转换时请为模板定义非成员函数(即friend函数进行类型转换后调用内部函数)
47. 请使用traits classes类型信息(设计一个类的萃取器)
48. 认识template元编程(TMP)
定制new和delete
49.了解new-handler的行为 (自己重写new操作符)
50. 了解new和delete的合理运算时机
51. 编写new和delete时需固守常规
52. 写了placement new也要写placement delete
Miscellany 杂项讨论
53. 不要忽视编译器的警告
54. 让自己熟悉包括TR1在内的标准程序库(C++ 1.1, 正则表达式, 哈希表)
55. 让自己熟悉Boost(http://boost.org, C++和python间的支持)