日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
掀起C++11的神秘面紗

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

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),平?jīng)銎髽I(yè)網(wǎng)站建設(shè),平?jīng)銎放凭W(wǎng)站建設(shè),網(wǎng)站定制,平?jīng)鼍W(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,平?jīng)鼍W(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

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

 
 
 
  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<
  10. }

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

自動(dòng)類(lèi)型推斷和decltype

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

 
 
 
  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 &vi)
  2. {
  3. vector::const_iterator ci=vi.begin();
  4. }

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

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

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

C++至少有4個(gè)不同的初始化符號(hào),有些存在重疊,括號(hào)初始化語(yǔ)法如下:

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

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

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

對(duì)于POD聚合,你還可以使用大括號(hào):

 
 
 
  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) {} };

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

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

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

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

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

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

#p#

Deleted和Defaulted函數(shù)

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

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

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

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

 
 
 
  1. int func()=delete;

Deleted函數(shù)對(duì)防止對(duì)象復(fù)制很有用,回想一下C++自動(dòng)為類(lèi)聲明一個(gè)副本構(gòu)造函數(shù)和一個(gè)賦值操作符,要禁用復(fù)制,聲明這兩個(gè)特殊的成員函數(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++終于有一個(gè)關(guān)鍵字指定一個(gè)空指針常量了,nullptr取代了有錯(cuò)誤傾向的null和文字0,這兩個(gè)被用來(lái)作為空指針替代品已經(jīng)有很多年的歷史了,nullptr是一個(gè)強(qiáng)類(lèi)型:

 
 
 
  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適用于所有指針類(lèi)別,包括函數(shù)指針和成員指針:

 
 
 
  1. const char *pc=str.c_str(); //data pointers
  2. if (pc!=nullptr)
  3.   cout<
  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)用相同類(lèi)中的其它構(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中的引用類(lèi)型只能綁定左值,C++11引入了一種新型引用類(lèi)型,叫做右值引用,右值引用可以綁定左值,例如,臨時(shí)對(duì)象和字面量。增加右值引用的主要原因是move(移動(dòng))語(yǔ)義,它和傳統(tǒng)的復(fù)制不一樣,移動(dòng)意味著目標(biāo)對(duì)象偷竊了源對(duì)象的資源,留下一個(gè)狀態(tài)為“空”的資源,在某些情況下,復(fù)制一個(gè)對(duì)象代價(jià)既高又沒(méi)有必要,可以用一個(gè)移動(dòng)操作代替,如果你想評(píng)估移動(dòng)帶來(lái)的性能收益,可以考慮字符串交換,一個(gè)幼稚的實(shí)現(xiàn)如下:

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

像這樣寫(xiě)代價(jià)是很高的,復(fù)制字符串必須分配原始內(nèi)存,將字符從源位置復(fù)制到目標(biāo)位置,相反,移動(dòng)字符串僅僅是交換兩個(gè)數(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. }

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

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

#p#

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

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

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

線(xiàn)程庫(kù)

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

新的智能指針類(lèi)

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

新的算法

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

 
 
 
  1. #include 
  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ù)制一個(gè)包含5個(gè)元素的數(shù)組到另一個(gè)數(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)建了一個(gè)值順序遞增的范圍,好像分配一個(gè)初始值給*first,然后使用前綴++使值遞增,在下面的代碼中,iota()分配連續(xù)值{10,11,12,13,14}給數(shù)組arr,并將{‘a(chǎn)’,’b’,’c’}分配給char數(shù)組c。

 
 
 
  1. include 
  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仍然缺乏一些有用的庫(kù),如XML API,套接字,GUI,反射以及前面提到的一個(gè)合適的自動(dòng)垃圾回收器,但C++11的確也帶來(lái)了許多新特性,讓C++變得更加安全,高效,易學(xué)易用。

如果C++11的變化對(duì)你來(lái)說(shuō)太大的話(huà),也不要驚慌,多花些時(shí)間逐漸消化這一切,當(dāng)你完全吸收了C++11的變化后,你可能就會(huì)同意Stroustrup的說(shuō)法:C++11感覺(jué)就像一個(gè)新語(yǔ)言,一個(gè)更好的新語(yǔ)言。

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

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


網(wǎng)站標(biāo)題:掀起C++11的神秘面紗
當(dāng)前路徑:http://www.5511xx.com/article/cdhjoie.html