感慨時間過的好快,c++ 11出來都5年了,現在才開始學習,但為時也不晚;
主要是網上及身邊的朋友大肆宣揚c++ 11的某些優化,弄得別人心裡癢癢的,所以就花了3天學習了點基本知識,相對於整個c++ 11的新增來說就是九牛一毛;
先上一張c++ 11的圖:
詳解:2.lambda的使用;
詳解:3.統一初始化的語法;
詳解:4.delete和default函式
1.簡介
我們知道c++的編譯器在你沒有定義某些成員函式的時候會給你的類自動生成這些函式,比如,建構函式,拷貝構造,析構函式,賦值函式。有些時候,我們不想要這些函式,比如,建構函式,因為我們想做實現單例模式。傳統的做法是將其宣告成private型別。
在新的c++中引入了兩個指示符,delete意為告訴編譯器不自動產生這個函式,default告訴編譯器產生乙個預設的
2.例子
default:
structa
;delete:
structnocopy
;nocopy a;
nocopy b(a); //compilation error, copy ctor is deleted
解析:default看起來貌似毫無用處,本來就會預設構造,但如果有定義構造,編譯器就不會預設構造,這時候你用到default就是讓預設構造和自定義構造共存;如下:
structsometype
;3.delete兩個有用點:
a.讓物件只能生成在棧記憶體上;
structnonnewable ;
b.阻止函式的形參型別的呼叫;(若嘗試以 double 的形參呼叫 f(),將會引發編譯期錯誤, 編譯器不會自動將 double 形參轉型為 int 再呼叫f())
voidf(inti);
voidf(double) = delete;
5.nullptr 和委託建構函式
1.題外話
c/c++的null巨集是個被有很多潛在bug的巨集。因為有的庫把其定義成整數0,有的定義成 (void*)0。在c的時代還好。但是在c++的時代,這就會引發很多問題
2.nullptr 是強型別的。
voidf(int); //#1
voidf(char*);//#2
//c++03
f(0); //二義性
//c++11
f(nullptr) //無二義性,呼叫f(char*)
3.所有和指標相關的地方都用nullptr,包括函式指標和成員指標;
const char *pc=str.c_str(); //data pointers
if (pc!=nullptr)
cout<
6.右值引用和move語意
1.目的
a.消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率;
b.能夠更簡潔明確的定義泛型函式;
2.左值的宣告符號為「&」,為了和左值區分,右值宣告符為「&&」;
例子: void process_value(int& i)
void process_value(int&& i)
int main()
3.但是如果臨時物件通過乙個接受右值的函式傳遞給另乙個函式時,就會變成左值,因為這個臨時物件在傳遞過程中,變成了命名物件。
void process_value(int& i)
void process_value(int&& i)
void forward_value(int&& i)
int main()
7.override和final
1.解釋;
override:表示派生類應當重寫這個基類中的這個虛函式;
final: 表示派生類不應當重寫這個虛函式;
//overrride例子
classb
; for (auto i:vec)
c 11學習(學中總結)
說是學中總結其實基本每節課的重要知識點我之前都寫過部落格總結過了,所以這注定是乙個不羅列知識點的文章而更像是一篇總結的總結與這些天來的感受。進入下學期已經接近乙個月了,程式設計也不再像上學期的授課方式一樣了,這學期的程式設計多了枯燥的概念與知識點還有許多c 裡的規矩,每次看見物件導向的程式設計課本,...
c 11 特性學習
auto 含義改變,現為自動型別推斷 register c 11之前為建議使用cpu暫存器儲存變數,現在幾乎沒有意義 include include include include include include using namespace std initial intsum initiali...
c 11學習筆記
c 98的 std auto ptr已經被徹底遺棄了,取而代之的是unique ptr shared ptr與weak ptr。大部分時候我們自己手動申請記憶體方式記憶體都是沒有問題的,問題是如果程式很大了之後,乙個複雜的物件,多次拷貝的代價非常高,很多地方都會使用到,只存在乙份拷貝顯然是最好的,這...