C++17代码整洁之道
C++17代碼整潔之道
C++代碼整潔的基本規范
良好的命名
- 名稱應該自解釋
- 使用域中的名稱
- 避免使用匈牙利命名法(即名稱前加類型)
- 不要通過注釋禁用代碼
函數
-
只做一件事情
-
函數體量要小
-
當你為函數找到一個富有表現力的名稱時,名稱中沒有連詞
-
圈復雜度低
-
函數的參數要少
-
-
函數盡可能小
函數應該很小,45行,做多1215行,不能再多了
-
使用容易理解的函數名
std::string head = html.substr(...);引入一個有意圖的名稱,將更加容易理解
std::string extractHtmlHeader(const std::string& html) {retrun html.substr(); } -
函數的參數和返回值
-
函數的參數越少越好
-
函數中最好不要有標志參數bool
使用bool類型說明你很有可能需要在函數中做判斷,那為什么不分別用兩個函數處理兩種情況呢
-
避免使用輸出參數,如果要返回多個參數請使用std::tuple
-
不要傳遞或者返回NULL或nullptr
原因:
- 導致很多空檢查,增加代碼復雜性
- 對象所有權問題
-
-
首先在棧上構造對象而不是在堆上
在堆上創建對象給創建者增加了管理資源的責任,而原來所擔心的昂貴的拷貝構造成本也不需要擔心了,因為C++11增加了std::move()移動語義,即允許資源從一個對象"移動"到另一個對象
-
在函數的參數列表中用**const引用代替指針**
-
如果一定要使用指針,請使用智能指針
-
盡量使用`const
用C++類型轉換代替C風格類型轉換
C風格:
float x{3.12}; int i = int(x);缺陷:不會在編譯期進行類型檢查可能產生錯誤
C++風格
int i = static_cast<int>(x);優點:在編譯期進行類型檢查
現代C++的高級概念
資源管理
-
資源申請即初始化
構造時獲得,析構時釋放
class Res final { public:Res() { sourse = new T(); }~Res() { delete sourse; } private:T* sourse; }; -
智能指針
-
具有獨占所有權的std::unique_ptr<T>
一個對象只能由一個std::unique_ptr<T>占有
class person { public: private:int age; }; std::unique_ptr<person> p1{ std::make_unique<person>() }; //類型推導更加的簡潔 auto p2{ std::make_unique<person>() };不允許調用std::unique<T>拷貝構造函數,但可以使用std::move將所持有的資源移動給另一個std::unique<T>,將在后續部分進行講解
-
具有共享所有權的std::shared_ptr<T>
std::shared_ptr<T>可以與其他std::shared_ptr<T>實例共享資源的所有權
std::shared_ptr<T>提供簡單且有限的垃圾回收功能,內部存在一個引用計數器
std::shared_ptr<person> s1 = std::make_shared<person>(); std::shared_ptr<person> s2; s2 = std::move(s1);上面例子并沒有修改智能指針計數,但在移動之后必須要小心使用s1,因為他可能是空的**(持有nullptr)**
3.無所有權但是能安全訪問的std::weak_ptr<T>
? 他對資源的生命周期沒有影響std::weak_ptr<T>僅僅觀察他所指向的資源
-
避免顯式的new和delete
new和delete會增加代碼的復雜度: 當不可避免的使用new和delete時,你必須處理異常情形
顯式的調用new和delete可以通過以下措施避免
- 盡可能使用棧內存,棧內存永遠不會泄露
- 用make function分配內存
- 盡量使用容器
-
管理特有資源
Move語義
什么是move語義呢?在許多情況下,舊的C++強迫我們使用復制構造函數,實際上我們并不想要對象的深拷貝,相反,我們只移動對象的負載就可以使用std::move
-
左值與右值的關系
左值與右值是歷史術語(這個翻譯的屬實垃圾)
左值更好的解釋是:一個locator value,一個在內存有位置的對象
相對于左值,右值是一個不是左值的對象,右值是一個臨時對象或者是子對象
字面值 42 是一個右值。在內存中沒有可標識的位置,所以不能為他賦值,當然,右值也可以占用棧上的數據區內存,但是這個內存是臨時分配的,而且復制完成后就會馬上釋放
-
右值引用
右值引用使優定位右值的內存成為可能,并且可以修改
int&& temp = 12 + 34; int* p1 = &temp; *p1 = 999; -
少用std::move()
編譯器自己會優化,自己少用
-
零原則
**缺陷:**違反了五大原則copy/move構造器以及copy/move賦值運算符都沒有顯示定義
int main() {Mystring astring("test",4);Mystring anotherstring{astring};return 0; }在這個實例中,我們拷貝的對象是存儲字符串的地址指針,而不是內存中指針指向的對象。
這就意味著,自動調用默認的復制構造函數后,兩個對象指向同一個內存,如果對象析構,將會導致雙重刪除,會造成嚴重的后果。
**零原則:**在你實現類的時候,應該不需要聲明或定義析構函數,拷貝構造賦值函數,移動構造賦值函數。用C++智能指針來管理資源
面向對象
類的設計原則
我太菜,以后理解到了再寫
總結
以上是生活随笔為你收集整理的C++17代码整洁之道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @Scheduled
- 下一篇: java 代码重用需要注意的事项_程序员