在使用c/c++時有許多細節和技巧需要注意的,但很多時候時間一長不用就忘掉了,故一點一滴記錄下來,以作備忘!
1、函數調用
函數調用的參數不改變參數內容的應在參數前加上const,如void function(const char * ServerName),防止誤修改。
但函數參數是結構體或者對象時,傳入的參數應爲指針或者引用,如void function(struct OneStructure & Parameter)或者void function(struct OneStructure * pParameter),而不應該是void function(struct OneStructure Parameter),因爲後者方法會在傳參是複製一個結構體而前者則只是複製一個指針或者引用。
函數接受的參數越少越好。
當一個頻繁被調用而且函數比較小巧時使用內聯inline來提高效率,如inline void f(void)。
2、基本語句
if的效率問題,一定要把最容易成立的條件放在最前面進行判斷,如if( (float)rand() / RAND_MAX > 0.2 ) //有80%的可能運行if部分;而不是if( (float)rand() / RAND_MAX < 0.2 ) //只有20%的可能運行if部分。應該把最難成立的條件放在第一的位置上,如
if ( (float)rand() / RAND_MAX < 0.2 // 只有%20的可能
&& (float)rand() / RAND_MAX < 0.3
&& (float)rand() / RAND_MAX < 0.4 )
while循環比for循環在每次的循環中都少一條彙編語句. 主要是因爲while循環是從大到小的順序循環,不需要和10進行比較就可以跳轉.而且可以直接利用--j語句設置的符號標誌進行條件判斷
3、構成函數
只要類裏有指針時,就要寫自己版本的拷貝構造函數和賦值操作符函數。
儘量使用初始化而不要在構造函數裏賦值。
4、explicit關鍵字
c++中的explicit關鍵字用來修飾類的構造函數,表明該構造函數是顯式的。如class MyClass{public:MyClass( int num );},當使用MyClass obj = 10時,編譯器會進行隱式的轉換,即MyClass temp(10);MyClass obj = temp;所以這樣的賦值是合法的嗎,編譯器不會報錯,而已這樣的賦值卻不是我們想要的,往往這樣很容易造成程序潛在的bug。因此,如果寫成explicit MyClass( int num );,再出現上面的賦值時編譯器就會報錯,防止了這種意外賦值情況的發生。