【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间的支持)

posted @ 2017-12-25 20:43  stackupdown  阅读(205)  评论(0编辑  收藏  举报