C++11新特性以及std::thread多线程编程
一 .C++11新特性
1. auto 類型推導
1.1 當=號右邊的表達式是一個引用類型時,auto會把引用拋棄,直接推導出原始類型;
1.2 當=號右邊的表達式帶有const屬性時,auto不會使用const屬性;
1.3 當const 和引用結合時,auto將保留表達式的const屬性;
2.auto使用限制
2.1 auto變量必須初始化;
2.2 auto不能在函數參數中使用;
2.3 auto不能用于類的非靜態成員變量;
2.4 auto不能定義數組;
2.5 auto不能作用于模板參數;
2.6 auto遍歷STL容器時,修改對象的值不會生效。
3.auto應用場景
3.1 auto用于定義STL中的迭代器;
3.2 auto用于泛型編程(模板類和模板函數等);
4.decltype關鍵字,與auto功能類似
4.1 decltype(exp) name = value
- decltype根據表達式exp推導類型,根據表達式的返回類型,但不可以是void;
4.2 如果exp是一個左值,或被()包圍,那么decltype((exp))或decltype(n = a+b)的類型就是exp的引用;
4.3 如果exp是一個函數,decltype(exp)并不會執行函數代碼。
5.推導類的非靜態成員變量或函數返回值類型使用decltype;
template<typename T> class Base {private:decltype(T().begin()) m_iter; }6.auto與decltype的區別
6.1 const與volatile,const表示只讀,而volatile表示數據易變,簡稱cv限定符;
6.2 auto可能會去掉cv限定符屬性,而decltype則會保留;
7.基于范圍的for循環
7.1 遍歷
7.2 不支持以指針形式返回的數組,只能遍歷有明確范圍的一組數據,當使用此方法遍歷容器時,對某些容器,在遍歷過程中動態添加元素會導致出錯。
8.基于右值引用的移動語義與完美轉發
8.1 通常將可位于賦值號(=)左側的表達式稱為左值,只能位于賦值號右側的表達式就是右值;
8.2 左值可以作為右值;
8.3 可獲取到存儲地址的表達式即為左值;
8.4 &只能操作左值,無法添加右值引用,右值引用采用&&來表示;
- 右值引用必須立即進行初始化,且只能使用右值進行初始化;
9.移動語義
9.1 用一個對象初始化一個同類對象 -> 復制構造函數;
9.2 移動構造函數,使用右值引用的形式作為函數參數;
9.3 默認情況下,左值初始化同類對象只會調用拷貝構造函數完成,如果想要調用移動構造函數,則必須使用右值進行初始化,為滿足這個需求,引入了std::move函數,它可以將左值強制轉化為對應的右值,因此而調用移動構造函數;
10.完美轉發
10.1 在函數模板中實現參數的完美轉發;
10.2 將自己的參數完美的轉發給內部調用的其他函數,所謂完美,即不僅能準確的轉發參數的值,還能保證被轉發的參數的左、右值屬性不變;
-
很多場景是否實現完美轉發,直接決定了該參數的傳遞過程是使用拷貝語義還是移動語義;
-
注意:函數模板,使用右值引用定義參數,是一種萬能引用,既可以接收右值,也可以接收左值。
- 解決了無論傳入的是左值,還是右值,如何在函數內部連同其左,右屬性都傳入,引入了forword<T>(){forword<T>()}forword<T>();
11.nullptr關鍵字
替代NULL,0等指針復制;
12.智能指針
12.1 share_ptr
12.2 unique_ptr
- 每個unique_ptr指針都獨自擁有對其所指堆棧內存空間的所有權,與shared_ptr不同;
- 只提供移動構造函數;
- 自定義釋放規則;
12.3 weak_ptr
- 配合shared_ptr使用,不會使引用計數加1或減1,單獨使用無意義。
二.std::thread多線程使用心得
1.static_cast ,在編譯時進行類型檢查,而對于強制轉換則不會進行類型檢查;
- 用于基類,子類之間的轉換;
2.std::thread_hardware_concurrency(),獲取cpu硬件支持的并發數;
3.實現多線程讀取文件,每個線程對應一個文件,對多個文件的數據源進行讀取,結果匯總。
以下文作者實踐后編寫的多線程基本框架。
總結
以上是生活随笔為你收集整理的C++11新特性以及std::thread多线程编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构——队列的C语言实现
- 下一篇: C++学习——引用和指针