C++ Tips: 指針、數組和結構

5.1 避免非平凡的指針算術。

複雜的指針算術通常不必要,最好避免。原因是可能導致未定義的結果。兩個指針指向同一個數組的元素時,指針相減纔有意義。指針加上或者減去一個整數,得到的結果還是一個指針,如果這個值不指向原來指針指向的數組的元素,那麼使用這個值得結果就是無定義的。指針相加沒有意義,因此不被允許。

 

5.2 當心,不要超出數組的界線去寫。

使用數組時總是應該對數組越界保持警覺。一旦數組越界,就會產生無定義的結果,程序可能會崩潰或者稀裏糊塗的繼續運行。緩衝區溢出是黑客廣泛利用的一種攻擊手段,它就是利用超出數組的界線去寫內存來達到目的的,所以我們應使用帶有長度檢查的函數版本,如strncpy, snprintf等等, 而不是strcpy, sprintf

 

2.3 儘量使用0而不是NULL

   對於0NULL的是非曲直, imperfect C++中有詳細的介紹,我們應該記住C++中使用0而不是NULL

 

5.4 儘量使用vectorvalarray而不是內部的數組。

   vector被設計用來模擬動態數組,它的內存佈局和C數組時一樣的。這裏有一個用vector代替C數組的例子。

std::vector<char> v; // create vector as dynamic array of chars

v.resize(41); // make room for 41 characters (including '/0')

strcpy(&v[0], "hello, world"); // copy a C-string into the vector

printf("%s/n", &v[0]); // print contents of the vector as C-string

 

5.5 儘量使用string而不是以0結尾的char數組。

   C風格char數組依靠0來確定字符個數,標準庫的string存有長度,並不依賴於0來確定大小。而且string中還可以包含0,需要注意的是如果string表示的字符串中間含有0,這時調用c_str()返回一個const char* 指針, 如果用strlen來對這個值這求長度, 那麼這個長度是不正確的, 他並不等於string的成員函數length()返回的值。Effective STL中條款13更詳細的解釋了使用string代替以0結尾的char數組

 

5.6 儘量少用普通的引用參數。

   普通的引用參數如 void f(int& i),調用時是f(x),這種形式並不能給人x的值被修改的提示信息,而x=f(x)或者f(&x)則可以。所以應少用普通的引用參數。但在實際中用普通的引用參數作爲輸出參數是很常見的,這時可以用有提示意義的函數名,如update(x)

 

5.7 避免void*,除了在某些低級代碼裏。

   void*常常出現在系統中很低的層次,如果在系統較高層次上出現void*,應該認爲是可疑的, 就像設計錯誤的指示器。值得注意的是,到函數的指針和到成員的指針都不能賦給

void*

 

5.8 避免在代碼裏使用非平凡的文字量(神祕的數)。相反,應該定義和使用各種符號常量。

   避免在代碼裏使用非平凡的文字量,即magic number。總是應該使用const或者枚舉來定義各種符號常量。如const double PI = 3.14159enum { NUMBER=128 }

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章