歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

30分鐘了解C++11新特性

目錄

什麼是C++11
新的關鍵字
auto
decltype
nullptr
序列for循環
Lambda表達式
變長參數的模板
更加優雅的初始化方法
然後呢…

什麼是C++11

C++11是曾經被叫做C++0x,是對目前C++語言的擴展和修正,C++11不僅包含核心語言的新機能,而且擴展了C++的標准程序庫(STL),並入了大部分的C++ Technical Report 1(TR1)程序庫(數學的特殊函數除外)。

C++11包括大量的新特性:包括lambda表達式,類型推導關鍵字auto、decltype,和模板的大量改進。

本文將對C++11的以上新特性進行簡單的講解,以便大家能夠快速了解到C++11對C++的易用性方面祈禱的巨大作用。

 

新的關鍵字

 

auto

C++11中引入auto第一種作用是為了自動類型推導

auto的自動類型推導,用於從初始化表達式中推斷出變量的數據類型。通過auto的自動類型推導,可以大大簡化我們的編程工作

auto實際上實在編譯時對變量進行了類型推導,所以不會對程序的運行效率造成不良影響

另外,似乎auto並不會影響編譯速度,因為編譯時本來也要右側推導然後判斷與左側是否匹配。

auto a; // 錯誤,auto是通過初始化表達式進行類型推導,如果沒有初始化表達式,就無法確定a的類型
auto i = 1;
auto d = 1.0;
auto str = "Hello World";
auto ch = 'A';
auto func = less<int>();
vector<int> iv;
auto ite = iv.begin();
auto p = new foo() // 對自定義類型進行類型推導

auto不光有以上的應用,它在模板中也是大顯身手,比如下例這個加工產品的例子中,如果不使用auto就必須聲明Product這一模板參數:

template <typename Product, typename Creator>
void processProduct(const Creator& creator) {
    Product* val = creator.makeObject();
    // do somthing with val
}     
        .

如果使用auto,則可以這樣寫:

template <typename Creator>
void processProduct(const Creator& creator) {
    auto val = creator.makeObject();
    // do somthing with val
}

拋棄了麻煩的模板參數,整個代碼變得更加正解了。

 

decltype

decltype實際上有點像auto的反函數,auto可以讓你聲明一個變量,而decltype則可以從一個變量或表達式中得到類型,有實例如下:

int x = 3;
decltype(x) y = x;

有人會問,decltype的實用之處在哪裡呢,我們接著上邊的例子繼續說下去,如果上文中的加工產品的例子中我們想把產品作為返回值該怎麼辦呢?我們可以這樣寫:

template <typename Creator>
auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) {
    auto val = creator.makeObject();
    // do somthing with val
}

nullptr

nullptr是為了解決原來C++中NULL的二義性問題而引進的一種新的類型,因為NULL實際上代表的是0,

void F(int a){
    cout<<a<<endl;
}

void F(int *p){
    assert(p != NULL);

    cout<< p <<endl;
}

int main(){

    int *p = nullptr;
    int *q = NULL;
    bool equal = ( p == q ); // equal的值為true,說明p和q都是空指針
    int a = nullptr; // 編譯失敗,nullptr不能轉型為int
    F(0); // 在C++98中編譯失敗,有二義性;在C++11中調用F(int)
    F(nullptr);

    return 0;
}

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2013-12/93835p2.htm

Copyright © Linux教程網 All Rights Reserved