天天看點

[C++11新特性]第二篇

c++98可變數量參數

</blockquote>

可變函數模版

變長模版類

在并行程式設計、多線程程式設計中,對于共享資源的通路,需要通過添加互斥鎖的方法來保證正确性。在posix标準下,pthread庫,我們用lock方法來實作,如下:
而在c++11中,我們通過定義的原子類型即可很友善地實作。c++11定義很多原子資料類型,比如:atomic_bool,atomic_char,atomic_int等等。
太複雜,主要是硬體平台下記憶體讀寫順序一緻性.在c++11中,實作了很多記憶體順序的細節,比如順序一緻、松散、release-require、release-consume四種順序模型。
本節省略…….

在良好的程式設計習慣中,聲明一個變量時,同時初始化,在以前的習慣裡,如果聲明指針,一般初始化為0或null。

其中null為宏定義,在stddef.h中可見細節,一般被定義為0或(void*)常量。 在c++11中,定義了一個指針空值類型的常量:nullptr,大小和void*一緻。另有nullptr_t常量。
在c++中聲明自定義類,編譯器會自動生成預設函數:構造函數、拷貝構造函數、拷貝指派函數、移動構造函數、移動拷貝函數、析構函數。 還會自動生成預設操作符:operator,,operator&amp;,operator&amp;&amp;,operator*,operator-&gt;,operaotr-&gt;*,operator new,operator delete. 在以前的c++程式設計規則中,如果我們指定帶參數的構造函數,則需要重寫不帶參數,即預設構造函數。

在c++11中,通過default關鍵字來實作這個目标。如下:

在實作singleton模式中,我們需要将拷貝構造函數設為私有,在c++11中則更簡單,直接利用deleted關鍵字,訓示編譯器不生成函數的預設版本。

lambda函數的文法定義如下:      [capture](parameters) mutable –&gt;return-type {statement}
使用lambda函數作為stable_sort函數的調用對象。

code…各種各樣的lambda函數 捕獲清單的常見幾種形式: [var] 值傳遞捕獲var [=]值傳遞方式捕獲所有父作用域的變量,包括this [&amp;var]引用傳遞捕獲var [&amp;]引用傳遞捕獲所有父作用域的變量,包括this [this] 值傳遞方式捕獲目前this指針 值傳遞、引用傳遞可以混用,比如[=,&amp;a,b]等等。 仿函數,functor,函數對象,就i是重定義了成員函數operator()的一種自定義類型對象。比如在下面的例子中,test不是一樣函數,而是一個對象。仿函數廣泛地被用在stl中,在c++11中lambda也要被廣泛使用。

事實上,仿函數是編譯器實作lambda的一種方式,在現階段,通常編譯器會把lambda函數轉化為一個仿函數對象。 關于lambda和stl的聯系,它使得stl的算法使用更加友善,比如for_each,其原型是: unaryproc for_each(inputiterator beg,inputiterator end,unaryproc op) for_each算法第三個參數是一個單個參數的“函數”,即一個函數指針、仿函數或者lambda函數。 函數指針方法的缺陷是:往往定義在别的地方,閱讀代碼不友善;如果不進行inline優化,性能就比lambda函數差很多。而且函數指針的應用範圍小很多,相比函數指針、仿函數,lambda函數往往是最佳的選擇。 注:在c++98中,stl幫助我們定義了很多仿函數可直接使用。</blockquote>