【C++11】30分鐘瞭解C++11新特性
什麼是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; }
序列for迴圈
在C++中for迴圈可以使用類似java的簡化的for迴圈,可以用於遍歷陣列,容器,string以及由begin和end函式定義的序列(即有Iterator),示例程式碼如下:
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}}; for (auto p : m){ cout<<p.first<<" : "<<p.second<<endl; }
Lambda表示式
lambda表示式類似Javascript中的閉包,它可以用於建立並定義匿名的函式物件,以簡化程式設計工作。Lambda的語法如下:
[函式物件引數](操作符過載函式引數)->返回值型別{函式體}
vector<int> iv{5, 4, 3, 2, 1}; int a = 2, b = 1; for_each(iv.begin(), iv.end(), [b](int &x){cout<<(x + b)<<endl;}); // (1) for_each(iv.begin(), iv.end(), [=](int &x){x *= (a + b);}); // (2) for_each(iv.begin(), iv.end(), [=](int &x)->int{return x * (a + b);});// (3)
- []內的引數指的是Lambda表示式可以取得的全域性變數。(1)函式中的b就是指函式可以得到在Lambda表示式外的全域性變數,如果在[]中傳入=的話,即是可以取得所有的外部變數,如(2)和(3)Lambda表示式
- ()內的引數是每次呼叫函式時傳入的引數。
- ->後加上的是Lambda表示式返回值的型別,如(3)中返回了一個int型別的變數
變長引數的模板
我們在C++中都用過pair,pair可以使用make_pair構造,構造一個包含兩種不同型別的資料的容器。比如,如下程式碼:
auto p = make_pair(1, "C++ 11");
由於在C++11中引入了變長引數模板,所以發明了新的資料型別:tuple,tuple是一個N元組,可以傳入1個, 2個甚至多個不同型別的資料
auto t1 = make_tuple(1, 2.0, "C++ 11"); auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});
這樣就避免了從前的pair中巢狀pair的醜陋做法,使得程式碼更加整潔
另一個經常見到的例子是Print函式,在C語言中printf可以傳入多個引數,在C++11中,我們可以用變長引數模板實現更簡潔的Print
template<typename head, typename... tail> void Print(Head head, typename... tail) { cout<< head <<endl; Print(tail...); }
Print中可以傳入多個不同種類的引數,如下:
Print(1, 1.0, "C++11");
更加優雅的初始化方法
在引入C++11之前,只有陣列能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:
int arr[3] = {1, 2, 3} vector<int> v(arr, arr + 3);
在C++11中,我們可以使用以下語法來進行替換:
int arr[3]{1, 2, 3}; vector<int> iv{1, 2, 3}; map<int, string>{{1, "a"}, {2, "b"}}; string str{"Hello World"};
然後呢…
如果你想了解更多C++11令人興奮的新特性,我會向你推薦這兩個部落格:
相關推薦
【C++11】30分鐘瞭解C++11新特性
什麼是C++11 C++11是曾經被叫做C++0x,是對目前C++語言的擴充套件和修正,C++11不僅包含核心語言的新機能,而且擴充套件了C++的標準程式庫(STL),併入了大部分的C++ Technical Report 1(TR1)程式庫(數學的特殊函式除外)。 C++11包括大量的新特性
C++:30分鐘瞭解C++11新特性
什麼是C++11 C++11是曾經被叫做C++0x,是對目前C++語言的擴充套件和修正,C++11不僅包含核心語言的新機能,而且擴充套件了C++的標準程式庫(STL),併入了大部分的C++ Technical Report 1(TR1)程式庫(數學的特殊函式除外)。 C+
【網站搭建】30分鐘輕鬆搭建網站應用
30分鐘輕鬆搭建網站應用 今天給大家分享如何30分鐘快速搭建網站。使用免費開源個人部落格建站工具WordPress部署部落格網站,最終實現:管理員-部署網站並進行日常運維、訪客-通過網際網路訪問部落格、瀏覽文章等。 先看看簡單的網站部署架構示意圖: 具體的應用部署分為以下幾個大的步驟。
C++11--20分鐘瞭解C++11 (上)
20分鐘瞭解C++ 11 1 初始化列表 Initializer List //C++ 03中用初始化列表初始化陣列 int arr[4] = {3, 2, 4, 5}; vector<int> v; v.push_back(3); v.push_back(2); v.push_back(
C++11--20分鐘瞭解C++11 (下)
20分鐘瞭解C++11 9 override關鍵字 (虛擬函式使用) * * 避免在派生類中意外地生成新函式 */ // C++ 03 class Dog { virtual void A(int); virtual void B() const; } class Yellowdog
【C語言】簡單的瞭解遞迴(求斐波那契,n的階乘,字串長度,把一個整型(無符號),轉化為字元型並打印出來)
簡單瞭解遞迴1.什麼是遞迴???程式設計程式呼叫自身的程式設計技巧稱為遞迴( recursion)遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接 或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的 規模較小的問
【同余】HDU 6108 小C的倍數問題
同余 pen display col 數學 include namespace http spl http://acm.hdu.edu.cn/showproblem.php?pid=6108 【題意】 給定進制P,求有多少個B滿足P進制下,一個正整數是B的倍數的充分必要條件
【獨家分享】220個經典C程序源碼
dvr mk4 c程序 FN href ec2 分享 get 源碼 encc8pgenf矯兌敲檔堵確群輝喚品《http://weibo.com/p/230927987904503212675072》 ntqc5dbx1i航尉牡緯謝卑道曳擅睪《http://weibo.co
微信支付 統一下單 欄位 body 為中文時 報【簽名錯誤】解決方案(C# SDK)
方案一 如果你是從微信支付官網下載的 .NET C#【微信支付】API對應的SDK 呼叫示例 檢視原始碼,會發現這個SDK中的 WxPayData 的類的 CalcHMACSHA256Hash 簽名方法採用的是 Encoding.Default 
微信支付 統一下單 字段 body 為中文時 報【簽名錯誤】解決方案(C# SDK)
def salt ext var pri utf8 () rap vat 方案一 如果你是從微信支付官網下載的 .NET C#【微信支付】API對應的SDK 調用示例 查看源碼,會發現這個SDK中的 WxPayData 的類的 CalcHMACSHA256Hash 簽名
【EmguCV視訊】VS2017+EmguCV3.4(C# OpenCV)高清入門視訊教程
視訊採用VS2017 + EmguCV3.4版本錄製,內容類似本人的Python和C++版本,如果需要的朋友可加我諮詢,或關注公眾號獲得最新訊息,謝謝! 視訊共40講,如需購買請聯絡作者QQ3252314061 1---40講目錄如下: 你
【leetcode日記】1.Two Sum (c語言)
Description: Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may ass
【效能優化】如何實現:c/c++整個專案工程使用一個全域性變數
如果工程中存在malloc/free等頻繁動態分配和釋放記憶體的情況,一般優化思路是: 方法1:加記憶體池 方法2:使用全域性buf 方法1的優點:眾所周知,不詳細說了。 方法2使用場合:整個工程執行過程中,動態分配的記憶體大小有規律性且有最大個數。可以在工程起始
【58沈劍 架構師之路】1分鐘瞭解MyISAM與InnoDB的索引差異
《資料庫索引,到底是什麼做的?》介紹了B+樹,它是一種非常適合用來做資料庫索引的資料結構: (1)很適合磁碟儲存,能夠充分利用區域性性原理,磁碟預讀; (2)很低的樹高度,能夠儲存大量資料; (3)索引本身佔用的記憶體很小; (4)能夠很好的支援單點查詢,範圍查詢,有序性查詢; 資料
【排序演算法】歸併排序(C++)
歸併排序的遞迴實現 C++ class MergeSort { public: int* mergeSort(int* A, int n) { // write code he
【58沈劍 架構師之路】1分鐘瞭解MyISAM與InnoDB的索引差異
《資料庫索引,到底是什麼做的?》介紹了B+樹,它是一種非常適合用來做資料庫索引的資料結構: (1)很適合磁碟儲存,能夠充分利用區域性性原理,磁碟預讀; (2)很低的樹高度,能夠儲存大量資料; (3)索引本身佔用的記憶體很小; (4)能夠很好的支援單點查詢,範圍查詢,有序性查詢;
【高精度】高精度分數[c++]
【高精度】高精度分數
【演算法筆記】第二章: C/C++ 快速入門
【演算法筆記】第二章: C/C++ 快速入門 標籤(空格分隔):【演算法筆記】 第二章:C/C++ 快速入門 第二章:C/C++ 快速入門 2.0 引言 2.1 基本資料型別
【資料結構】連結串列操作C實現
資料型別的定義 typedef int DataType; typedef struct ListNode { DataType data; struct ListNode *next; } ListNode; 連結串列的初始化和銷燬 連結串列的初
【推薦看】什麼時候用C而不用C++?
前兩天不是有一個問題是“什麼時候用C++而不用C”,我一直覺得問錯了,難道不是“能用C++就不用C”麼?那麼當然就要討論什麼時候用C而不用C++啦。 一直以來都嚴格遵循OO的原則來進行開發(用的工具是C#和Qt),直到最近,開始接手某同事的程式碼,整個專案20多個小工程(程式碼量並不多),除了介面部分用