日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
每個(gè)開(kāi)發(fā)者都應(yīng)該了解的一些C++特性

作為一門編程語(yǔ)言,C++已經(jīng)進(jìn)化了很多。

成都創(chuàng)新互聯(lián)主營(yíng)渭源網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,app開(kāi)發(fā)定制,渭源h5微信小程序開(kāi)發(fā)搭建,渭源網(wǎng)站營(yíng)銷推廣歡迎渭源等地區(qū)企業(yè)咨詢

當(dāng)然,這些改變不是一夜之間發(fā)生的。曾幾何時(shí),C++缺乏活力,導(dǎo)致人們不太喜歡這門語(yǔ)言。

但是,當(dāng) C++標(biāo)準(zhǔn)委員會(huì)決定加快轉(zhuǎn)變時(shí),情況就不同了。

自 2011 年以來(lái),C++已經(jīng)成為一種不斷發(fā)展的動(dòng)態(tài)語(yǔ)言,而這正是很多人所期許的。

不要誤以為是這門語(yǔ)言變得簡(jiǎn)單了,實(shí)際并沒(méi)有。它仍然是被廣泛使用的最難編程語(yǔ)言之一。但是相比于之前的版本,確實(shí)對(duì)用戶更加友好了。

今天,我們深入發(fā)掘一下每位開(kāi)發(fā)者都應(yīng)該了解的新特性(這些新特性從 C++11 時(shí)開(kāi)始出現(xiàn),距今已有八年歷史了)。注意,本文略過(guò)了一些高級(jí)特性,可能會(huì)在以后的內(nèi)容中詳細(xì)探討。

auto 概念

當(dāng) C++11 ***次引入 auto,一切都變得更簡(jiǎn)單了。

auto 的概念是讓 c++編譯器在編譯時(shí)自動(dòng)推斷數(shù)據(jù)的類型,而不是每次都要求你手動(dòng)聲明類型。如果你的數(shù)據(jù)類型是

 
 
 
 
  1. map>> 

這樣的,事情會(huì)變得非常方便。

 
 
 
 

看一下第五行。沒(méi)有 initializer 時(shí)你不能聲明某些東西,這不難理解。像第五行這樣,編譯器是無(wú)法推斷數(shù)據(jù)類型的。

最初,auto 的使用是非常受限的。在之后的版本中,auto 變得更加強(qiáng)大!

第 7 和第 8 行中,我使用了花括號(hào)初始化。這個(gè)特性也是 C++11 中新加入的。

記住,當(dāng)使用 auto 時(shí),必須確保你的編譯器可以通過(guò)某種方式推斷數(shù)據(jù)類型。

現(xiàn)在問(wèn)題來(lái)了,如果我寫(xiě) auto a = {1, 2, 3} 會(huì)發(fā)生什么?會(huì)有編譯錯(cuò)誤嗎?這是向量嗎?

實(shí)際上,C++11 引入了 std::initializer_list ,如果聲明為 auto,那么初始化列表會(huì)被認(rèn)為是這種輕量級(jí)容器。

***,就像前面提到的,當(dāng)你使用復(fù)雜的數(shù)據(jù)類型時(shí),編譯器推斷數(shù)據(jù)類型會(huì)非常有用。

不要忘記查看第 25 行!表達(dá)式 auto [v1,v2] = itr.second 是 C++17 的新特性。這被稱為結(jié)構(gòu)化綁定。在之前的版本中,每個(gè)變量必須要分別進(jìn)行提取,然而結(jié)構(gòu)化綁定會(huì)使這個(gè)過(guò)程方便很多。

另外,如果你想通過(guò)引用獲取數(shù)據(jù),只需要添加一個(gè)像 auto &[v1,v2] = itr.second 這樣的符號(hào),非常簡(jiǎn)潔。

lambda 表達(dá)式

C++11 引入了 lambda 表達(dá)式,該表達(dá)式和 JavaScript 中的匿名函數(shù)非常相似。它們是沒(méi)有命名的函數(shù)對(duì)象,并且基于一些簡(jiǎn)潔的語(yǔ)法在不同的作用域捕獲變量,它們還可以分配給變量。

當(dāng)你想在代碼中快速實(shí)現(xiàn)一些小功能但并不想為此單獨(dú)編寫(xiě)整個(gè)函數(shù)時(shí),lambda 非常有用。另一種非常普遍的應(yīng)用是將其作為比較函數(shù)。

上面的例子中有很多細(xì)節(jié)。

首先,要注意到列表初始化為你節(jié)省了多少代碼。然后是通用的 begin() 和 end(),它們同樣也是 C++11 中新添加的。然后是作為數(shù)據(jù)比較器的 lambda 函數(shù)。lambda 函數(shù)的參數(shù)被聲明為 auto,這是 c++14 中新增的。在此之前,是不可以用 auto 作為函數(shù)參數(shù)的。

這里使用方括號(hào)[]作為 lambda 表達(dá)式的開(kāi)始。它定義了 lambda 函數(shù)的作用域,即它對(duì)局部變量和對(duì)象有多少權(quán)限。

下面是一些現(xiàn)代 c++中的相關(guān)定義:

  • []代表空。因此你不可以在 lambda 表達(dá)式中使用任何外部作用域的局部變量。只可以使用參數(shù)。
  • [=]代表可通過(guò)值獲取作用域內(nèi)的局部對(duì)象(局部變量和參數(shù)),即你只可以使用但不可修改。
  • [&]代表可通過(guò)引用獲取作用域內(nèi)的局部對(duì)象(局部變量和參數(shù)),即你可以像下面例子中一樣修改它。
  • [this]代表可通過(guò)值獲取 this 指針。
  • [a,&b]代表通過(guò)值獲取對(duì)象 a, 通過(guò)引用獲取對(duì)象 b。

因此,如果你想在 lambda 函數(shù)中將數(shù)據(jù)轉(zhuǎn)換成其他形式,你可以像下面這段代碼一樣,利用作用域來(lái)使用 lambda。

在上面的例子中,如果你在 lambda 表達(dá)式中使用 [factor] 取值的方式獲取了局部變量,你就不能在第五行中修改 factor,因?yàn)槟銢](méi)有權(quán)利這樣做。不要濫用你的權(quán)限!

***,注意這里 var 是引用。這保證了在 lambda 函數(shù)內(nèi)的任何改變都會(huì)真正改變 vector。

if 或 switch 語(yǔ)句里的初始狀態(tài)

當(dāng)我了解了 c++17 的這個(gè)特性之后我非常喜歡。

顯然,現(xiàn)在你可以在 if/switch 語(yǔ)句塊內(nèi)初始化變量并且進(jìn)行條件檢查了。這對(duì)保持代碼的緊湊和簡(jiǎn)潔是非常有幫助的。通常形式如下:

 
 
 
 
  1. if( init-statement(x); condition(x)) {
  2.     // do some stuff here
  3. } else {
  4.     // else has the scope of x
  5.     // do some other stuff
  6. }

編譯時(shí)執(zhí)行 constexpr

constexpr 非???

假設(shè)你有一些表達(dá)式要計(jì)算,并且它的值一旦初始化就不會(huì)改變。你可以預(yù)先計(jì)算該值并且作為宏來(lái)使用。或者像 C++11 中提供的,你可以使用 constexpr。

編程人員傾向于盡可能減少程序的運(yùn)行時(shí)間。因此如果某些操作可以讓編譯器來(lái)做,就可以減輕運(yùn)行時(shí)的負(fù)擔(dān),從而提高時(shí)間效率。

上面的代碼是 constexpr 的一個(gè)常見(jiàn)例子。

由于我們聲明 fibonacci 計(jì)算函數(shù)為 constexpr,編譯器會(huì)在編譯時(shí)預(yù)先計(jì)算 fib(20) 的值。所以編譯結(jié)束后,它可以把 const long long bigval = fib(20) 替換為 const long long bigval = 2432902008176640000;

需要注意的是,傳遞的參數(shù)是 const 值。這是聲明為 constexpr 的函數(shù)非常重要的一點(diǎn),傳遞的參數(shù)同樣要是 constexpr 或者 const。否則,該函數(shù)會(huì)像普通函數(shù)一樣執(zhí)行,即不會(huì)在編譯時(shí)預(yù)先計(jì)算。

變量也同樣可以是 constexpr。這種情況下,你應(yīng)該可以猜到,這些變量同樣也是編譯時(shí)計(jì)算的。否則,會(huì)出現(xiàn)編譯錯(cuò)誤。

有趣的是,在之后的 c++17 中,又引入了 constexpr-if 和 constexpr-lambda。

tuple

和 pair 非常相似,tuple 是一組各種數(shù)據(jù)類型的固定大小值的集合。

有時(shí)候,使用 std::array會(huì)比使用 tuple 更加方便。array 和普通 C 類型的 array 非常相似,但具有 C++標(biāo)準(zhǔn)庫(kù)的一些特性。這種數(shù)據(jù)結(jié)構(gòu)是 C++11 中新增的。

類模版參數(shù)推斷

名字有點(diǎn)長(zhǎng)。從 c++17 開(kāi)始,參數(shù)推斷也適用于標(biāo)準(zhǔn)類模版。此前,該特性只支持函數(shù)模版。

因此,

 
 
 
 
  1. std::pair user = {"M", 25}; // previous
  2. std::pair user = {"M", 25}; // C++17

類型推斷是隱式完成的。這對(duì) tuple 來(lái)說(shuō)變得更加方便。

 
 
 
 
  1. // previous
  2. std::tuple user ("M", "Chy", 25);
  3. // deduction in action! 

如果你不熟悉 C++模版,那么上述特性可能對(duì)你來(lái)說(shuō)不是很好理解。

智能指針

指針也可能并不好用。

由于 C++給編程人員提供了很大的自由度,有時(shí)這種自由可能反而會(huì)成為絆腳石。在多數(shù)情況下,都是指針在起反面作用。

幸運(yùn)的是,C++11 引入了智能指針,它比之前的原始指針更加方便,可以通過(guò)適當(dāng)?shù)刂羔樶尫艓椭_(kāi)發(fā)者避免內(nèi)存泄漏,同時(shí)也提供了額外的安全機(jī)制。

一開(kāi)始我想在這篇文章中詳細(xì)探討一下智能指針,但顯然重要的細(xì)節(jié)非常多,值得單開(kāi)一篇來(lái)寫(xiě),因此近期應(yīng)該會(huì)出一篇相關(guān)文章。

原文地址:

https://medium.freecodecamp.org/some-awesome-modern-c-features-that-every-developer-should-know-5e3bf6f79a3c

【本文是專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】


網(wǎng)站標(biāo)題:每個(gè)開(kāi)發(fā)者都應(yīng)該了解的一些C++特性
文章出自:http://www.5511xx.com/article/codsehe.html