5.19 auto
vector<string> v;auto s1=v[0]; // 創建一份v[0]const auto& s2=v[0];優點: C++類型名有時很長的, spare_hash_map<string,int>::iterator iter= m.find(val); 返回類型是不是很難讀啊 不過代碼是可以重構成 auto iter = m.find(val);
auto 只能用在局部變量里,其他地方別用。 auto 和C++11 特性[尾置返回類型 trailing return type] 一起用, 不過后者只能用在lambda表達式里。
5.20 列表初始化
5.21. Lambda 表達式 適當的使用,顯示使用Lambda捕獲,不要使用默認的。 Lambda表達式是創建匿名函數對象的一種簡易途徑,常用于把函數當 做參數傳遞。
std::sort(v.begin(),v.end(),[](int x,int y){ return Weight(x)<Weight(y);});(polymorhpic wrapper) std::function
優點: 傳函數對象給STL算法,Lambdas 非常方便
缺點: Lambdas 的變量捕獲旁門左道,可能造成懸空指針 層層的嵌套的Lambda的匿名函數難以閱讀。
顯示捕獲 [n](int x) {return x+n;} 這樣讀者更加容易知道n是捕獲值5.22 模板編程 不要使用復雜的模板編程。
利用C++模板實例化機制是圖靈完備性。可以用來實現編譯時刻 的類型判斷的一系列的技巧。
優點: 模板編程能夠實現非常靈活的類型安全的接口和極好的性能。
5.23 Boost 庫 只使用Boost庫中被認可的庫
什么是Boost庫? Boost庫是一個廣受歡迎的,經過同行鑒定的免費開源的C++庫
6.命名約定
6.1. 通用命名規則
6.3. 類型命名 所有類型命名 —— 類, 結構體, 類型定義 類型名稱的每個單詞首字母均大寫, 不包含下劃線
全局變量:可以用 g_ 或其它標志作為前綴, 以便更好的區分局部變量.
6.5. 常量命名 const int kDaysInAWeek = 7; 6.6. 函數命名 … 7. 注釋 7.2. 文件注釋 在每一個文件開頭加入版權公告, 然后是文件內容描述. 1.版權聲明 (比如, Copyright 2008 Google Inc.) 2.許可證. 為項目選擇合適的許可證版本 (比如, Apache 2.0, BSD, LGPL, GPL) 3.作者: 標識文件的原始作者.
7.3. 類注釋
每個類的定義都要附帶一份注釋, 描述類的功能和用法.
// Iterates over the contens of a GargantuanTable. sample usage// GargantuanTable_Iteratar * iter = table->NewIterator()// for(iter->Seek("foo");!iter->done();iter->Next()){// PRocess(iter->key(),iter->value());//}// delete iter;class GargantuanTable_Iteratar{ ...};7.4. 函數注釋
函數的輸入輸出. 對類成員函數而言: 函數調用期間對象是否需要保持引用參數, 是否會釋放這些參數. 如果函數分配了空間, 需要由調用者釋放. 參數是否可以為 NULL. 是否存在函數使用上的性能隱患. 如果函數是可重入的, 其同步前提是什么?
// Returns an iterator for this table. It is the client's// responsibility to delete the iterator when it is done with it,// and it must not use the iterator once the GargantuanTable object// on which the iterator was created has been deleted.//// The iterator is initially positioned at the beginning of the table.//// This method is equivalent to:// Iterator* iter = table->NewIterator();// iter->Seek("");// return iter;// If you are going to immediately seek to another place in the// returned iterator, it will be faster to use NewIterator()// and avoid the extra seek.Iterator* GetIterator() const;注明構造函數對參數做了什么 (例如, 是否取得指針所有權) 以及析構函數清理了什么.
7.5. 變量注釋
7.6 實現注釋
注意 永遠不要 用自然語言翻譯代碼作為注釋. 要假設讀代碼的人 C++ 水平比你高, 即便他/她可能不知道你的用意:
7.7. 標點, 拼寫和語法
7.8. TODO 注釋 對那些臨時的, 短期的解決方案, 或已經夠好但仍不完美的代碼使用 TODO 注釋
7.9. 棄用注釋 通過棄用注釋(DEPRECATED comments)以標記某接口點(interface points)已棄用
8.格式 8.4. 函數聲明與定義
8.5. Lambda 表達式
其它函數怎么格式化形參和函數體,Lambda 表達式就怎么格式化;捕獲列表同理。
若用引用捕獲,在變量名和 & 之間不留空格。 8.10. 指針和引用表達式 句點或箭頭前后不要有空格. 指針/地址操作符 (*, &) 之后不能有空格.
8.13. 變量及數組初始化
用 =, () 和 {} 均可.
8.15. 類格式 訪問控制塊的聲明依次序是 public:, protected:, private:, 每次縮進 1 個空格.
8.17. 名字空間格式化 名字空間 不要增加額外的縮進層次
8.18. 水平留白
9.規則特例
新聞熱點
疑難解答
圖片精選