国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

掀起C++ 11的神秘面紗

原創(chuàng)
開發(fā) 新聞
C++之父Bjame Stroustrup最近說C++11就像一個新語言,的確,C++11核心已經(jīng)發(fā)生了巨大的變化,它現(xiàn)在支持Lambda表達(dá)式,對象類型自動推斷,統(tǒng)一的初始化語法,委托構(gòu)造函數(shù),deleted和defaulted函數(shù)聲明nullptr,以及最重要的右值引用。

【51CTO 6月21日外電頭條】C++之父Bjame Stroustrup最近說C++11就像一個新語言,的確,C++11核心已經(jīng)發(fā)生了巨大的變化,它現(xiàn)在支持Lambda表達(dá)式,對象類型自動推斷,統(tǒng)一的初始化語法,委托構(gòu)造函數(shù),deleted和defaulted函數(shù)聲明nullptr,以及最重要的右值引用。

 [[33955]]

【編輯推薦】

C++0x FAQ中文版(http://imcc.blogbus.com/logs/106046323.html

C++11標(biāo)準(zhǔn)庫也使用新的算法,新的容器類,原子操作,類型特征,正則表達(dá)式,新的智能指針,async()函數(shù)和多線程庫進(jìn)行了改造。

C++11的新內(nèi)核和庫特性完整列表請移步這里(http://www2.research.att.com/~bs/C++0xFAQ.html) C++標(biāo)準(zhǔn)在1998年獲得通過后,有兩位委員會委員預(yù)言,下一代C++標(biāo)準(zhǔn)將“肯定”包括內(nèi)置的垃圾回收器(GC),但可能不會支持多線程,因為定義一個可移植的線程模型涉及到的技術(shù)太復(fù)雜了,13年后,新的C++標(biāo)準(zhǔn)C++11也接近完成,你猜怎么著?讓那兩位委員沒想到的是,本次更新還是沒有包括GC,但卻包括了一個先進(jìn)的線程庫。

在這篇文章中,我將介紹C++11標(biāo)準(zhǔn)中發(fā)生的***變化,以及為什么應(yīng)該引起注意,正如你將看到的,線程庫不是唯一的變化,新標(biāo)準(zhǔn)采納了數(shù)十位專家的意見,使C++變得更有意義。正如Rogers Cadenhead指出的那樣,它們就像迪斯科、寵物石和長胸毛的奧運(yùn)游泳選手一樣不可思議。

首先,讓我們看看C++11核心語言的一些突出特性。

Lambda表達(dá)式

Lambda表達(dá)式允許你在本地定義函數(shù),即在調(diào)用的地方定義,從而消除函數(shù)對象產(chǎn)生的許多安全風(fēng)險,Lambda表達(dá)式的格式如下:

  1. [capture](parameters)->return-type {body} 

[]里是函數(shù)調(diào)用的參數(shù)列表,表示一個Lambda表達(dá)式的開始,讓我們來看一個Lambda例子:

假設(shè)你想計算某個字符串包含多少個大寫字母,使用for_each()遍歷一個char數(shù)組,下面的Lambda表達(dá)式確定每個字母是否是大寫字母,每當(dāng)它發(fā)現(xiàn)一個大寫字母,Lambda表達(dá)式給Uppercase加1,Uppercase是定義在Lambda表達(dá)式外的一個變量:

  1. int main()  
  2. {  
  3.    char s[]="Hello World!";  
  4.    int Uppercase = 0; //modified by the lambda  
  5.    for_each(s, s+sizeof(s), [&Uppercase] (char c) {  
  6.     if (isupper(c))  
  7.      Uppercase++;  
  8.     });  
  9.  cout<< Uppercase<<" uppercase letters in: "<< s<<endl;  

這是因為,如果你定義的函數(shù)主體被放置在另一個函數(shù)調(diào)用內(nèi)部,[&Uppercase]中的“&”記號意味著Lambda主體獲得一個Uppercase的引用,以便它能修改,如果沒有這個特殊記號,Uppercase將通過值傳遞,C++11 Lambda表達(dá)式也包括成員函數(shù)構(gòu)造器。

自動類型推斷和decltype

在C++03中,在聲明對象時,你必須指定對象的類型,然而,在許多情況下,對象的聲明包括在初始化代碼中,C++11利用了這個優(yōu)勢,允許你聲明對象時不指定類型:

  1. auto x=0; //x has type int because 0 is int  
  2. auto c='a'//char  
  3. auto d=0.5; //double  
  4. auto national_debt=14400000000000LL;//long long 

相反,你可以聲明下面這樣的迭代器:

  1. void fucn(const vector<int> &vi)  
  2. {  
  3. vector<int>::const_iterator ci=vi.begin();  
  4. }  

關(guān)鍵字auto不是什么新生事物,我們早已認(rèn)識,它實際上可以追溯到前ANSI C時代,但是,C++11改變了它的含義,auto不再指定自動存儲類型對象,相反,它聲明的對象類型是根據(jù)初始化代碼推斷而來的,C++11刪除了auto關(guān)鍵字的舊有含義以避免混淆,C++11提供了一個類似的機(jī)制捕捉對象或表達(dá)式的類型,新的操作符decltype需要一個表達(dá)式,并返回它的類型。

  1. const vector<int> vi;  
  2. typedef decltype (vi.begin()) CIT;  
  3. CIT another_const_iterator;  

統(tǒng)一初始化語法

C++至少有4個不同的初始化符號,有些存在重疊,括號初始化語法如下:

  1. std::string s("hello");  
  2. int m=int(); //default initialization  

在某些情況下,你也可以使用“=”符號進(jìn)行初始化:

  1. std::string s="hello";  
  2. int x=5;  

對于POD聚合,你還可以使用大括號:

  1. int arr[4]={0,1,2,3};  
  2. struct tm today={0};  

***,構(gòu)造函數(shù)使用成員進(jìn)行初始化:

  1. struct S {  
  2.  int x;  
  3.  S(): x(0) {} };  

顯然,這么多種初始化方法會引起混亂,對新手來說就更痛苦了,更糟糕的是,在C++03中,你不能初始化POD數(shù)組成員,POD數(shù)組使用new[]分配,C++11使用統(tǒng)一的大括號符號清理了這一混亂局面。

  1. class C  
  2. {  
  3. int a;  
  4. int b;  
  5. public:  
  6.  C(int i, int j);  
  7. };  
  8.  
  9. C c {0,0}; //C++11 only. Equivalent to: C c(0,0);  
  10.  
  11. int* a = new int[3] { 1, 2, 0 }; /C++11 only  
  12.  
  13. class X {  
  14.   int a[4];  
  15. public:  
  16.   X() : a{1,2,3,4} {} //C++11, member array initializer  
  17. }; 

關(guān)于容器,你可以和一長串的push_back()調(diào)用說再見了,在C++11中,你可以直觀地初始化容器:

  1. // C++11 container initializer  
  2. vector vs<string>={ "first""second""third"};  
  3. map singers =  
  4.   { {"Lady Gaga""+1 (212) 555-7890"},  
  5.     {"Beyonce Knowles""+1 (212) 555-0987"}};  

類似地,C++11支持類似的數(shù)據(jù)成員類內(nèi)初始化:

  1. class C  
  2. {  
  3.  int a=7; //C++11 only  
  4. public:  
  5.  C();  
  6. };  

#p#

Deleted和Defaulted函數(shù)

一個表單中的函數(shù):

  1. struct A  
  2. {  
  3.  A()=default//C++11  
  4.  virtual ~A()=default//C++11  
  5. };  

被稱為一個defaulted函數(shù),“=default;”告訴編譯器為函數(shù)生成默認(rèn)的實現(xiàn)。Defaulted函數(shù)有兩個好處:比手工實現(xiàn)更高效,讓程序員擺脫了手工定義這些函數(shù)的苦差事。

與defaulted函數(shù)相反的是deleted函數(shù):

  1. int func()=delete;

Deleted函數(shù)對防止對象復(fù)制很有用,回想一下C++自動為類聲明一個副本構(gòu)造函數(shù)和一個賦值操作符,要禁用復(fù)制,聲明這兩個特殊的成員函數(shù)=delete即可:

  1. struct NoCopy  
  2. {  
  3.     NoCopy & operator =( const NoCopy & ) = delete;  
  4.     NoCopy ( const NoCopy & ) = delete;  
  5. };  
  6. NoCopy a;  
  7. NoCopy b(a); //compilation error, copy ctor is deleted  

nullptr

C++終于有一個關(guān)鍵字指定一個空指針常量了,nullptr取代了有錯誤傾向的null和文字0,這兩個被用來作為空指針替代品已經(jīng)有很多年的歷史了,nullptr是一個強(qiáng)類型:

  1. void f(int); //#1  
  2. void f(char *);//#2  
  3. //C++03  
  4. f(0); //which f is called?  
  5. //C++11  
  6. f(nullptr) //unambiguous, calls #2  

nullptr適用于所有指針類別,包括函數(shù)指針和成員指針: 

  1. const char *pc=str.c_str(); //data pointers  
  2. if (pc!=nullptr)  
  3.   cout<<pc<<endl;  
  4. int (A::*pmf)()=nullptr; //pointer to member function  
  5. void (*pmf)()=nullptr; //pointer to function  

委托構(gòu)造函數(shù)

在C++11中,構(gòu)造函數(shù)可以調(diào)用相同類中的其它構(gòu)造函數(shù):

  1. class M //C++11 delegating constructors  
  2. {  
  3.  int x, y;  
  4.  char *p;  
  5. public:  
  6.  M(int v) : x(v), y(0),  p(new char [MAX])  {} //#1 target  
  7.  M(): M(0) {cout<<"delegating ctor"<  

構(gòu)造函數(shù)#2,委托構(gòu)造函數(shù),調(diào)用目標(biāo)構(gòu)造函數(shù)#1。

右值引用

C++03中的引用類型只能綁定左值,C++11引入了一種新型引用類型,叫做右值引用,右值引用可以綁定左值,例如,臨時對象和字面量。增加右值引用的主要原因是move(移動)語義,它和傳統(tǒng)的復(fù)制不一樣,移動意味著目標(biāo)對象偷竊了源對象的資源,留下一個狀態(tài)為“空”的資源,在某些情況下,復(fù)制一個對象代價既高又沒有必要,可以用一個移動操作代替,如果你想評估移動帶來的性能收益,可以考慮字符串交換,一個幼稚的實現(xiàn)如下:

  1. void naiveswap(string &a, string & b)  
  2. {  
  3.  string temp = a;  
  4.  a=b;  
  5.  b=temp;  
  6. }  

像這樣寫代價是很高的,復(fù)制字符串必須分配原始內(nèi)存,將字符從源位置復(fù)制到目標(biāo)位置,相反,移動字符串僅僅是交換兩個數(shù)據(jù)成員,不用分配內(nèi)存,復(fù)制char數(shù)組和刪除內(nèi)存:

  1. void moveswapstr(string& empty, string & filled)  

  2. {  

  3. //pseudo code, but you get the idea  

  4.  size_t sz=empty.size();  

  5.  const char *p= empty.data();  

  6. //move filled's resources to empty  

  7.  empty.setsize(filled.size());  

  8.  empty.setdata(filled.data());  

  9. //filled becomes empty  

  10.  filled.setsize(sz);  

  11.  filled.setdata(p);  

  12. }  

如果你實現(xiàn)的類支持移動,你可以像下面這樣聲明一個移動構(gòu)造函數(shù)和一個移動賦值操作符:

  1. class Movable  
  2. {  
  3. Movable (Movable&&); //move constructor  
  4. Movable&& operator=(Movable&&); //move assignment operator  
  5. };  

#p#

C++11標(biāo)準(zhǔn)庫廣泛使用了移動語義,許多算法和容器現(xiàn)在都為移動做了優(yōu)化。

C++11標(biāo)準(zhǔn)庫

C++于2003年以庫技術(shù)報告1(TR1)的形式經(jīng)歷了重大改版,TR1包括新的容器類(unordered_set,unordered_map,unordered_multiset和unordered_multimap)和多個支撐正則表達(dá)式、元組和函數(shù)對象封裝器等的新庫。隨著C++11標(biāo)準(zhǔn)獲得通過,TR1和自它***發(fā)布以來新增的庫被正式納入標(biāo)準(zhǔn)的C++標(biāo)準(zhǔn),下面是C++11標(biāo)準(zhǔn)庫的一些特性:

線程庫

站在程序員的角度來看,C++11最重要的新功能毫無疑問是并行操作,C++11擁有一個代表執(zhí)行線程的線程類,在并行環(huán)境中用于同步,async()函數(shù)模板啟動并行任務(wù),為線程獨特的數(shù)據(jù)聲明thread_local存儲類型。如果你想找C++11線程庫的快速教程,請閱讀Anthony William的“C++0x中更簡單的多線程”。

新的智能指針類

C++98只定義了一個智能指針類auto_ptr,它現(xiàn)在已經(jīng)被廢棄了,C++11引入了新的智能指針類shared_ptr和最近添加的unique_ptr,兩者都兼容其它標(biāo)準(zhǔn)庫組件,因此你可以在標(biāo)準(zhǔn)容器內(nèi)安全保存這些智能指針,并使用標(biāo)準(zhǔn)算法操作它們。

新的算法

C++11標(biāo)準(zhǔn)庫定義了新的算法模仿all_of(),any_of()和none_of()操作,下面列出適用于ispositive()到(first, first+n)范圍,且使用all_of(), any_of() and none_of() 檢查范圍的屬性的謂詞:

  1. #include <algorithm>  
  2. //C++11 code  
  3. //are all of the elements positive?  
  4. all_of(first, first+n, ispositive()); //false  
  5. //is there at least one positive element?  
  6. any_of(first, first+n, ispositive());//true  
  7. // are none of the elements positive?  
  8. none_of(first, first+n, ispositive()); //false  

一種新型copy_n算法也可用了,使用copy_n()函數(shù),復(fù)制一個包含5個元素的數(shù)組到另一個數(shù)組的代碼如下:

  1. #include  
  2. int source[5]={0,12,34,50,80};  
  3. int target[5];  
  4. //copy 5 elements from source to target  
  5. copy_n(source,5,target);  

算法iota()創(chuàng)建了一個值順序遞增的范圍,好像分配一個初始值給*first,然后使用前綴++使值遞增,在下面的代碼中,iota()分配連續(xù)值{10,11,12,13,14}給數(shù)組arr,并將{‘a’,’b’,’c’}分配給char數(shù)組c。

  1. include <numeric>  
  2. int a[5]={0};  
  3. char c[3]={0};  
  4. iota(a, a+5, 10); //changes a to {10,11,12,13,14}  
  5. iota(c, c+3, 'a'); //{'a','b','c'}  

C++11仍然缺乏一些有用的庫,如XML API,套接字,GUI,反射以及前面提到的一個合適的自動垃圾回收器,但C++11的確也帶來了許多新特性,讓C++變得更加安全,高效,易學(xué)易用。

如果C++11的變化對你來說太大的話,也不要驚慌,多花些時間逐漸消化這一切,當(dāng)你完全吸收了C++11的變化后,你可能就會同意Stroustrup的說法:C++11感覺就像一個新語言,一個更好的新語言。

原文出處:http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/

原文名:The Biggest Changes in C++11

【編輯推薦】

  1. 一個實用主義者的觀點:如何學(xué)習(xí)使用C++
  2. 程序員新招:Java與C++混合編程
責(zé)任編輯:艾婧 來源: 51CTO
相關(guān)推薦

2011-06-28 16:39:54

開發(fā)技術(shù)周刊

2015-08-20 13:43:17

NFV網(wǎng)絡(luò)功能虛擬化

2024-12-12 07:00:00

函數(shù)重載編譯器C++

2010-05-17 09:13:35

2011-11-18 09:26:18

Javafinally

2021-06-07 08:18:12

云計算云端阿里云

2014-03-12 11:11:39

Storage vMo虛擬機(jī)

2010-05-26 19:12:41

SVN沖突

2018-03-01 09:33:05

軟件定義存儲

2009-06-01 09:04:44

Google WaveWeb

2016-04-06 09:27:10

runtime解密學(xué)習(xí)

2023-04-10 11:00:00

注解Demo源碼

2009-09-15 15:34:33

Google Fast

2023-11-02 09:55:40

2020-02-27 10:25:30

WiFi網(wǎng)絡(luò)5G

2025-01-07 15:07:13

2024-02-14 09:00:00

機(jī)器學(xué)習(xí)索引ChatGPT

2016-11-16 09:06:59

2017-10-16 05:56:00

2021-09-17 15:54:41

深度學(xué)習(xí)機(jī)器學(xué)習(xí)人工智能
點贊
收藏

51CTO技術(shù)棧公眾號

日本1区2区| 中国字幕a在线看韩国电影| 国产精品一区二区视频| 亚洲在线观看视频网站| 亚洲资源网站| 97超碰蝌蚪网人人做人人爽| 忘忧草在线www成人影院| 亚洲精品456在线播放狼人| 黄色免费在线观看网站| 欧美日韩国产系列| 成人精品一区二区三区免费| 粉嫩老牛aⅴ一区二区三区 | 性人久久久久| 国模私拍一区二区三区| 日韩精品一区二区三区中文| 北条麻妃一区二区三区中文字幕| 免费看av不卡| 精品久久久av| 亚洲精品v亚洲精品v日韩精品| 欧美久久精品午夜青青大伊人| 91麻豆精品国产综合久久久| 久久国产精品久久久久| 天堂久久av| 国产99久久久欧美黑人| 欧洲grand老妇人| 国产精品亚洲欧美导航| 国产精品毛片一区二区在线看| 91视频免费进入| 母乳一区在线观看| 中文字幕av久久| 久久品道一品道久久精品| 成人网址大全| 色综合中文字幕国产| 日本中文在线| 国产一级揄自揄精品视频| 色悠久久久久综合先锋影音下载| 8050国产精品久久久久久| 欧美电影三区| 日韩欧美亚洲日产国| 成人av一区二区三区| 日韩av在线中文| 狠狠操狠狠色综合网| 免费av不卡| 亚洲午夜激情免费视频| 六月丁香久久丫| 草莓视频一区| 国内成人免费视频| 日韩精品你懂的| 亚洲成精国产精品女| 92国产在线视频| 日韩高清免费在线| 91成人福利| 国产精品国模大尺度私拍| 久久国产精品72免费观看| 国产av麻豆mag剧集| 亚洲女与黑人做爰| 国产黄色小视频在线| 欧美另类高清videos| 在线精品视频在线观看高清| 欧美 国产 精品| 一区二区三区蜜桃网| 污污网站在线观看| 高清视频欧美一级| 欧美专区在线| 亚洲人辣妹窥探嘘嘘| 666欧美在线视频| 91九色鹿精品国产综合久久香蕉| 国产女人水真多18毛片18精品| 麻豆91在线观看| 探花国产精品| 日韩电影免费观看在线观看| 加勒比久久综合| 一级黄色片播放| 欧美日韩亚洲一区二区| 亚洲午夜剧场| 久久久久久99| 亚洲精品成人悠悠色影视| 亚洲欧洲美洲av| 91老司机精品视频| 91香蕉视频mp4| fc2ppv国产精品久久| 国产成人+综合亚洲+天堂| 国产激情视频一区二区三区欧美 | 99九九视频| 久久色在线视频| 欧美hdxxxxx| 91久久国产精品91久久性色| 91日韩一区二区三区| 四虎影视成人| 亚洲最大成人免费视频| 亚洲国产成人一区二区三区| 6699嫩草久久久精品影院| 亚洲已满18点击进入在线看片| 久久久精品2019中文字幕之3| 日韩三级免费| 超碰国产精品久久国产精品99| 中文字幕一区在线观看| 91在线亚洲| 日韩人妻精品一区二区三区| 欧美日韩精品免费| 首页国产精品| 日本高清不卡中文字幕| 中文字幕亚洲一区在线观看| 蜜桃av一区二区三区电影| 国产三级电影在线观看| 国产成人综合亚洲| 国产精品―色哟哟| 日韩毛片一区| 久久精品国产精品亚洲精品色 | 国产精品一区毛片| 天堂视频中文在线| 日韩免费观看网站| 亚洲天天做日日做天天谢日日欢| 天堂av中文在线资源库| 精品精品导航| 成人在线视频亚洲| 成人18在线| 日韩制服诱惑| 是的av在线| 男人天堂免费视频| 欧美在线观看www| 久热精品视频在线观看一区| 亚洲国产精品尤物yw在线观看| 欧美综合久久| 日韩中文欧美| 精品美女一区| 免费黄色在线| 日本xxxxxxx免费视频| 在线中文字幕资源| 欧美韩日亚洲| 午夜国产福利在线| av午夜在线| 免费不卡视频| 成人影音在线| 中国黄色在线视频| 成人午夜在线观看视频| 欧美18av| 国产精品久久久久久吹潮| 成人午夜精品| 素人一区二区三区| 天堂va蜜桃一区二区三区漫画版 | 久久久久久久网| 国产精品亚洲综合久久| 蜜桃精品视频| 国产精品1区| 99精品国产福利在线观看免费| 日韩成人激情| 91成人看片| 久久久蜜桃一区二区人| 久久精品国产久精国产爱| 国产精品一区在线观看你懂的| 欧美肥老太太性生活| 人人爱人人干婷婷丁香亚洲| 亚洲黄色视屏| 亚洲综合一区二区| 欧美视频二区36p| 久久久亚洲国产| 国产精品热视频| 国产精品海角社区在线观看| 91久久嫩草影院一区二区| 青青在线视频免费| 91免费黄视频| 午夜免费播放观看在线视频| 蜜桃麻豆av在线| 最新亚洲精品| 国产综合自拍| 亚洲国产成人自拍| 北条麻妃一区二区三区中文字幕| 久久久亚洲欧洲日产国码aⅴ| 超碰97人人做人人爱少妇| 99电影网电视剧在线观看| 好吊妞www.84com只有这里才有精品| 91亚洲永久免费精品| 91网站在线观看免费| 在线观看免费污视频| 国产精品久久久毛片| 91在线九色porny| 日韩有码电影| 不卡的国产精品| 国产综合自拍| 国产欧美精品一区二区色综合| 亚洲精品国偷自产在线99热 | 三级资源在线| 国产主播一区| 欧美色老头old∨ideo| 欧美激情xxxxx| 日韩欧美黄色大片| 久久中文字幕导航| 日日夜夜免费精品| 2021久久国产精品不只是精品| 国产一区二区三区91| 六月婷婷激情综合| 最新中文字幕亚洲| 亚洲观看高清完整版在线观看| 国产欧美高清| 成人在线视频国产| 日色在线视频| 热99这里只有精品| 国产成人精品日本亚洲11| 这里只有精品丝袜|