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 編譯器處理...