从C转向C++
条款1:尽量用const和inline而不用#define
- 少用define定义某个常量。在调试时编译器永远不会看到被define的那个数据,影响调试效率。应将“#define PI 3.14”改为“const double PI = 3.14”,性能相差无几,在类型安全上更可靠。但是注意,若要定义一个指针型常量,需要写两个const,比如const char * const authorName = “Scott Meyers”;
- 少用define实现类似函数的功能。一是涉及到类型安全问题,编译器不会去检查“参数”的类型,二是可能出现函数重复运行的问题。例如max(++a,b),a的值增加了两次,而max(++a,b+10)则正常。
条款2:尽量用< iostream>代替< stdio.h>
- 对cunt,cin的流操作相对于printf、scanf不用考虑变量类型、取地址等问题(scanf并不会检查参数是不是地址)。
- 使用< iostream>而不是< iostream.h>。前者的命名空间是std,后者的则是全局,后者容易引起命名冲突。
条款3:尽量用new和delete而不用malloc和free
- 后者不会激活类的构造函数和析构函数
- 后者不会自动判断变量需要的内存空间,比如为字符串分配空间的时候
- 千万不要把前者和后者混用
条款4:尽量使用C++风格的注释(//)
- C风格的注释(/**/)不能嵌套(然后编译器不会报错,只会跳过一大段代码)
- 在一些C语言预处理器中,宏定义后面的“//”注释可能成为宏的一部分
内存管理
条款5:对应的new和delete要采用相同的形式
- 删除一个数组的时候要用delete [] stringPtr;否则结果不可预测。特别是使用typedef定义了数组型变量的时候要尤其注意。
- 所以,对数组的需求最好减少到零,尽量采用std模板。
条款6:析构函数里对指针成员调用delete
- 为了尽量避免内存溢出,每一个在构造函数里new的指针尽量都在析构函数里用delete处理
- 构造函数里,要为每一个指针成员指向有效的内存,或者空指针(delete一个空指针也是安全的)
- 一种避免必须删除指针成员的办法是使用智能指针auto_ptr

本文是《Effective C++》的读书笔记,强调从C转向C++时应注意的编程习惯,如使用const和inline代替#define,采用< iostream>而非< stdio.h>,使用new和delete进行内存管理,以及在析构函数中正确处理指针。此外,还讨论了内存管理中的注意事项,如new和delete的一致性,以及如何避免内存泄漏。
1556

被折叠的 条评论
为什么被折叠?



