真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++核心技術(shù)知識有哪些

這篇文章主要介紹“C++核心技術(shù)知識有哪些”,在日常操作中,相信很多人在C++核心技術(shù)知識有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++核心技術(shù)知識有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站設(shè)計制作、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)海倫,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

1. 自動類型推導(dǎo) auto & decltype()

關(guān)于類型可能很多同學(xué)會覺得這個話題比較簡單,因為這基本是所有語言的基礎(chǔ),C/C++、Java等等這些靜態(tài)類型語言...,基本都放在第一章節(jié)講解,而且很多語言是相通的,但是C++有一個比較強(qiáng)大的關(guān)鍵字auto,我覺得有必要強(qiáng)調(diào)一下。其實(shí),我們可以根據(jù)這個詞的意思差不多猜出這個關(guān)鍵字的功能 —— 自動類型推導(dǎo)。也就是說如果一個變量的類型是auto時,它會根據(jù)變量的值自動推導(dǎo)出類型。那么,可能就會有朋友產(chǎn)生疑問了:變量是什么類型不是很容易看出來嗎?感覺沒什么用處。也許在C語言或Java中,確實(shí),變量的類型清晰可見,但是C++就不一樣了。例如,

templateauto add(T t, U u) { return t + u; }

C++中有模板的概念,代碼中所示模板就是實(shí)現(xiàn)兩個對象t和u的加法,當(dāng)我們調(diào)用add函數(shù)時,由于使用了auto關(guān)鍵字,返回值類型會自動推導(dǎo),即為t+u結(jié)果類型,如下:

auto  b = add(2, 5);     //這里的b是int型auto  c = add(2.3, 8);    //這里的c是float型

到這里,可能又有朋友說,這也沒什么呀,我還是能一眼看出結(jié)果的類型,但是這里因為有了auto,才更加體現(xiàn)了C++模板的優(yōu)勢,定義一次函數(shù),就可以進(jìn)行多種類型數(shù)據(jù)的運(yùn)算處理,并可以返回不同類型的結(jié)果,實(shí)現(xiàn)代碼的復(fù)用。那么,除了這種比較簡單的情況,還有沒有比較復(fù)雜的類型?下面接著看:

vector > pred_boxes;for (auto pred_box = pred_boxes.begin(); pred_box != pred_boxes.end(); pred_box++){  pred_box->push_back(batch_id);}

這是我從caffe框架中截取的一段代碼,先不管其含義,僅僅關(guān)注auto的用法。這里是實(shí)現(xiàn)一個遍歷的功能,將batch_id存到pred_box中。我們定義了一個迭代器pred_box,這里由于auto會自動推導(dǎo)其類型,我們幾乎什么都不用管。但是實(shí)際上它的類型是什么樣的呢?請看:

vector >::iterator pred_box;

就是上面的代碼中所寫,是不是覺得繁瑣了很多。說到遍歷,我們也可以將上面的代碼這樣簡化:

vector > pred_boxes;for (auto pred_box :pred_boxes){  pred_box->push_back(batch_id);}

世界又清凈了一些!

說完auto,C++中還有一個與自動類型獲取有關(guān)的關(guān)鍵字 —— decltype。
那么這二者有什么區(qū)別呢?auto關(guān)鍵字根據(jù)表達(dá)式的值推導(dǎo)其類型,可以假想為auto變成了這個類型(實(shí)際上不是)。在這個過程中表達(dá)式是會被計算的,但是有時候我們并不想表達(dá)式被計算,但是仍然希望得到表達(dá)式值的類型,這就用到了decltype,用法就是decltype(表達(dá)式),舉個栗子:

decltype(pred_boxes) pred_boxes1;

我們定義一個和pred_boxes類型的相同的變量pred_boxes1

同樣,對于下面的表達(dá)式:

int &k = 1;decltype(k)  j = 1;

j的類型就是int引用類型了。

2. 常量限定符const與 constexpr

講完了自動類型推導(dǎo),接下來說一下C++中與常量定義相關(guān)的兩個關(guān)鍵詞 const 和 constexpr。

首先它們都是限定符,起到對變量進(jìn)行限定的作用,當(dāng)我們不希望一個變量的值被修改時,我們就需要用const進(jìn)行限定。比如我們希望固定一個緩沖區(qū)的大小:

const int bufferSize = 1024;

那么,這里bufferSize便為不可修改變量,這里的用法與在C中一樣,下面講一下const在C++中的用法。

(1)const的用法

const與引用一起使用

在C++中const會經(jīng)常與引用一起使用,如下:

const int i = 512;const int &j = i;

這里i與j都是常量,i是整型常量,就是整型引用常量(指向常量的引用),而且需要注意一點(diǎn),const常量只能作為const常量的值(有點(diǎn)拗口?。?/p>

舉個例子:

這里j是一個指向常量的引用,它也可以作為一個值,初始化另一個常量如下

const int &k = j;

這里k如果是一個引用的話必須為常量,如果不是引用的話,可是是一個變量。如下:

int k = j;

可能有的朋友會有些疑惑,既然

int &k = j;

不可以,為什么去掉&就可以了呢?簡單解釋一下,其實(shí)引用并不是一個實(shí)體對象,而是代表了一種綁定關(guān)系。

對于 

int &k = j;

來說,其含義是將k綁定到j(luò), 雖然k和j名字不同,但是在硬件上,它們占用同一塊內(nèi)存,既然j是常量,那么k必然是常量,而

int k = j; 

就不一樣了

const與指針一起使用

除了與引用在一起鬼混,const還常常喜歡與指針一起玩耍。這里先簡單說一下引用和指針的區(qū)別,雖然很簡單,但是我覺得還是有必要略講一下。上面談到引用其實(shí)并不是一個實(shí)體對象,即不像整型變量、結(jié)構(gòu)體、枚舉等等這些變量獨(dú)自占據(jù)內(nèi)存空間,引用表示了一種綁定關(guān)系,將一個別名綁定到一塊內(nèi)存空間(所以定義引用變量時必須要初始化)。但是指針就不同了,本質(zhì)上,指針是一塊存儲內(nèi)存地址的變量,它有一塊內(nèi)存空間存儲地址信息。那么const與指針一起使用,又會發(fā)生什么有意思的事呢?一起來看幾個例子:

const double pi = 3.14;const double *ptr  = π

ptr是一個指向const double類型的指針,所以其值必須為const double類型的地址,這里只需要保證指針指向的值不變即可,至于ptr中存的值(地址)是可以改變的,也就是說這里的const限定了指針指向的內(nèi)存存的值,即上面pi不可改變。

上面說過,指針本身也是一個實(shí)體對象,不像引用徒有虛名。所以有一個叫常量指針的(const pointer)家伙。既然叫常量指針,const限定的是指針本身,這就意味著指針中的值不可改變,舉個例子:

double pi = 3.14;double * const ptr = π

ptr中的值在其生命周期中永遠(yuǎn)指向&pi, 此時pi可以隨意改變,但是ptr中存的地址是固定的。

那么將這兩者結(jié)合起來就可以得到

const double pi = 3.14;const double * const ptr = π

這樣ptr無論指向的值還是其本身都是不可以改變的。

const與類的成員函數(shù)一起使用

const除了與“變量”一起使用外,在C++中還會與類的成員函數(shù)一起用。這個涉及到類與對象相關(guān)的知識,還有成員函數(shù),成員變量,展開講的話會比較多,后面與類和對象放一起說。

(2)constexpr的用法

上面我們講了講const的用法,下面就簡單說下constexpr。constexpr作為限定詞在含義上與const并不相同,constexpr是為了在初始化一個變量時,讓編譯器判斷這個變量的值是否是一個常量或常量表達(dá)式,如果該變量用constexpr限定,但是初始化值并不是一個常量或者常量表達(dá)式,編譯器便會報錯,(因為我們在定義常量時并不確定右邊的表達(dá)式是否是常量表達(dá)式),這樣看來還是難于解釋,下面就用幾個例子解釋一下:

constexpr int a = k +1;constexpr int b = newfun();

在這兩個例子中,編譯器在編譯時會檢查k+1和newfun()是否是常量表達(dá)式(函數(shù)),如果不是,上面的定義就不成立,編譯會失敗。

常量表達(dá)式一個重要的特點(diǎn)就是在編譯階段已經(jīng)確定,下面這個就不是常量表達(dá)式:

const int b = newfunc();

因為,這里newfunc()在程序運(yùn)行的時候才知道結(jié)果,在編譯階段因為沒有用constexpr限定,編譯器并不會檢查newfunc()

前面我們說了指針和引用,這里constexpr也是可以和它們一起使用的,但是限制地比較嚴(yán)格。以下用指針舉例:

const int *i = nullptr;constexpr int *i = nullptr;

第一個i表示指向int常量的指針

第二個表示指向int的常量指針

3.  空指針NULL與nullptr

下面說一下C++中的空指針。熟悉C的朋友對空指針非常熟悉,NULL。對,C++中仍然有這個關(guān)鍵字,不信可以看上面的關(guān)鍵字表。但是,在標(biāo)準(zhǔn)C++不建議使用NILL,因為NULL是整數(shù)0的宏定義。我們經(jīng)常使用空指針來初始化一個指針變量,試想一下如果用一個整數(shù)作為指針變量的值,總是有些不妥,盡管編譯器不會報錯。所以C++11標(biāo)準(zhǔn)推薦我們使用nullptr,這個關(guān)鍵字本身就是代表空指針,更加合適,所以下次如果你們在C++中初始化一個指針變量時,就用名副其實(shí)的nullptr吧。

到此,關(guān)于“C++核心技術(shù)知識有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


分享題目:C++核心技術(shù)知識有哪些
轉(zhuǎn)載注明:http://weahome.cn/article/geohei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部