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來釋放內存。
而當程序不斷維護升級后,在其他成員函數中會不斷的添加新的指針,所以一定要在析構函數中都進行刪除。
指針要初始化,不然會在析構時出錯。而刪除空指針是安全的,因為它什么也沒做。