C++11的新特性

空指針

nullptr 空指針的字面值常量质和,它的類型是std::nullptr_t(定義位于cstddef)

自動類型推斷

auto關(guān)鍵字稳摄,由auto定義的變量必須初始化。

統(tǒng)一初始化和初始化列表

C++11 introduced the concept of uniform initialization, which means that for any initialization, you can use one common syntax. This syntax uses braces, so the following is possible now:

int values[] { 1, 2, 3 };

std::vectorv { 2, 3, 5, 7, 11, 13, 17 };

std::vectorcities {"Berlin", "New York", "London", "Braunschweig", "Cairo", "Cologne"};

std::complexc{4.0,3.0}; // equivalent to c(4.0,3.0)

使用初始化列表初始化時饲宿,不提供初始值時默認值初始化(0或nullptr)厦酬,其他初始化方式若為提供初始值則值是未定義的。

int i; // i has undefined value

int j{}; // j is initialized by 0

int* p; // p has undefined value

int* q{}; // q is initialized by nullptr

使用初始化列表初始化時瘫想,若提供的值會將會損失精度時弃锐,編譯器報錯。

int x1(5.3); // OK, but OUCH: x1 becomes 5

int x2 = 5.3; // OK, but OUCH: x2 becomes 5

int x3{5.0}; // ERROR: narrowing

int x4 = {5.3}; // ERROR: narrowing

char c1{7}; // OK: even though 7 is an int, this is not narrowing

char c2{99999}; // ERROR: narrowing (if 99999 doesn’t fit into a char)

std::vector<int>v1 { 1, 2, 4, 5 }; // OK

std::vector<int>v2 { 1, 2.3, 4, 5.6 }; // ERROR: narrowing doubles to ints

std::initializer_list<>使得函數(shù)支持傳入多值(通過初始值列表)

void print (std::initializer_list<int> vals){

? ? ? ? ? ?for (auto p=vals.begin(); p!=vals.end(); ++p) {?

? ? ? ? ? ? ? ? ? ? std::cout << *p << "\n";

? ? ? ? ? ? ? ? ? ? }

}

print ({12,3,5,7,11,13,17}); // pass a list of values to print()

基于范圍的循環(huán)表達式

for ( decl : coll ) {

? ? ? ? statement

}

coll必須是支持迭代器的容器殿托,或者是數(shù)組霹菊,或者是值列表類型

移動語義和右值引用

避免無意義的拷貝和暫存變量。

The programmer, however, has to specify that a move?is possible unless a temporary is used.

std::move(),位于<utility> 旋廷。std::move(x)本身不會進行移動操作鸠按,只是將臨時變量轉(zhuǎn)換為一個右值引用(X &&x,使用雙&聲明饶碘,表明右值是可以修改的)目尖,表明此臨時變量x將不會再使用了,可以將它的內(nèi)容據(jù)為己有(不需要拷貝)扎运。

移動之后不再使用原來的變量瑟曲,原來的變量有效但是狀態(tài)未定義。

void foo(X &x);//只接受左值

void foo(const X &x);//接受左值和右值

void foo(X &&x);//接受右值

原始字符串字面值豪治、被編碼的字符串字面值

Raw String Literals

此類型的字符串可包含特殊字符洞拨,語法R"delim(...)delim",delim是16個基本字符組成的分隔符除了反斜杠负拟,空格烦衣,圓括號;

例如:R"(\\n)"對應的普通字符串是"\\\n"

常用來定義正則表達式掩浙。

Encoded String Literals

使用編碼前綴花吟,定義特殊編碼的字符串常量:

u8:utf-8,const char

u:char16_t

U:char32_t

L:wchar_t

關(guān)鍵字noexcept

聲明一個函數(shù)不能或不準備拋出異常。

void foo() noexcept;

若在foo函數(shù)內(nèi)部沒有處理發(fā)生的異常厨姚,程序會終止衅澈,調(diào)用std::terminate(),它默認調(diào)用std::abort();

關(guān)鍵字constexpr

使得表達式在編譯期間判斷是否是常量谬墙,或者修飾返回值返回一個常量今布。

constexpr int square (int x){

? ? ? ? ? ? ? ?return x * x;

}

float a[square(9)]; // OK since C++11: a has 81 elements

模板特性

Variadic Templates

可變模板參數(shù)個數(shù),例如處理不同類型的參數(shù)

void print (){}

template<typename T, typename... Types>

?void print (const T& firstArg, const Types&... args)

{

? ? ? ? ? ?std::cout << firstArg << std::endl; // print first argument

? ? ? ? ? ? print(args...); // call print() for remaining arguments

}

Alias Templates (Template Typedef)

template<typename T>

using Vec = std::vector>; // standard vector using own allocator

Vec coll;//即std::vector<int, MyAlloc<int>> coll;

lambda表達式

基本語法:

[ capture list ] { function body } 或

[ capture list ] ? ( paramters list ) ? mutable ? throwSpec ? -> retType { function body }

mutable芭梯、 ?throwSpec险耀、 ?-> retType 可選

調(diào)用:直接調(diào)用弄喘、生成lambda變量間接調(diào)用

[ ] { std::cout << "hello lambda" << std::endl; } (); 或

auto func = [ ] (const std::string &s){ std::cout << "hello lambda" ?<<s << std::endl; };

func("good");

使用尾置返回:

未指明返回值類型時玖喘,若只有一個return語句,根據(jù)返回值自行推斷蘑志;若有其他語句則返回void累奈。

捕獲規(guī)則:全局變量不用捕獲即可使用

[ ]:不捕獲任何變量

[=]:值捕獲本作用域外變量

[&]:引用捕獲作用域外變量

[x, &y]:顯式值捕獲x,引用捕獲y

[=, &y]:值捕獲除y的所有變量急但,y為引用捕獲

[&, x]:引用捕獲除x的所有變量澎媒,x為值捕獲

值捕獲變量在定義lambda時就已經(jīng)確定,在內(nèi)部不可更改其值波桩,但使用mutable說明符可以使之改變戒努。

lambda的類型

lambda的類型是匿名函數(shù),每個不同的lambda的類型是不一樣的镐躲。

#include<functional>

例如表達式

[ ] (int a, int b) -> int { ?return a + b; }

的類型是std::function<int(int ,int)>储玫,用作返回值類型侍筛,可以返回一個lambda對象

std::function<int(int, int)>returnLambda () {

? ? ? ? ? ? return [] (int x, int y) { return x*y; };

}

auto f = returnLambda();

cout <<f(1,2)<<endl;

關(guān)鍵字decltype

編譯器推斷表達式的類型:用于聲明返回值類型,元編程或傳遞lambda的類型

std::map<std::string, sloat> coll;

decltype(coll)::value_type elem;

新的函數(shù)聲明語法

template<typename T1, typename T2>

auto add(T1 x, T2 y) -> decltype(x+y);//尾置返回撒穷,確定返回類型必須預先知道x,y的類型匣椰,但返回類型推斷放在函數(shù)名前面無效(x,y類型此時未知)

作用域枚舉(強枚舉,枚舉類)

enum class Salutation : char { mr, ms, co, none };

1端礼,不可隱式的轉(zhuǎn)換到int或從int轉(zhuǎn)換

2禽笑,使用作用域運算符引用Salutation::mr;

3,可以顯式定義類型(:char)蛤奥,否則默認是:int

4佳镜,可前向聲明枚舉類型

新的基本數(shù)據(jù)類型

char16_t, char32_t, long long, unsigned long long ,std::nullptr_t

其他新特性

Nontype Template Parameters

bitset<32> flags32; // bitset with 32 bits

bitset<50> flags50; // bitset with 50 bits

Default Template Parameters

template<typename T, typename container = vector<T>>

class MyClass;

MyClass<int> x1;//即MyClass<int, vector<int>>

Keyword typename

用來說明其修飾的東西是類型

Member Templates

類的成員函數(shù)可以為模板

Nested Class Templates

嵌套類也可以為類模板

顯式初始化基本數(shù)據(jù)類型

使用不帶參數(shù)的顯式構(gòu)造初始化基本數(shù)據(jù)類型時,為0初始化(所有值都為0)

int i1; // undefined value

int i2 = int(); // initialized with zero

int i3{}; // initialized with zero (since C++11)

main函數(shù)的定義

1喻括,

int main{}

2,

int main (int argc, char* argv[]){}

不一定要return 語句邀杏,隱式返回0,表示成功執(zhí)行唬血;返回非0則表示出錯望蜡;

不使用return來結(jié)束程序可使用exit(), quick_exit(), terminate();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拷恨,隨后出現(xiàn)的幾起案子脖律,更是在濱河造成了極大的恐慌,老刑警劉巖腕侄,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小泉,死亡現(xiàn)場離奇詭異,居然都是意外死亡冕杠,警方通過查閱死者的電腦和手機微姊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來分预,“玉大人兢交,你說我怎么就攤上這事×裕” “怎么了配喳?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凳干。 經(jīng)常有香客問我晴裹,道長,這世上最難降的妖魔是什么救赐? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任涧团,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泌绣。我一直安慰自己喳瓣,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布赞别。 她就那樣靜靜地躺著畏陕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仿滔。 梳的紋絲不亂的頭發(fā)上惠毁,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音崎页,去河邊找鬼鞠绰。 笑死,一個胖子當著我的面吹牛飒焦,可吹牛的內(nèi)容都是我干的蜈膨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺荠,長吁一口氣:“原來是場噩夢啊……” “哼翁巍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起休雌,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灶壶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杈曲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驰凛,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年担扑,在試婚紗的時候發(fā)現(xiàn)自己被綠了恰响。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涌献,死狀恐怖胚宦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁奈,我是刑警寧澤间唉,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布绞灼,位于F島的核電站利术,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏低矮。R本人自食惡果不足惜印叁,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轮蜕,春花似錦昨悼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汇竭,卻和暖如春葱蝗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背细燎。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工两曼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人玻驻。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓悼凑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親璧瞬。 傳聞我的和親對象是個殘疾皇子户辫,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容