牛骨文教育服务平台(让学习变的简单)

Effective C++ 1-6

1.尽量用const 和inline 而不用#define:

即尽量用编译器,而不是预处理。宏命令导致编译器永远看不到被声明为宏的符号名,而编译器的处理会进行一些错误判断,但预处理不会。

如果出错,调试无法找到宏声明的错误来源,因为这些符号不存在于符号列表中。

宏调用时会出错,如使用自加或自减操作符时。宏应该使用inline 内联函数代替。

在类中可以使用enium来代替宏,如下,在类中声明一个枚举,枚举中设置一些值,就可以当作常量在类的其他地方随意使用了。

class A{
public:
	enum CHECKED { YES = 1,NO = 0};
	int a;
	A(int x,CHECKED = YES){}
}

2.尽量使用而不是<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来释放内存。

而当程序不断维护升级后,在其他成员函数中会不断的添加新的指针,所以一定要在析构函数中都进行删除。

指针要初始化,不然会在析构时出错。而删除空指针是安全的,因为它什么也没做。