青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-59  評論-36  文章-0  trackbacks-0

賴勇浩(http://laiyonghao.com)
聲明:本文源自 Danny Kalev 在 2011 年 6 月 21 日發表的《The Biggest Changes in C++11(and Why You Should Care)》一文,幾乎所有內容都搬了過來,但不是全文照譯,有困惑之處,請參詳原文(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}  

來看個計數某個字符序列中有幾個大寫字母的例子:
  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;  
  10. }  

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

自動類型推導和 decltype

在 C++03 中,聲明對象的同時必須指明其類型,其實大多數情況下,聲明對象的同時也會包括一個初始值,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. {  
  3.   vector<int>::const_iterator ci=vi.begin();  
  4. }  

那個迭代器可以聲明為:
  1. auto ci=vi.begin();  

C++11 也提供了從對象或表達式中“俘獲”類型的機制,新的操作符 decltype 可以從一個表達式中“俘獲”其結果的類型并“返回”:
  1. const vector<int> vi;  
  2. typedef decltype (vi.begin()) CIT;  
  3. CIT another_const_iterator;  

統一的初始化語法

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

  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. struct tm today={0};  

最后還有構造函數的成員初始化:
  1. struct S {  
  2.  int x;  
  3.  S(): x(0) {} };  

這么多初始化形式,不僅菜鳥會搞得很頭大,高手也吃不消。更慘的是 C++03 中居然不能初始化 POD 數組的類成員,也不能在使用 new[] 的時候初始 POD 數組,操蛋??!C++11 就用大括號一統天下了:
  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. 相當于 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, 初始化數組成員  
  14. };  

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

而類中的數據成員初始化也得到了支持:
  1. class C  
  2. {  
  3.  int a=7; //C++11 only  
  4. public:  
  5.  C();  
  6. };  

deleted 函數和 defaulted 函數

像以下形式的函數:

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

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

這貨有一大用途就是實現 noncopyabe 防止對象拷貝,要想禁止拷貝,用 =deleted 聲明一下兩個關鍵的成員函數就可以了:
  1. struct NoCopy  
  2. {  
  3.     NoCopy & operator =( const NoCopy & ) = delete;  
  4.     NoCopy ( const NoCopy & ) = delete;  
  5. };  
  6. NoCopy a;  
  7. NoCopy b(a); //編譯錯誤,拷貝構造函數是 deleted 函數  

nullptr

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

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

所有跟指針有關的地方都可以用 nullptr,包括函數指針和成員指針:
  1. const char *pc=str.c_str(); //data pointers  
  2. if (pc!=nullptr)  
  3.   cout<<pc<<endl;  
  4. int (A::*pmf)()=nullptr; //指向成員函數的指針  
  5. void (*pmf)()=nullptr; //指向函數的指針  

委托構造函數

C++11 中構造函數可以調用同一個類的另一個構造函數:

  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"<<end;} //#2 delegating  

#2 就是所謂的委托構造函數,調用了真正的構造函數 #1。

右值引用

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

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

這種方案很傻很天真,很慢,因為需要申請內存,然后拷貝字符,而 move 就只需要交換兩個數據成員,無須申請、釋放內存和拷貝字符數組:
  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. }  

要實現支持 move 的類,需要聲明 move 構造函數和 move 賦值操作符,如下:
  1. class Movable  
  2. {  
  3. Movable (Movable&&); //move constructor  
  4. Movable&& operator=(Movable&&); //move assignment operator  
  5. };  

C++11 的標準庫廣泛使用 move 語義,很多算法和容器都已經使用 move 語義優化過了。

C++11 的標準庫

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

線程庫

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

新的智能指針類

C++98 定義的唯一的智能指針類 auto_ptr 已經被棄用,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() 算法可以用來創建遞增序列,它先把初值賦值給 *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、反射——以及自動垃圾收集。然而現有特性已經讓 C++ 更安全、高效(是的,效率更高了,可以參見 Google 的 基準測試結果http://www.itproportal.com/2011/06/07/googles-rates-c-most- complex-highest-performing-language/)以及更加易于學習和使用。
如果覺得 C++ 變化太大了,不必驚恐,花點時間來學習就好了??赡茉谀闳跁炌ㄐ绿匦砸院?,你會同意 Stroustrup 的觀點:C++11 是一門新的語言——一個更好的 C++。


posted on 2011-08-19 21:06 zhaoyg 閱讀(833) 評論(2)  編輯 收藏 引用 所屬分類: C/C++學習筆記

評論:
# re: 【轉】C++11中值得關注的幾大變化 2012-05-28 03:09 | RUSSELLMaryann34
If you are in not good state and have no money to get out from that point, you would require to take the <a href="http://goodfinance-blog.com/topics/mortgage-loans">mortgage loans</a>. Because it should help you unquestionably. I take short term loan every single year and feel myself OK just because of that.   回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品视频免费观看| 午夜精品福利视频| 欧美日韩国产在线一区| 欧美大片一区二区| 麻豆91精品91久久久的内涵| 久久尤物电影视频在线观看| 久久男人资源视频| 亚洲欧美激情视频| 欧美日韩国产三区| 欧美顶级艳妇交换群宴| 欧美va天堂| 欧美视频一区二区三区在线观看 | 夜夜嗨av一区二区三区免费区| 精品成人在线视频| 亚洲精品日韩久久| 欧美一级成年大片在线观看| 久久久中精品2020中文| 亚洲国产欧美另类丝袜| 亚洲高清不卡在线| 艳女tv在线观看国产一区| 亚洲免费影院| 美女诱惑黄网站一区| 欧美日韩精品不卡| 国产一区二区三区久久久| 亚洲国产精品第一区二区三区| 一区二区三区色| 久久综合给合久久狠狠色| 亚洲国产日日夜夜| 午夜精品影院| 欧美女同视频| 黄色成人在线| 亚洲愉拍自拍另类高清精品| 久久久久久久综合| 99精品视频免费观看| 久久久久久一区| 国产精品毛片a∨一区二区三区|国 | 亚洲国产精品黑人久久久| 一区二区国产精品| 老司机午夜精品| 国产精品欧美日韩一区| 亚洲激情电影在线| 开心色5月久久精品| 亚洲免费影视第一页| 欧美四级电影网站| 99综合在线| 欧美jizzhd精品欧美巨大免费| 亚洲一区二区3| 欧美精品激情| 亚洲高清精品中出| 久久久www成人免费毛片麻豆| 亚洲乱码国产乱码精品精天堂| 欧美在线一级视频| 国产精品中文在线| 亚洲女爱视频在线| 亚洲视频欧洲视频| 国产精品久久久久久久午夜| 韩国一区电影| 久久久综合网| 欧美一区二区三区男人的天堂| 欧美日韩一区在线观看| 亚洲美女中出| 亚洲国产欧美国产综合一区 | 亚洲影院一区| 欧美视频一区二区三区…| 99精品久久| 亚洲精品美女在线| 欧美精品国产一区二区| 91久久亚洲| 欧美黄色免费网站| 麻豆av福利av久久av| 亚洲第一天堂av| 欧美激情精品久久久六区热门 | 久久精品一区蜜桃臀影院 | 欧美韩国日本综合| 亚洲国产日韩欧美在线99| 噜噜噜噜噜久久久久久91| 午夜视频在线观看一区二区| 在线综合视频| 久久色在线观看| 欧美成人午夜| 99成人在线| 一区二区三区四区五区在线| 国产精品日韩欧美一区| 欧美一区二区高清| 久久黄金**| 亚洲精品一线二线三线无人区| 亚洲精品乱码久久久久久| 欧美手机在线视频| 久久久xxx| 欧美插天视频在线播放| 99天天综合性| 性8sex亚洲区入口| 亚洲日本激情| 亚洲无吗在线| 国产一区二区三区网站| 欧美国产日本| 国产精品手机视频| 久久久人成影片一区二区三区观看 | 久久精品久久99精品久久| 亚洲国内自拍| 亚洲一区二区在线免费观看视频| 国产香蕉97碰碰久久人人| 欧美国产日韩一区二区在线观看 | 久久夜色精品一区| 在线亚洲一区观看| 久久人91精品久久久久久不卡| av不卡在线看| 久久狠狠亚洲综合| 亚洲午夜视频在线| 麻豆成人在线| 久久精品国产欧美激情| 欧美理论电影在线观看| 久久久久国色av免费看影院 | 欧美一级专区| 一本色道久久综合亚洲精品按摩| 在线亚洲+欧美+日本专区| 激情综合网址| 亚洲一区二区3| 99这里只有久久精品视频| 久久精品成人一区二区三区蜜臀 | 欧美主播一区二区三区| 99国内精品| 免费久久精品视频| 久久久99精品免费观看不卡| 欧美特黄a级高清免费大片a级| 欧美风情在线| 一区精品在线播放| 欧美一区二区三区视频在线| 亚洲图片你懂的| 欧美日韩国产精品一区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产精品久久久久久av下载红粉| 欧美1区2区3区| 国内精品一区二区三区| 午夜视频久久久久久| 午夜精品亚洲一区二区三区嫩草| 欧美日韩国产在线| 日韩一二在线观看| 一区二区三区四区五区视频| 免费人成精品欧美精品| 欧美国产一区二区在线观看| 在线免费观看日韩欧美| 久久久久久一区二区三区| 最新成人在线| 欧美大色视频| 亚洲狼人精品一区二区三区| 日韩视频中午一区| 欧美日韩精品一区视频| 亚洲另类在线一区| 亚洲午夜久久久久久久久电影网| 欧美激情综合在线| 亚洲黄色有码视频| 一区二区三区视频观看| 国产精品www| 亚洲欧美文学| 久久视频精品在线| 狠狠色伊人亚洲综合网站色| 久久精品人人做人人爽| 欧美.www| 99综合在线| 国产免费观看久久| 亚洲欧洲免费视频| 亚洲欧美日韩高清| 国产在线日韩| 欧美激情精品久久久久久| 亚洲精品中文字| 新狼窝色av性久久久久久| 一本大道久久精品懂色aⅴ| 香蕉精品999视频一区二区| 久久久水蜜桃| 亚洲美女在线一区| 国产精品日日摸夜夜添夜夜av| 性亚洲最疯狂xxxx高清| 久久亚洲精品视频| 99视频一区二区| 国产日韩欧美一区二区| 久久综合五月| 亚洲欧美一区二区激情| 加勒比av一区二区| 欧美午夜精品伦理| 久久躁日日躁aaaaxxxx| 亚洲视频福利| 欧美激情在线有限公司| 午夜久久资源| 99re这里只有精品6| 狠狠色丁香久久婷婷综合_中| 欧美日韩你懂的| 欧美www视频| 久久精品日韩一区二区三区| 中文高清一区| 日韩视频一区二区在线观看 | 亚洲激情一区二区三区| 国产日韩精品一区二区浪潮av| 欧美69wwwcom| 久久久av毛片精品| 亚洲女人天堂av| 一本在线高清不卡dvd | 亚洲欧美在线另类| 一区二区不卡在线视频 午夜欧美不卡在| 国产伦精品一区二区三区高清版 |