優雅的C++11

優雅的C++11,現在說11年的事兒是不是有點落後了?

優雅的C++11

更多C/C++學習資料,請私信我“代碼”,即可獲取

自動類型推導 auto

  • auto的自動類型推導,用於從初始化表達式中推斷出變量的數據類型。通過auto的自動類型推導,可以簡化我們的編程工作;
  • auto是在編譯時對變量進行了類型推導,所以不會對程序的運行效率造成不良影響;
  • auto也並不會影響編譯速度,因為編譯時本來也要右側推導然後判斷與左側是否匹配。
優雅的C++11

auto對引用的推導默認為值類型,可以指定引用修飾符設置為引用。

優雅的C++11

對指針的推導默認為指針類型,當然,也可以指定*修飾符(效果一樣)

優雅的C++11

推導常量

優雅的C++11

萃取類型 decltype

decltype實際上有點像auto的反函數,使用auto可以用來聲明一個指定類型的變量,而decltype可以通過一個變量(或表達式)得到類型。

優雅的C++11

有沒有聯想到STL中的萃取器?寫模版時有了這個是不是會方便很多。

返回類型後置語法

C++11支持返回值後置

例如:

優雅的C++11

auto用於佔位符,真正的返回值在後面定義; 這樣的語法用於在編譯時返回類型還不確定的場合; 比如有模版的場合中,兩個類型相加的最終類型只有運行時才能確定。

優雅的C++11

auto用於佔位符,真正的返回值類型在程序運行中,函數返回時才確定;不用auto佔位符,直接使用decltype推導類型。

decltype(lhs+rhs) adding_func(const Lhs &lhs, const Rhs &rhs)

這樣寫,編譯器無法通過,因為模版參數lhs和rhs在編譯期間還未聲明; 當然,這樣寫可以編譯通過:decltype( (*(Lhs*)0) + (*(Rhs*)0) ) adding_func(const Lhs &lhs, const Rhs &rhs)

但這種形式實在是不直觀,不如auto佔位符方式直觀易懂。

空指針標識 nullptr

空指針標識(nullptr)(其本質是一個內置的常量)是一個表示空指針的標識,它不是一個整數。這裡應該與我們常用的NULL宏相區別,雖然它們都是用來表示空置針,但NULL只是一個定義為常整數0的宏,而nullptr是C++11的一個關鍵字,一個內建的標識符。 nullptr和任何指針類型以及類成員指針類型的空值之間可以發生隱式類型轉換,同樣也可以隱式轉換為bool型(取值為false)。但是不存在到整形的隱式類型轉換。 有了nullptr,可以解決原來C++中NULL的二義性問題;

優雅的C++11

區間迭代

C++11擴展了for的語法,終於支持區間迭代,可以便捷的迭代一個容器的內的元素;

優雅的C++11

如果有更為複雜的場景,使用auto的優勢立刻體現出來:

優雅的C++11

更多C/C++學習資料,請私信我“代碼”,即可獲取

lambda表達式的引入

優雅的C++11

更多C/C++學習資料,請私信我“代碼”,即可獲取

不過現在好多了,lambda表達式允許用”inline”的方式來寫函數了:sort(myvector.begin(), myvector.end(), [](int i, int j) { return i< j; });

真是親切!lambda的引入應該會增加大家對STL算法的使用頻率。(這裡不過分介紹lambda,針對lambda用法發過類似文章)。

原生字符串

比如,你用標準regex庫來寫一個正則表達式,但正則表達式中的反斜槓’\’其實卻是一個“轉義(escape)”操作符(用於特殊字符),這相當令人討厭。考慮如何去寫“由反斜槓隔開的兩個詞語”這樣一個模式(\w\\w):string s = "\\w\\\\\\w"; // 不直觀、且容易出錯

請注意,在正則表達式和普通C++字符串中,各自都需要使用連續兩個反斜槓來表示反斜槓本身。然而,假如使用C++11的原生字符串,反斜槓本身僅需一個反斜槓就可以表示。因而,上述的例子簡化為:string s = R"(\w\\\w)"; // ok

初始化列表及統一初始化方法

在過去對vector的多個初始化,我們需要這樣:

int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20 };

std::vector myvector (myints, myints+8);

現在,我們可以這樣:

std::vector second ={10, 20, 30, 30, 20, 10, 10, 20};

初始化表有時可以像參數那樣方便的使用。看下邊這個例子x,y,z是string變量,Nocase是一個大小寫不敏感的比較函數):

auto x = max({x,y,z},Nocase());

初始化列表不再僅限於數組。對於常見的map、string等,我們可以使用以下語法來進行初始化

優雅的C++11

終章

優雅的C++11

更多C/C++學習資料,請私信我“代碼”,即可獲取


分享到:


相關文章: