日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C++ const限定符和auto类型说明符

發(fā)布時(shí)間:2023/12/20 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ const限定符和auto类型说明符 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

const限定符

# 1.限定常量

有時(shí)我們希望定義這樣的變量:它的值不能被改變。為了滿足這一要求,我們使用const對變量的類型加以限定:

const?int?bufSize?=?512;

這樣就把bufSize定義成了一個(gè)常量,它的值不能再發(fā)生變化。所以這也就意味著const對象必須要初始化。那么初始化操作對于const對象來說意味著什么呢?如果利用一個(gè)對象去初始化另外一個(gè)對象,則它們是不是const都無關(guān)緊要:

int?i?=?42; const?int?ci?=?i;??//正確 int?j?=?ci;??//正確

這里要注意的是,雖然使用常量ci去初始化j,但是拷貝一個(gè)對象的值并不會改變它,一旦完成拷貝,新的對象就和原來的對象沒有什么關(guān)系了。

# 2.const對象僅在文件內(nèi)有效

默認(rèn)情況下,const對象被限定僅在文件內(nèi)有效。當(dāng)多個(gè)文件中出現(xiàn)了同名的const變量時(shí),其實(shí)等同于在不同文件中分別定義了獨(dú)立的變量。但是,如果需要將const變量在多個(gè)文件中實(shí)現(xiàn)共享該怎么辦呢?要做到在一個(gè)文件中定義const,而在其它多個(gè)文件中聲明并且使用它,解決的辦法就是:對于const變量不管是聲明還是定義都添加extern關(guān)鍵字,這樣只需要定義一次就夠了。

//第一個(gè)文件file1 extern?const?int?bufSize?=?fcn(); //第二個(gè)文件file2 extern?const?int?bufSize;??//與file1里面的是同一個(gè)

const的引用

對常量的引用不能被用作修改它所綁定的對象:

const?int?ci?=?1024; const?int?&r1?=?ci;??//正確,引用及其對應(yīng)的對象都是常量 r1?=?42;????//錯(cuò)誤,r1是對常量的引用 int?&r2?=?ci;????//錯(cuò)誤,r2是非常量引用,ci是一個(gè)常量

我們知道,引用的類型必須與其所引用的對象的類型一致,但是有兩個(gè)特殊情況:(1)初始化常量引用時(shí)允許用任意表達(dá)式作為初始值,只要該表達(dá)式的結(jié)果能轉(zhuǎn)換成引用的類型即可。

double?dval?=?3.14; const?int?&ri?=?dval;

ri引用了一個(gè)int型的數(shù),但是dval確實(shí)一個(gè)雙精度浮點(diǎn)數(shù),編譯器會將其變成如下形式:

const?int?temp?=?dval; const?int?&ri?=?temp;

(2)對const的引用可能引用一個(gè)并非const的對象

int?i?=?42; const?int?&ri?=?i;

這種方式是允許的。

# const與指針

頂層const

頂層const表示指針本身是一個(gè)常量,不能改變它的指向。

int?i?=?43; int?*?const?p1?=?&i;

底層const表示指針?biāo)傅膶ο笫且粋€(gè)常量。

int?i?=?43; const?int?*?p1?=?&i; int?const?*?p2?=?&i;

# 常量表達(dá)式與constexpr

常量表達(dá)式指的是值不會改變且在編譯過程中就能得到計(jì)算結(jié)果的表達(dá)式

const?int?max_file?=?20;????//是常量表達(dá)式 const?int?limit?=?max_file?+?1????//limit是常量表達(dá)式 int?stuff_size?=?10;??????//stuff_size不是常量表達(dá)式 const?int?sz?=?getSize();?????//sz不是常量表達(dá)式

C++11標(biāo)準(zhǔn)規(guī)定,允許將變量聲明為constexpr類型以便由編譯器來驗(yàn)證變量的值是否是一個(gè)常量表達(dá)式。聲明為constexpr的變量一定是一個(gè)常量,而且必須用常量表達(dá)式初始化:

constexpr?int?mf?=?20;??//??正確 constexpr?int?limit?=?mf?+?1;????//mf+1是常量表達(dá)式 constexpr?int?sz?=?size();??????//只有當(dāng)size()是一個(gè)constexpr函數(shù)時(shí)才是一條正確的語句

需要注意的是,在constexpr聲明中如果定義了一個(gè)指針,限定符constexpr僅針對指針有效,與所指的對象無關(guān)。

# auto類型說明符

C++11引入auto類型說明符,它可以讓編譯器通過初始值來推斷變量的類型。顯然,auto定義的變量必須有初始值。但是,auto會忽略掉頂層const,:

const?int?ci?=?i,?&cr?=?ci; auto?b?=?ci;?????//b是一個(gè)整數(shù) auto?c?=?cr;????//c是一個(gè)整數(shù) auto d =?&i;?//d是一個(gè)整型指針 auto e =?&ci;??//e是一個(gè)指向整型常量的指針(這是底層const)

但是,有時(shí)會遇到一種情況:我想知道這個(gè)表達(dá)式結(jié)果的類型,但是我又不想真的用這個(gè)表達(dá)式的結(jié)果來初始化變量。這個(gè)時(shí)候就要用到另外一個(gè)類型指示符decltype

decltype(f())?sum?=?x;????//sum的類型就是f()函數(shù)的返回類型

編譯器并不會實(shí)際調(diào)用函數(shù)f(),而是使用當(dāng)調(diào)用發(fā)生時(shí)f的返回值類型作為sum的類型。decltype的一個(gè)坑:對于decltype所用的表達(dá)式來說,如果decltype給變量加上括號,則返回的是引用類型:

int?i?=?42; decltype((i))?d;????//錯(cuò)誤,d是int&,必須初始化

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈


嵌入式Linux

微信掃描二維碼,關(guān)注我的公眾號?

總結(jié)

以上是生活随笔為你收集整理的C++ const限定符和auto类型说明符的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。