C++標準
1. C++標準簡介
The document specifies requirements for implementations of the C++ programming language.
美國國家標準局(American National Standards Institute, ANSI) 在1990年設立了一個委員會(ANSI X3J16),專門負責制定C++標準(ANSI制定了C 語言標準),國際標準化組織(the International Organization for Standardization, ISO) 很快通過自己的委員會(ISO-MG-21) 加入了這個行列,創建了聯合組織 ANSI/ISO,致力于制定C+標準,
第一版,國際標準 ISO/IEC 14882:1998,于 1998 年獲得 ISO、IEC(the International Electrotechnical Commission, 國際電工技術委員會) 和ANSI的批準,該標準常被稱為C++98,它不僅描述了已有的 C++特性,還擴展了C++、添加了例外、運行階段型別識別(RTTI)、模板和標準模板庫(STL),
第二版,ISO/IEC 14882:2003,對C++98的技術性修訂,主要修訂錯誤,減少多義性,沒有改變語言特性,該版本稱為C++03.
第三版,ISO/IEC 14882:2011,2011年9月11日正式發布,增加了許多新的語言特性,該版本稱為C++11,還曾被稱為C++ 0x,x曾預期為7或8.
第四版,ISO/IEC 14882:2014,在11基礎上進行細微的完善和改進,該版本稱為C++14. 包括:允許二進制字面量int var = 0b110;
'0b'或 '0B'開頭,但只能用來表示整型,
第五版,ISO/IEC 14882:2017,增加了一些特性,如允許命名空間嵌套定義,用新語法來定義函式的例外規格,引入新語法-推斷指引(Deduction Guildes)等,該版本稱為C++17.
第六版,ISO/IEC 14882:2020,2020年12月發布,官方檔案ISO/IEC 14882:2020(en), Programming languages — C++.
第七版,ISO/IEC DIS 14882,正在開發中,ISO官網 https://www.iso.org/standard/83626.html
擴展:c++14新增語法和標準庫特性_-飛鶴-CSDN博客
2. C++11新特性
-
統一的串列初始化方式,擴大了串列初始化的適用范圍,使其可用于所有內置型別和用戶定義的型別(類的物件),并且,使用初始化串列時,可添加等號”=”,也不省略,
int x1 = {5}; int x2 {55}; short nums[3] {1,2,3};
串列初始化禁止縮窄變換,即一個較大的數放進一個較小型別的變數里,但允許較窄型別的數放進較寬型別的變數里,
類物件也可使用串列初始化,若類的某個建構式接收模板類initializer_list作為函式的引數,則初始化串列語法只能用于該建構式,
-
關鍵字宣告
auto以前是一個存盤型別說明符,動態存盤,C++11將其用于自動型別推斷,必須進行顯式初始化,
decltype根據運算式型別定義變數型別,在使用模板函式時很方便,推導變數型別,
decltype(x*n) y; // y的型別是x*n運算式的型別,
-
函式的回傳型別后置
double f1(double, int); auto f1(double, int) –> double;
-
此前,typedef可用于給資料型別起別名,現增加一種創建別名的語法 using = :
using itType = vector<string>:: iterator;
using 還可用于給模板類起別名,如vector、array等,
-
nullptr空指標
空指標是不會指向有效資料的指標,此前,使用0來表示該指標,但和整型的0沖突,C++11新增nullptr表示空指標,是指標型別,不可轉換為整型,仍允許使用0來表示空指標,為向后兼容,因此nullptr==0 為true,
-
智能指標
new的記憶體需要程式員顯式delete釋放,舊版本提供auto_ptr來自動完成該程序,但C++11廢棄auto_ptr,新增3種智能指標unique_ptr,shared_ptr,weak_ptr,
auto_ptr,unique_ptr,shared_ptr相當于物件,當指標的生命周期到時時,(在區域函式里,函式呼叫結束,堆疊釋放,auto_ptr等自然不復存在),指標的解構式將使用delete來釋放所指向的記憶體空間,
auto_ptr<int> pt (new int);
需
#include <memory>
,智能指標模板位于名稱空間std中,智能指標定義時當作物件,使用時當作普通指標即可,由于智能指標會自動釋放堆記憶體,要嚴格注意指標間賦值操作,但普通指標不需要有這種困擾,
unique_ptr采用所有權模型,在一個作用域內,只能有一個指標指向同一塊堆記憶體,unique_ptr在編譯期檢錯;auto_ptr采用所有權模型,在運行期檢錯;shared_ptr,采用參考計數,允許多個指標指向同一塊堆記憶體,
-
作用域內的列舉enum
以前,同一作用域中不同列舉型別的成員不能重名,由于不同的實作可以選擇不同的底層型別,因此列舉可能不能完全移植,C++新增列舉宣告,添加class或struct定義,
enum class color {red, yellow, blue};
參考特定列舉值需要顯式使用限定符,如New1::never, New2::never.
-
類
C++11允許類定義里初始化成員變數,但建構式里對成員變數的修改會覆寫初始化的值,
建構式被繼承和彼此呼叫
管理虛方法virtual:以前,如果子類的同名函式
-
右值參考
傳統的參考可關聯左值,左值可出現在賦值陳述句的左邊,可獲取地址,但const常量可獲取地址,但不能賦值,
const int b = 0; const int & rb = b; // 參考前必須也加const
C++11新增右值參考,用&&表示,右值是可以出現在”=”右邊,但不能對其應用地址運算子的值,包括字面常量(C風格字串除外,它表示地址)、運算式、回傳型別為數值型別的函式,
int && rt = 13; // 相當于int rt = 13; rt可以獲取地址,改變值,
引入右值參考的主要目的是實作移動語意,
-
移動語意允許將1個物件的資源所有權從自己轉移到另一個物件,而不需進行昂貴的復制操作,
std::move()
,如unique_ptr智能指標,拷貝建構式:創建新物件,分配記憶體和復制資料
移動建構式:使用右值參考來接收1個臨時物件或1個即將被銷毀的物件,將其資源所有權轉移到新物件中,只涉及指標的復制,
-
模板類和標準模板庫(STL, Standard Templates Library)
C++11新增STL容器unordered_map, unordered_multimap, unordered_set, unordered_multiset, forward_list(單向鏈表,對比于雙向鏈表list),前4種使用哈希表實作,新增模板array(就是個陣列array<int, 5>,定義之后長度不可變,因此沒有push_back等方法),
對于內置陣列,含有方法begin(), end()的類,如string,和STL容器,可使用
for(auto/type x: container)
回圈,若要修改x的值,則使用參考for(auto/type &x: container)
,新增cbegin(), cend(),是begin(), end()的const版本,防止對原容器的元素進行誤改等操作,
begin(), end(), 分別指向容器的第一個元素,容器最后一個元素的后面,rbegin(), rend(), 分別指向容器的最后一個元素,容器第一個元素的前面,聯合使用達到逆序遍歷的效果,crbegin(), crend()是其const版本,
舊版使用嵌套模板時,尖括號要用空格分開,防止與運算子”>>”混淆,
vector<list<int> > vec;
C++11不再要求,
vector<list<int>> vec;
-
多執行緒
新增 執行緒支持庫<thread>, <mutex>, <condition_variable>和<future>
新增 原子操作庫
關鍵字thread_local,靜態存盤,與每個執行緒系結一個,持續性和系結的執行緒一致,
-
Lambda運算式/Lambda函式
lambda函式也叫lambda運算式,就是匿名函式,C++11中,對于接收函式指標或函式符(STL中函式物件)作為引數的函式,可以使用lambda作為引數,
lambda運算式定義的地方和呼叫的地方在同一個地方,便于除錯和修改代碼,通常lambda沒有名字,也可給lambda指定名稱,
auto func = [] (int x) {return x % 3 == 0;}; // 給lambda指定名稱func bool res = func(3);
當lambda函式體只有一條陳述句時,如只有一條return,可不顯式寫回傳型別,由decltype推斷,否則,需要顯式寫回傳型別,采用回傳型別后置的格式,如下:
[] (int x) –> int {x = 1; return x % 3;};
lambda捕獲方式主要有三種:值捕獲、參考捕獲和隱式捕獲,使lambda函式體內可使用外部所有動態變數,有兩種方式傳入外部變數,一種是參考&,一種是值=,如果只傳特定變數(顯式捕獲),則傳值方式時可省略=(值捕獲),傳參考方式不可省略&(參考捕獲),傳全部的外部變數時(隱式捕獲),值方式用“=”標識所有變數,參考方式用“&”,捕獲的變數放進 [] 里宣告,
[m,&n] (int x) –> int {x = m; return x % 3;}; // 值捕獲:m傳值,參考捕獲:n傳參考 [=] (int x) –> int {x = n; return x % 3;}; // 隱式捕獲:外部所有變數都通過值方式傳遞 [&] (int x) –> int {x = n; return x % 3;}; // 隱式捕獲:外部所有變數都通過參考方式傳遞 [=,&n] (int x) –> int {x = n; return x % 3;}; // 表示n以參考方式傳遞,剩余變數以值方式傳遞 // 隱式捕獲與顯式捕獲混用時,隱式捕獲必須是[]里第一個引數
一些注意事項和詳細例子:C++ lambda運算式詳細講解2-隱式捕獲與顯式捕獲-bingma03的博客-CSDN博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556225.html
標籤:其他
下一篇:返回列表