<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      轉(zhuǎn):C++11中值得關(guān)注的幾大變化

              C++11中值得關(guān)注的幾大變化       

              分類:            C++54832人閱讀評論(103)收藏舉報

      賴勇浩(http://laiyonghao.com) 聲明:本文源自 Danny Kalev 在 2011 年 6 月 21 日發(fā)表的《The Biggest Changes in C++11(and Why You Should Care)》一文,幾乎所有內(nèi)容都搬了過來,但不是全文照譯,有困惑之處,請參詳原文(http://www.softwarequalityconnection.com/2011/06/the-biggest-changes-in-c11-and-why-you-should-care/)。 注:作者 Danny Kalev 曾是 C++ 標準委員會成員。

      Lambda 表達式

      Lambda 表達式的形式是這樣的:

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

      來看個計數(shù)某個字符序列中有幾個大寫字母的例子:

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

      其中 [&Uppercase] 中的 & 的意義是 lambda 函數(shù)體要獲取一個 Uppercase 引用,以便能夠改變它的值,如果沒有 &,那就 Uppercase 將以傳值的形式傳遞過去。

       

      自動類型推導(dǎo)和 decltype

      在 C++03 中,聲明對象的同時必須指明其類型,其實大多數(shù)情況下,聲明對象的同時也會包括一個初始值,C++11 在這種情況下就能夠讓你聲明對象時不再指定類型了:

      1. auto x=0; //0 是 int 類型,所以 x 也是 int 類型 
      2. auto c='a'; //char 
      3. auto d=0.5; //double 
      4. auto national_debt=14400000000000LL;//long long 

      這個特性在對象的類型很大很長的時候很有用,如:

      1. void func(const vector<int> &vi) 
      2.   vector<int>::const_iterator ci=vi.begin(); 

      那個迭代器可以聲明為:

      1. auto ci=vi.begin(); 

      C++11 也提供了從對象或表達式中“俘獲”類型的機制,新的操作符 decltype 可以從一個表達式中“俘獲”其結(jié)果的類型并“返回”:

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

       

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

      C++ 最少有 4 種不同的初始化形式,如括號內(nèi)初始化,見:

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

      還有等號形式的:

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

      對于 POD 集合,又可以用大括號:

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

      最后還有構(gòu)造函數(shù)的成員初始化:

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

      這么多初始化形式,不僅菜鳥會搞得很頭大,高手也吃不消。更慘的是 C++03 中居然不能初始化 POD 數(shù)組的類成員,也不能在使用 new[] 的時候初始 POD 數(shù)組,操蛋啊!C++11 就用大括號一統(tǒng)天下了:

      1. class
      2. int a; 
      3. int b; 
      4. public
      5. C(int i, int j); 
      6. }; 
      7. C c {0,0}; //C++11 only. 相當(dāng)于 C c(0,0); 
      8. int* a = newint[3] { 1, 2, 0 }; /C++11 only 
      9. class X { 
      10.   int a[4]; 
      11. public
      12.   X() : a{1,2,3,4} {} //C++11, 初始化數(shù)組成員 
      13. }; 

      還有一大好事就是對于容器來說,終于可以擺脫 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"}}; 

      而類中的數(shù)據(jù)成員初始化也得到了支持:

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

       

      deleted 函數(shù)和 defaulted 函數(shù)

      像以下形式的函數(shù):

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

      叫做 defaulted 函數(shù),=default; 指示編譯器生成該函數(shù)的默認實現(xiàn)。這有兩個好處:一是讓程序員輕松了,少敲鍵盤,二是有更好的性能。 與 defaulted 函數(shù)相對的就是 deleted 函數(shù):

      1. int func()=delete

      這貨有一大用途就是實現(xiàn) noncopyabe 防止對象拷貝,要想禁止拷貝,用 =deleted 聲明一下兩個關(guān)鍵的成員函數(shù)就可以了:

      1. struct NoCopy 
      2.     NoCopy & operator =( const NoCopy & ) = delete
      3.     NoCopy ( const NoCopy & ) = delete
      4. }; 
      5. NoCopy a; 
      6. NoCopy b(a); //編譯錯誤,拷貝構(gòu)造函數(shù)是 deleted 函數(shù) 

       

      nullptr

      nullptr 是一個新的 C++ 關(guān)鍵字,它是空指針常量,它是用來替代高風(fēng)險的 NULL 宏和 0 字面量的。nullptr 是強類型的:

      1. void f(int); //#1 
      2. void f(char *);//#2 
      3. //C++03 
      4. f(0); //調(diào)用的是哪個 f? 
      5. //C++11 
      6. f(nullptr) //毫無疑問,調(diào)用的是 #2 

      所有跟指針有關(guān)的地方都可以用 nullptr,包括函數(shù)指針和成員指針:

      1. constchar *pc=str.c_str(); //data pointers 
      2. if (pc!=nullptr) 
      3.   cout<<pc<<endl; 
      4. int (A::*pmf)()=nullptr; //指向成員函數(shù)的指針 
      5. void (*pmf)()=nullptr; //指向函數(shù)的指針 

       

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

      C++11 中構(gòu)造函數(shù)可以調(diào)用同一個類的另一個構(gòu)造函數(shù):

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

      #2 就是所謂的委托構(gòu)造函數(shù),調(diào)用了真正的構(gòu)造函數(shù) #1。

       

      右值引用

      在 C++03 中的引用類型是只綁定左值的,C++11 引用一個新的引用類型叫右值引用類型,它是綁定到右值的,如臨時對象或字面量。 增加右值引用的主要原因是為了實現(xiàn) move 語義。與傳統(tǒng)的拷貝不同,move 的意思是目標對象“竊取”原對象的資源,并將源置于“空”狀態(tài)。當(dāng)拷貝一個對象時,其實代價昂貴且無必要,move 操作就可以替代它。如在 string 交換的時候,使用 move 意義就有巨大的性能提升,如原方案是這樣的:

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

      這種方案很傻很天真,很慢,因為需要申請內(nèi)存,然后拷貝字符,而 move 就只需要交換兩個數(shù)據(jù)成員,無須申請、釋放內(nèi)存和拷貝字符數(shù)組:

      1. void moveswapstr(string& empty, string & filled) 
      2. //pseudo code, but you get the idea 
      3. size_t sz=empty.size(); 
      4. constchar *p= empty.data(); 
      5. //move filled's resources to empty 
      6. empty.setsize(filled.size()); 
      7. empty.setdata(filled.data()); 
      8. //filled becomes empty 
      9. filled.setsize(sz); 
      10. filled.setdata(p); 

      要實現(xiàn)支持 move 的類,需要聲明 move 構(gòu)造函數(shù)和 move 賦值操作符,如下:

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

      C++11 的標準庫廣泛使用 move 語義,很多算法和容器都已經(jīng)使用 move 語義優(yōu)化過了。

       

      C++11 的標準庫

      除 TR1 包含的新容器(unordered_set, unordered_map, unordered_multiset, 和unordered_multimap),還有一些新的庫,如正則表達式,tuple,函數(shù)對象封裝器等。下面介紹一些 C++11 的標準庫新特性:

      線程庫

      從程序員的角度來看,C++11 最重要的特性就是并發(fā)了。C++11 提供了 thread 類,也提供了 promise 和 future 用以并發(fā)環(huán)境中的同步,用 async() 函數(shù)模板執(zhí)行并發(fā)任務(wù),和 thread_local 存儲聲明為特定線程獨占的數(shù)據(jù),這里(http://www.devx.com/SpecialReports/Article/38883)有一個簡單的 C++11 線程庫教程(英文)。

      新的智能指針類

      C++98 定義的唯一的智能指針類 auto_ptr 已經(jīng)被棄用,C++11 引入了新的智能針對類 shared_ptr 和 unique_ptr。它們都是標準庫的其它組件兼容,可以安全地把智能指針存入標準容器,也可以安全地用標準算法“倒騰”它們。

      新的算法

      主要是 all_of()、any_of() 和 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:

      1. #include <algorithm> 
      2. int source[5]={0,12,34,50,80}; 
      3. int target[5]; 
      4. //從 source 拷貝 5 個元素到 target 
      5. copy_n(source,5,target); 

      iota() 算法可以用來創(chuàng)建遞增序列,它先把初值賦值給 *first,然后用前置 ++ 操作符增長初值并賦值到給下一個迭代器指向的元素,如下:

      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,socket,GUI、反射——以及自動垃圾收集。然而現(xiàn)有特性已經(jīng)讓 C++ 更安全、高效(是的,效率更高了,可以參見 Google 的 基準測試結(jié)果http://www.itproportal.com/2011/06/07/googles-rates-c-most-complex-highest-performing-language/)以及更加易于學(xué)習(xí)和使用。 如果覺得 C++ 變化太大了,不必驚恐,花點時間來學(xué)習(xí)就好了。可能在你融會貫通新特性以后,你會同意 Stroustrup 的觀點:C++11 是一門新的語言——一個更好的 C++。

      posted @ 2012-09-02 07:53  玄歌  閱讀(793)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 91久久亚洲综合精品成人| 阿巴嘎旗| 国内视频偷拍久久伊人网| 深夜精品免费在线观看| 欧美一区二区| 国产成本人片无码免费| 国产精品中文字幕久久| 亚洲无线观看国产精品| 国外av片免费看一区二区三区| 东城区| 日韩av一中美av一中文字慕| 国产线播放免费人成视频播放| 午夜福利视频| 国产午夜福利视频第三区| 国产精品福利自产拍在线观看| 午夜成人性爽爽免费视频| 女人喷水高潮时的视频网站| 中文字幕无码久久精品| 国产成人亚洲欧美二区综合| 成人欧美一区二区三区在线观看| 亚洲精品网站在线观看不卡无广告| 亚洲avav天堂av在线网爱情| 非会员区试看120秒6次| 亚洲av无码成人精品区一区| 亚洲熟妇自偷自拍另类| 国产自拍偷拍视频在线观看| 中文字幕在线精品视频入口一区| 久久久久无码中| 亚洲综合一区二区国产精品| 国产精品美女一区二区三| 天堂av网一区二区三区| 亚洲av永久无码精品天堂久久| 成人午夜国产内射主播| 欧美videosdesexo吹潮| 五月天久久综合国产一区二区| 亚洲精品熟女一区二区| 日韩精品福利一区二区三区| 最新精品露脸国产在线| 精品无码一区二区三区电影| 四虎国产精品永久在线| 一二三四日本高清社区5|