本篇內(nèi)容主要講解“C++11新特性是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“C++11新特性是什么”吧!

目前創(chuàng)新互聯(lián)建站已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁(yè)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、利通網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
什么是C++11
C++11是曾經(jīng)被叫做C++0x,是對(duì)目前C++語(yǔ)言的擴(kuò)展和修正,C++11不僅包含核心語(yǔ)言的新機(jī)能,而且擴(kuò)展了C++的標(biāo)準(zhǔn)程序庫(kù)(STL),并入了大部分的C++ Technical Report 1(TR1)程序庫(kù)(數(shù)學(xué)的特殊函數(shù)除外)。
C++11包括大量的新特性:包括lambda表達(dá)式,類(lèi)型推導(dǎo)關(guān)鍵字auto、decltype,和模板的大量改進(jìn)。
新的關(guān)鍵字
auto
C++11中引入auto***種作用是為了自動(dòng)類(lèi)型推導(dǎo)
auto的自動(dòng)類(lèi)型推導(dǎo),用于從初始化表達(dá)式中推斷出變量的數(shù)據(jù)類(lèi)型。通過(guò)auto的自動(dòng)類(lèi)型推導(dǎo),可以大大簡(jiǎn)化我們的編程工作
auto實(shí)際上實(shí)在編譯時(shí)對(duì)變量進(jìn)行了類(lèi)型推導(dǎo),所以不會(huì)對(duì)程序的運(yùn)行效率造成不良影響
另外,似乎auto并不會(huì)影響編譯速度,因?yàn)榫幾g時(shí)本來(lái)也要右側(cè)推導(dǎo)然后判斷與左側(cè)是否匹配。
auto a; // 錯(cuò)誤,auto是通過(guò)初始化表達(dá)式進(jìn)行類(lèi)型推導(dǎo),如果沒(méi)有初始化表達(dá)式,就無(wú)法確定a的類(lèi)型 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() // 對(duì)自定義類(lèi)型進(jìn)行類(lèi)型推導(dǎo)
auto不光有以上的應(yīng)用,它在模板中也是大顯身手,比如下例這個(gè)加工產(chǎn)品的例子中,如果不使用auto就必須聲明Product這一模板參數(shù):
template <typename Product, typename Creator> void processProduct(const Creator& creator) { Product* val = creator.makeObject(); // do somthing with val } .如果使用auto,則可以這樣寫(xiě):
template <typename Creator> void processProduct(const Creator& creator) { auto val = creator.makeObject(); // do somthing with val }拋棄了麻煩的模板參數(shù),整個(gè)代碼變得更加正解了。
decltype
decltype實(shí)際上有點(diǎn)像auto的反函數(shù),auto可以讓你聲明一個(gè)變量,而decltype則可以從一個(gè)變量或表達(dá)式中得到類(lèi)型,有實(shí)例如下:
int x = 3; decltype(x) y = x;
有人會(huì)問(wèn),decltype的實(shí)用之處在哪里呢,我們接著上邊的例子繼續(xù)說(shuō)下去,如果上文中的加工產(chǎn)品的例子中我們想把產(chǎn)品作為返回值該怎么辦呢?我們可以這樣寫(xiě):
template <typename Creator> auto processProduct(const Creator& creator) -> decltype(creator.makeObject()) { auto val = creator.makeObject(); // do somthing with val }nullptr
nullptr是為了解決原來(lái)C++中NULL的二義性問(wèn)題而引進(jìn)的一種新的類(lèi)型,因?yàn)镹ULL實(shí)際上代表的是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,說(shuō)明p和q都是空指針 int a = nullptr; // 編譯失敗,nullptr不能轉(zhuǎn)型為int F(0); // 在C++98中編譯失敗,有二義性;在C++11中調(diào)用F(int) F(nullptr); return 0; }序列for循環(huán)
在C++中for循環(huán)可以使用類(lèi)似java的簡(jiǎn)化的for循環(huán),可以用于遍歷數(shù)組,容器,string以及由begin和end函數(shù)定義的序列(即有Iterator),示例代碼如下:
map<string, int> m{{"a", 1}, {"b", 2}, {"c", 3}}; for (auto p : m){ cout<<p.first<<" : "<<p.second<<endl; }Lambda表達(dá)式
lambda表達(dá)式類(lèi)似Javascript中的閉包,它可以用于創(chuàng)建并定義匿名的函數(shù)對(duì)象,以簡(jiǎn)化編程工作。Lambda的語(yǔ)法如下:
[函數(shù)對(duì)象參數(shù)](操作符重載函數(shù)參數(shù))->返回值類(lèi)型{函數(shù)體}
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)[]內(nèi)的參數(shù)指的是Lambda表達(dá)式可以取得的全局變量。(1)函數(shù)中的b就是指函數(shù)可以得到在Lambda表達(dá)式外的全局變量,如果在[]中傳入=的話,即是可以取得所有的外部變量,如(2)和(3)Lambda表達(dá)式
()內(nèi)的參數(shù)是每次調(diào)用函數(shù)時(shí)傳入的參數(shù)。
->后加上的是Lambda表達(dá)式返回值的類(lèi)型,如(3)中返回了一個(gè)int類(lèi)型的變量
變長(zhǎng)參數(shù)的模板
我們?cè)贑++中都用過(guò)pair,pair可以使用make_pair構(gòu)造,構(gòu)造一個(gè)包含兩種不同類(lèi)型的數(shù)據(jù)的容器。比如,如下代碼:
auto p = make_pair(1, "C++ 11");
由于在C++11中引入了變長(zhǎng)參數(shù)模板,所以發(fā)明了新的數(shù)據(jù)類(lèi)型:tuple,tuple是一個(gè)N元組,可以傳入1個(gè), 2個(gè)甚至多個(gè)不同類(lèi)型的數(shù)據(jù)
auto t1 = make_tuple(1, 2.0, "C++ 11"); auto t2 = make_tuple(1, 2.0, "C++ 11", {1, 0, 2});這樣就避免了從前的pair中嵌套pair的丑陋做法,使得代碼更加整潔
另一個(gè)經(jīng)常見(jiàn)到的例子是Print函數(shù),在C語(yǔ)言中printf可以傳入多個(gè)參數(shù),在C++11中,我們可以用變長(zhǎng)參數(shù)模板實(shí)現(xiàn)更簡(jiǎn)潔的Print
template<typename head, typename... tail> void Print(Head head, typename... tail) { cout<< head <<endl; Print(tail...); }Print中可以傳入多個(gè)不同種類(lèi)的參數(shù),如下:
Print(1, 1.0, "C++11");
更加優(yōu)雅的初始化方法
在引入C++11之前,只有數(shù)組能使用初始化列表,其他容器想要使用初始化列表,只能用以下方法:
int arr[3] = {1, 2, 3} vector<int> v(arr, arr + 3);在C++11中,我們可以使用以下語(yǔ)法來(lái)進(jìn)行替換:
int arr[3]{1, 2, 3}; vector<int> iv{1, 2, 3}; map<int, string>{{1, "a"}, {2, "b"}}; string str{"Hello World"};到此,相信大家對(duì)“C++11新特性是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享標(biāo)題:C++11新特性是什么
路徑分享:http://www.chinadenli.net/article12/gidhgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、ChatGPT、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、微信公眾號(hào)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)