摒弃C的做法采用C++的实现方式
- 以const和inline代替define
- 以iostream流代替stdio
- 以new和delete代替
- C++风格注释
内存管理
- new和delete, new[] delete[]
- 析构函数要销毁掉类的动态内存分配,防止内存泄漏
7-10其他问题
构造、赋值、拷贝构造
11.初始化时的=表示拷贝构造,其他时候表示赋值运算符。如果在class中有动态的内存分配,则不能使用默认的拷贝构造和赋值预算法,需要重写。
12.尽量用初始化代替函数类变量赋值:一是效率更高,二是const变量只能初始化而不能赋值。
13.构造函数的初始化顺序与类的成员变量定义的顺序相一致,目的是析构顺序与类的成员变量的构造顺序相反。如果不是按照这个顺序赋值,那么类需要其他的方式记录每个变量的赋值顺序,这样就增加了开销。
14.Base class尽量virtual function。
15-17 =运算符相关
类与对象
18.类的成员函数完整且最小化
19. member function non-member function和 friend function区别
20. 避免将data member放在public中,安全?
21. 尽可能使用const
22. 尽可能传递引用而不是传值:效率高?避免拷贝构造?
23. 函数重载与缺省参数的选择?
25. 避免对指针的类型的重载
26. 造成模棱两可的情况,比如:即使Base1、Base2的参数和返回值不一样,仍然会造成类型不匹配的问题。比如:
D d; d.dot //error 模棱两可
即使使用了private限制符仍会出错
27. 如果不想使用编译器默认生成的member function,那么可以显示的禁止它,比如赋值运算符=,将其直接声明为private即可。这一点与Google编程指南倒是很相似。
28. 命名空间
31. 不要传回new的对象:无法析构和本地变量的引用:返回的时候被析构
35. 面向对象的public继承代表is-a的关系:比如:鸟之于鸡,动物之于爬行动物之类的关系
37. 将子类需要重写(覆盖)的函数声明为虚函数,以实现RTTI
38. 虚函数不能有默认参数:因为默认参数会静态绑定,而虚函数是动态绑定
39. 不要向下转型
40.用has-a 实现层次关系,比如计算机包括CPU主板 内存等部分,这些类都是计算机的组成部分,而不能说是计算机继承了这些class.反倒是可以说计算机继承了单片机。这些类的成员变量和普通的局部变量一样,会自动析构而不用手动delete