C 11新特性總結 二

2022-01-12 18:34:12 字數 3052 閱讀 6433

c++11 引入了一種更為簡單的for語句,這種for語句可以很方便的遍歷容器或其他序列的所有元素

vectorvec = ;

for(int x: vec)

;

如果要定義指向這個陣列的指標呢:

int (*p_arr)[10] = &arr; //注意:int *p_arr[10] 表示乙個陣列,有10個元素,元素型別是int*

如果要定義乙個函式,這個函式接受乙個char型別的引數,並返回乙個指向10個int型別陣列的指標呢:

int (*func(char x))[10];

這樣的宣告是不是看的頭都大了,其實我們可以簡化一點,一般情況下我們可以使用別名進行簡化,比如:

typedef int arr[10] ; // 定義乙個型別 arr這是乙個陣列型別,含有10個int型別的元素

using arr = int[10] ; // 同上

再定義如上的函式:

arr * func(char x) ; // 函式返回的型別是 arr* 也就是指向具有10個int元素陣列的指標

當然在c++11中我們可以用之前講到過的另外乙個關鍵字decltype:

decltype(arr) * func(char x) ; // decltype(arr)表示式會獲得arr的型別

最後就輪到我們本節要說的c++11的另外乙個特性,尾置返回型別,任何函式都可以使用尾置返回型別,這種形式對於返回型別比較複雜的函式最有效,比如上面的函式可以使用如下方式:

auto func(char x) -> int(*) [10];

這種形式將函式的返回型別寫在函式宣告的最後面,並且在函式形參列表後面加上 -> 符號,然後緊接著是函式需要返回的型別,由於函式的返回型別被放在了形參列表之後,所以在函式名前面使用乙個 auto替代。

在c++的類中,如果我們沒有定義建構函式,編譯器會為我們合成預設的無參建構函式,如果我們定義了建構函式,則編譯器就不生成預設建構函式了,但是如果我們定義建構函式同時也希望編譯器生成預設建構函式呢? c++11中可以通過在建構函式的宣告中直接  =default的方式要求編譯器生成建構函式。

class classname;

class classname

;

lambda表示式是乙個可以被呼叫的**單元,相當於乙個內聯函式,有引數和返回值以及函式體。但是跟函式不同的是,lambda表示式可以定義在函式的內部,乙個完整的lambda表示式具有如下形式:

[捕獲列表](引數列表) mutable -> 返回型別

int x = 10;

int y = 20;

auto f = [x,&y](int a ,int b);

cout有關bind函式,在很多地方我們可以使用函式替換lambda表示式,畢竟如果很多地方需要用到同乙個lambda表示式,而且這個lambda表示式比較長的話,將其定義成函式應該是最好的。對於沒有捕獲列表的lambda表示式我們可以直接使用函式替代,例如:

void main()

; f();

}

我們可以用下面的方式替代:

int f(int x,int y)

void main()

與上面的lambda是等價的,但是對於有捕獲列表的lambda表示式應該怎麼處理呢,例如:

void main()

; //乙個值捕獲,乙個引用捕獲

f(33,44);

}

如果轉換成函式的形式:

int x = 10;

int y = 20;

int f(int a,int b)

void main()

這是一種可行的方法,但是總不能把所有的捕獲變數定義成全域性變數吧。現在的關鍵問題是lambda的捕獲表示式中的內容轉換成函式不可行,c++11提供了bind函式來完成這樣的操作。

#include //bind()

#include using namespace std;

using namespace std::placeholders; // _1,_2所在的命名空間

int f(int x,int y,int a,int b)

void main()

c++11中提供了名為function的標準庫型別,定義在標頭檔案中,該型別用來儲存乙個可呼叫的物件,統一了所有可以像函式一樣呼叫的呼叫形式,例如:

#include #include using namespace std;

int add(int x,int y)

class add

};void main()

; //lambda表示式

cout《實際上c++11中除了一些語法特性新增之外,還增加了一些新的庫。例如array相當於我們傳統使用的定長陣列,支援隨機訪問,不能新增刪除元素,不可以像vector一樣增長,使用array比傳統陣列更加安全。

forward_list是c++11中增加的單向鍊錶

regex則是c++11中新增的正規表示式庫

auto 定義:可以讓編譯器自動推算定義的變數型別,而不需要寫長長的一串型別,特別是在含有迭代器的型別上。

decltype :可以根據已知的變數來定義乙個跟該變數一樣的型別。

lambda:個人認為這是c++11中增加的最驚豔的特性之一,對應的還有bind()函式,其實這些內容是從boost中來的。

智慧型指標:shared_ptr 雖然在以前的c++中有類似auto_ptr的智慧型指標,但是auto_ptr有一些缺陷並不算很好用。

function型別:標準庫的function型別定義了一種可呼叫物件,該型別統一了所有可以當作函式一樣呼叫的呼叫形式,例如lambda,函式指標,過載了函式呼叫運算子()的類物件等,該特性也是參考了boost庫。

regex庫:c++11中總算有了方便的regex可以使用了。

c++11新特性總結 (一)

C 11 新特性總結

vs2012以上版本支援 一.auto的使用 auto func less 自動表示函式指標 auto ite vector a.begin 自動表示stl的迭代器 auto p new foo 自動表示變數指標等變數 二.decltype int x 3 decltype x y x 從變數或表示...

c 11 新特性 (二)

1.nullptr 專門形容指標為空 2.強類列舉 enum direction enum answer 3靜態斷言,可在編譯時作判斷 static assert size of int 4 4.建構函式的相互呼叫 delegating constructor class a a int x,int...

C 11新特性 二

目錄 default,delete 配合建構函式和拷貝賦值 一起使用 alias template template typedef type alias別名 using noexcept override final decltype lambda 右值引用 對於乙個空的class c 編譯器處理...