最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解C/C++中const限定符總結(jié)

 更新時(shí)間:2020年02月19日 09:33:54   作者:smile_zyk  
const是一種限定符,被const所限定的變量其值不可以被改變。。這篇文章主要介紹了C/C++中const限定符總結(jié),通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

const限定符

const是一種限定符,被const所限定的變量其值不可以被改變。

const的初始化

由于const一旦創(chuàng)建其值就不能夠被改變,所以我們必須對其進(jìn)行初始化

const int a;//錯(cuò)誤,const變量必須進(jìn)行初始化!
const int b=10;//正確,編譯時(shí)初始化
const int c=get_size();//正確,運(yùn)行時(shí)初始化

相同類型的變量相互初始化時(shí),不論變量是否被const限定我們都可以進(jìn)行隨意的相互拷貝。因?yàn)樵诳截愡^程中我們只會用到等式右邊變量的右值屬性,無須在意其是否可以改變。

int m = 5;
const int n = m;
int j = n;

const與指針

頂層const與底層const

對于指針來說,由于其指向另一片內(nèi)存的特點(diǎn),有三種不同的const情況,即:

  1. 指向常量的指針(const int *)
  2. 常量指針(int * const)
  3. 指向常量的常量指針(const int *const)

我們一般稱符合第一種情況的為具有底層const屬性。

符合第二種情況的為具有頂層const屬性。

第三種情況兼而有之。

關(guān)于帶有const的指針的相互賦值(或者初始化)問題

  • 頂層const并不會影響變量間的相互拷貝(原因是頂層const只保證自身的值不會改變,const沒有改變自身的變量類型,在拷貝時(shí)只是使用該類型的右值)。
  • 如果等號右邊是底層const,那么等號左邊必須保證為相同的底層const(或者等號右邊的類型可以轉(zhuǎn)換成等號左邊的類型),否者表達(dá)式無法通過編譯。

關(guān)于底層與頂層const的一些想法

const的底層與頂層屬性似乎只在指針上存在。但是c++primer中有這樣的代碼和注釋:

const int ci=1,&cr=ci;
auto b=ci;//b是一個(gè)整數(shù)(ci的頂層const特性被忽略掉了)
auto c=cr;//c是一個(gè)整數(shù)(cr是ci的別名,ci本身是一個(gè)頂層const)

這段代碼是為了說明auto說明符一般會忽略掉頂層const的特性,在注釋中明確寫著 ci本身是一個(gè)頂層const 。

這也與我的看法一致,底層與頂層const實(shí)際上并不是指針?biāo)赜械?,只要是不能改變對象自身的對象都具有頂層const,而不能改變自己所指向的對象的對象都具有底層const。

從這個(gè)角度看,引用實(shí)際上自帶頂層const。

底層const的隱式轉(zhuǎn)換

上面提到,只有在等號右邊和等號左邊的類型具有相同的底層const屬性,才可以進(jìn)行賦值或者初始化。

然而有些時(shí)候等號右邊可能并不具有和等號左邊一致的底層const卻依然可以成立,這是因?yàn)榈忍栍疫叺念愋桶l(fā)生了隱式轉(zhuǎn)換從而具有了和等號左邊類型相同底層const屬性。

例如:

int i=5;
int *p=&i;
const int *cp=p//int*隱式轉(zhuǎn)換稱為了const int*

為什么int 轉(zhuǎn)換成const int 被設(shè)定為合法的呢,因?yàn)樵趯nt 轉(zhuǎn)換為const int 的過程中用戶的權(quán)限變小了,在這一轉(zhuǎn)換過程中并不會使程序變得不可靠。

由此我們可以得知非底層const的指針是可以通過隱式轉(zhuǎn)換轉(zhuǎn)變成底層const的。

const與引用

可以把引用綁定在const的變量上,稱為const的引用,對常量的引用。

與普通的引用不同的是,對常量的引用不能被用作修改它所綁定的對象

const int ci=5;
const int &r=ci;
r=6//錯(cuò)誤不可以通過常引用來修改值
int &r2=ci//錯(cuò)誤,試圖讓一個(gè)非常量引用指向一個(gè)常量對象。

const引用的初始化

我們知道對于引用來說初始化時(shí)一定要用一個(gè)對象初始化,且該對象的類型需要與之匹配。

但是const的引用是個(gè)例外,在初始化常量引用時(shí)允許用任意表達(dá)式作為初始值,只要該表達(dá)式的結(jié)果能轉(zhuǎn)換成引用的類型即可,甚至允許為一個(gè)常量引用綁定非常量的對象、字面值或者是表達(dá)式。

int i=42;
const int &r1=i;//允許將const int&綁定到一個(gè)普通int對象上
const int &r2=3.14;//正確:r2是一個(gè)常量引用
const int &r3=r1*2;//正確:r3是一個(gè)常量引用
int &r4 =r1*2;//錯(cuò)誤,非常量引用不能用表達(dá)式初始化

C++primer中給出了可以這么做的原因:

要想理解這種例外情況的原因,最簡單的方法是弄清楚當(dāng)一個(gè)常量引用被綁定到另外一種類型上都時(shí)到底發(fā)生了什么:

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

此處ri引用了一個(gè)int型的數(shù)。對ri的操作應(yīng)該是整數(shù)運(yùn)算,但dval卻是一個(gè)雙精度浮點(diǎn)數(shù)而非整數(shù)。因此為了確保讓ri綁定一個(gè)整數(shù),編譯器把上述代碼變成了如下形式:

const int temp=dval;//由雙精度浮點(diǎn)數(shù)生成一個(gè)臨時(shí)的整型常量
const int &ri=temp;//讓ri綁定這個(gè)臨時(shí)量

在這種情況下,ri綁定了一個(gè)臨時(shí)量對象。所謂臨時(shí)量對象就是當(dāng)編譯器需要一個(gè)空間來暫存表達(dá)式的求值結(jié)果時(shí)臨時(shí)創(chuàng)建的一個(gè)未命名的對象。C++程序員們常常把臨時(shí)量對象簡稱為臨時(shí)量。

const與auto類型說明符

auto類型說明符是C++11中新引入的類型說明符,可以自動推斷類型。

編譯器推斷出來的auto類型有時(shí)候和初始值的類型并不完全一樣,編譯器會適當(dāng)?shù)母淖兘Y(jié)果類型使其更符合初始化規(guī)則。

auto在推斷帶有const的對象時(shí),編譯器一般會忽略掉頂層const,同時(shí)底層const則會保留下來。 另外對于引用由于引用沒有真正的實(shí)體,所以如果用一個(gè)引用來初始化auto類型時(shí),auto實(shí)際上為引用所指向的對象的類型,而非引用,如果要說明其為引用類型,需要使用auto&。

const int ci=i,&cr=ci;
auto b=ci;//b是一個(gè)整數(shù)(ci的頂層const特性被忽略掉了)
auto c=cr;//c是一個(gè)整數(shù)(cr是ci的別名,ci本身是一個(gè)頂層const)
auto d=&i;//d是一個(gè)整型指針(整數(shù)的地址就是指向整數(shù)的指針)
auto e=&ci;//e是一個(gè)指向整數(shù)常量的指針(對常量對象取地址是一種底層const)

如果希望推斷出的auto類型是一個(gè)頂層const,需要明確指出:

const auto f=ci;//ci的推演類型為int,f是const int。

總結(jié)

以上所述是小編給大家介紹的C/C++中const限定符總結(jié),希望對大家有所幫助,也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C語言字符串?dāng)?shù)組詳解

    C語言字符串?dāng)?shù)組詳解

    這篇文章主要介紹了C語言字符串?dāng)?shù)組詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言實(shí)現(xiàn)會員管理系統(tǒng)

    C語言實(shí)現(xiàn)會員管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)會員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++ explicit關(guān)鍵字的使用詳解

    C++ explicit關(guān)鍵字的使用詳解

    這篇文章主要介紹了C++ explicit關(guān)鍵字的使用詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++?指針常量和常量指針的區(qū)別小結(jié)

    C++?指針常量和常量指針的區(qū)別小結(jié)

    在C++學(xué)習(xí)使用過程中,每個(gè)人都不可避免地使用指針,而且都或多或少的接觸過常量指針或指針常量,本文主要介紹了C++?指針常量和常量指針的區(qū)別小結(jié),感興趣的可以了解一下
    2023-12-12
  • Python繪圖之詳解matplotlib

    Python繪圖之詳解matplotlib

    這篇文章主要介紹了Python繪圖之詳解matplotlib,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ lambda函數(shù)詳解

    C++ lambda函數(shù)詳解

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風(fēng)格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學(xué)習(xí)一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C語言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)

    C語言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)掃雷小游戲,適合初學(xué)者練習(xí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • c++ 類函數(shù)作為模板參數(shù)實(shí)現(xiàn)方式詳解

    c++ 類函數(shù)作為模板參數(shù)實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了c++ 類函數(shù)作為模板參數(shù)實(shí)現(xiàn)方式,在實(shí)現(xiàn)中加入增強(qiáng)邏輯,這種方式對代碼侵入性過高,而且無法控制該邏輯是否需要,如果不需要的話又得重新修改代碼實(shí)現(xiàn),需要的朋友可以參考下
    2023-03-03
  • c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例)

    c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例)

    這篇文章主要介紹了c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例),需要的朋友可以參考下
    2018-01-01
  • 詳解C/C++ Linux出錯(cuò)處理函數(shù)(strerror與perror)的使用

    詳解C/C++ Linux出錯(cuò)處理函數(shù)(strerror與perror)的使用

    我們知道,系統(tǒng)函數(shù)調(diào)用不能保證每次都成功,必須進(jìn)行出錯(cuò)處理,這樣一方面可以保證程序邏輯正常,另一方面可以迅速得到故障信息。本文主要為大家介紹兩個(gè)出錯(cuò)處理函數(shù)(strerror、perror)的使用,需要的可以參考一下
    2023-01-01

最新評論

偏关县| 呼图壁县| 洛扎县| 阿坝| 滨州市| 昌吉市| 洪泽县| 封丘县| 巧家县| 宜兰市| 静乐县| 宣城市| 淮北市| 福州市| 怀安县| 莱西市| 弥渡县| 莎车县| 游戏| 赤壁市| 临湘市| 吉隆县| 大关县| 北海市| 南岸区| 吴忠市| 清丰县| 乐昌市| 洛浦县| 陇川县| 阳西县| 新丰县| 阿鲁科尔沁旗| 大竹县| 寻乌县| 柳林县| 淳化县| 盐池县| 福鼎市| 吴堡县| 林州市|