1.尽量用const 和inline 而不用#define:
即尽量用编译器,而不是预处理。宏命令导致编译器永远看不到被声明为宏的符号名,而编译器的处理会进行一些错误判断,但预处理不会。
如果出错,调试无法找到宏声明的错误来源,因为这些符号不存在于符号列表中。
宏调用时会出错,如使用自加或自减操作符时。宏应该使用inline 内联函数代替。
在类中可以使用enium来代替宏,如下,在类中声明一个枚举,枚举中设置一些值,就可以当作常量在类的其他地方随意使用了。
~~~
class A{
public:
enum CHECKED { YES = 1,NO = 0};
int a;
A(int x,CHECKED = YES){}
}
~~~
2.尽量使用<iostream>而不是<stdio.h>
scanf和printf很轻巧高效,但cout<<和cin>>具有类型安全和扩展性。使用<<和>>操作符重载:
~~~
friend ostream& operator<<(ostream& s,const D& d);
~~~
但是iosteam的有些操作要比C stream的效率低,且可移植性低。
对于c++中是否在头文件后加.h,未加表示库中元素都在std命名空间中,加后表示元素为全局空间的。使用前者会避免名字冲突。
3.尽量使用new和delete 而不用malloc和free。
malloc和free在c中有用,但是无法用于c++中的类与对象,c++中构造函数和析构函数,可以动态的分配内存。
且malloc和free是库函数,而new和delete是操作符。
4.尽量使用c++风格的注释.。
c++风格为行尾注释语法使用//,而c风格的使用/* ... */。
5.对应的new和delete 要采用相同的形式。
要删除的是单个对象还是数组,需要告诉delete。出错的结果是不可预测的。
而当使用typedef来定义类型后,new这个类型,也要用相应形式的真正的类型来delete进行删除,如:
~~~
typedef string AddressLines[5];
~~~
要释放new的AddressLines对象,要用真正的形式,即delete [] p。
6.析构函数中对指针成员调用delete、
大多数情况下,执行动态内存分配的类都在构造函数中进行new分配内存,而在析构函数中使用delete来释放内存。
而当程序不断维护升级后,在其他成员函数中会不断的添加新的指针,所以一定要在析构函数中都进行删除。
指针要初始化,不然会在析构时出错。而删除空指针是安全的,因为它什么也没做。