今天在看微軟提供的windows8的相關開發文檔和Sample程序,發現有個C++程序的表達方式完全象天書,查了下,原來是C++0x/11新支持的Lambda表達式,本來一直懶得去看C++0x/11的說明,想等用到再去研究,今天趁這個機會稍微浏覽了下,大概整理了如下這些新特性,跟大家分享一下。
稍微吐槽下,C++0x/11是繼C++ 03後通過的最新的C++標准庫,對C++語法特性和開發庫兩方面都有了新的擴展,說實在話,這個出的也太晚了,03年到11年,IT技術日新月異,而C++標准庫才更新了一版,真是C++開發者的悲哀。
閒話表過,進入正題。
1. Lambda表達式
你不學絕對看不懂的一個C++ 11新表達方式。大家可能知道Boost裡有Lambda這個庫,c++ 11的Lambda功能類似,也是提供匿名函數外加支持類似"閉包"機制。如果要問什麼是匿名函數,什麼是閉包,這裡就不解釋了,相信有點javascript基礎的都明白。
言歸正傳,C++ 11中Lambda表達式的標准形式是:
[外部變量](參數)->返回值 {函數體}
其中““->返回值”部分可以省略,如果省略則會有返回值類型推導。(類型推導在後面auto中會進行說明)
關於外部變量的傳遞方式如下:
[]
無任何外部變量
[x, &y]
x以傳值方式導入,y以引用方式導入
[&]
所有變量都以引用方式導入
[=]
所有變量都以傳值方式導入
[&, x]
除x以傳值方式導入外,其他變量以引用方式導入
[=, &z]
除z以引用方式導入外,其他變量以傳值方式導入
一個簡單的例子:
[cpp]
int first = 0;
int second = 0;
int third = 1;
int result = [first, &second](int p)->int{
//first++; 改變值傳遞的外部參數,編譯器會報錯
second++;
return first + second + p;
}(third);
結果:first = 0, second = 1, result = 2
2. 自動類型推導auto
不多解釋了,看下面這些結果就明白了。
[cpp]
auto x = 0; // 因為0是int型,所以x為int類型,
auto y = 3.14; // y 為double類型
auto也可以讓代碼更簡單,比如:
[cpp]
vector<int>::const_iterator it = v.begin();
可以寫成:
[cpp]
auto it = v.begin();
但是濫用auto也會讓程序可讀性變差,比如:
[cpp]
auto obj = SomeFunction(); // 看不出函數到底返回了什麼類型
而這樣用就沒有任何問題:
[cpp]
auto obj = new SomeObject();
3. 初始化語法
通過{}來進行初始化,有如下特性(以前C++是不支持的):
[cpp]
int* x = new int[2]{1, 2};
vector<int> v = {1, 2};
另外還支持java方式的初始化
[cpp]
class tempObj {
public:
int x = 10;
};
4. delete 和 default 函數
delete告訴編譯器不自動產生默認函數,default恰恰相反,它讓編譯器產生一個默認函數。比如以前C++的類一旦定義了構造函數,就不再支持默認構造函數,C++ 11可以通過default來實現。
[cpp]
class NewObj
{
NewObj() = default; // 使用默認構造函數
NewObj(int value);
};
5. nullptr
避免了曾經NULL的缺陷,所以C++11裡,指針初始化都應該設為nullptr。
線程庫,智能指針等新功能,這裡就不說明了,基本概念都類似,使用的時候一查就明白了。
這裡省略n種新特性,等以後我看了再分享吧。
摘自 my_business的專欄