const 限定符 學(xué)習(xí)筆記 C++


const對普通變量進(jìn)行修飾进副,以表該變量在以后的使用中不被修改叛本。

初始化

/*
*因?qū)ο笠坏﹦?chuàng)建后其值便不能被修改恬吕,所以必須進(jìn)行初始化
*根據(jù)初始化的值給定的表達(dá)式归露,初始化時機(jī)會再編譯時或運行時確定
*當(dāng)編譯確定時想诅,會在調(diào)用其值的地方編譯時便用其值進(jìn)行替換  
*(類似于define文本替換,但是define不會作類型檢查)
*/
const int i = 12;                 //編譯時初始化
const int j = get_size();         //運行時初始化

等價寫法:
int const i = 12;
int const j = get_size();

const 對象作用域

默認(rèn)僅在當(dāng)前文本文件有效
需要在多個文件中生效時,需要在其聲明和定義處用extern進(jìn)行修飾


xxx.cc
extern const int i = 123;
xxx.h
extern const int i;

const 引用及指針

引用 [1]
當(dāng)我們使用引用時一般都期望改變其值, 但是對于const對象本身是不被允許.
修改的,因此對于想把const對象綁定到引用時需要進(jìn)行const修飾, 以表該引用不會改變其值.

引用的類型必須與其引用對象的類型一致 [2], 但是在初始化常量引用時只要表達(dá)式的結(jié)果能轉(zhuǎn)換成引用的類型即可坟冲。例如

double dval = 3.14;
const int &ri = dval;
原因是編譯器做了如下替換:
const int temp = dval;
const int &ri = temp;
// temp 是編譯器臨時創(chuàng)建的用于暫存表達(dá)式求值結(jié)果的臨時變量。

// 另const引用可以綁定在非const變量上
int i = 3;
const int &k_ri = i;
i = 5;        //此時k_ri == 5溃蔫;

指針及頂層const和底層const
指針本身是個變量健提,那其也可被const修飾,用于表明該指針的值不會被改變伟叛。
由于指針指向的亦是一個變量私痹,那么該變量也存在const修飾的可能性,即一個指針變量可能存在雙層const. 所謂低層const即用于修飾指針本身不會被改變统刮,頂層const用于修飾指針指向的變量不會被改變紊遵。

int i = 1, b= 2;
const int *p = &i;  //底層const, *p解引用的值無法被改變, 但是p可以指向別的變量
*p = 4;   //不合法
p = &b;   //合法
int *const p2 = &i; //頂層const, p2無法指向其它變量侥蒙,但是*p解引用的值可以改變.
*p2 = 1;  //合法
p2 = &b;  //不合法

注意:
進(jìn)行對象拷貝時暗膜,對象必須有相同的底層const, 而頂層const則不影響.

const 在類中的使用

class Foo {
public:
    ...
    int get_i() { ++z_; return i_;}
    int get_z() { return z_; };
    ...
private:
    int i_;  //隨意...
    int z_;  //計數(shù)get_i() 被調(diào)用的次數(shù);
}

//對于Foo這樣的類鞭衩,如果某一天我們頭腦發(fā)熱想要聲明一個常量,并調(diào)用相關(guān)成員学搜,如下
const Foo k_var;
k_var.get_i();        //調(diào)用出錯
k_var.get_z();       //調(diào)用出錯
//對于成員函數(shù)的調(diào)用會提示報錯,因為這些函數(shù)的調(diào)用可能會改變內(nèi)部成員變量的值论衍,
//這與你的期望不匹配瑞佩。因此我們必須聲明一個可被常量調(diào)用的版本, 通常如下,

class Foo {
public:
    ...
    int get_i() { ++z_; return i_;}
    int get_i() const { ++z_; return i_;}    //常量版本
    int get_z() { return z_; };
    int get_z() const { return z_; };          //常量版本
    ...
}

k_var.get_i();        //調(diào)用出錯
k_var.get_z();       //正確
//此時對get_z()的調(diào)用是正確的坯台,但是get_i()仍然是錯誤的钉凌,
//因為它試圖在const成員函數(shù)里面改變成員變量的值z_,
//成員函數(shù)一旦被const修飾,通常意味著this指針的形態(tài)在其內(nèi)部是const *this(便于理解)捂人,
//那么++this->z_這樣的操作肯定是不合法的。
//但是對于z_這樣我們希望無論在常量或非常量中都希望能夠改變的值矢沿,我們可以在聲明前加mutable修飾滥搭,表明是個可變的數(shù)據(jù)

class Foo {
public:
    ...
    int get_i() { ++z_; return i_;}
    int get_i() const { ++z_; return i_;}    //常量版本
    int get_z() { return z_; };
    int get_z() const { return z_; };          //常量版本
    ...
private:
    int i_;  //隨意...
    mutable int z_;  //計數(shù)get_i() 被調(diào)用的次數(shù);
}

k_var.get_i();   //正確

  1. 實際上引用的底層實現(xiàn)即是指針. ?

  2. C++ primer 2.4.1. ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捣鲸,一起剝皮案震驚了整個濱河市瑟匆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栽惶,老刑警劉巖愁溜,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾嗅,死亡現(xiàn)場離奇詭異,居然都是意外死亡冕象,警方通過查閱死者的電腦和手機(jī)代承,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渐扮,“玉大人论悴,你說我怎么就攤上這事∧孤桑” “怎么了膀估?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耻讽。 經(jīng)常有香客問我察纯,道長,這世上最難降的妖魔是什么针肥? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任饼记,我火速辦了婚禮,結(jié)果婚禮上祖驱,老公的妹妹穿的比我還像新娘握恳。我一直安慰自己,他們只是感情好捺僻,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布乡洼。 她就那樣靜靜地躺著,像睡著了一般匕坯。 火紅的嫁衣襯著肌膚如雪束昵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天葛峻,我揣著相機(jī)與錄音锹雏,去河邊找鬼。 笑死术奖,一個胖子當(dāng)著我的面吹牛礁遵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播采记,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼佣耐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了唧龄?” 一聲冷哼從身側(cè)響起兼砖,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讽挟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懒叛,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年耽梅,在試婚紗的時候發(fā)現(xiàn)自己被綠了薛窥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐墅,死狀恐怖拆檬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妥凳,我是刑警寧澤竟贯,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站逝钥,受9級特大地震影響屑那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艘款,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一持际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哗咆,春花似錦蜘欲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至年碘,卻和暖如春澈歉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屿衅。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工埃难, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涤久。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓涡尘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親响迂。 傳聞我的和親對象是個殘疾皇子悟衩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容