C++ const 分析

1、C語言中的const:

  • const修飾的變量是只讀的,本質(zhì)還是變量
  • const修飾的局部變量在棧上分配空間
  • const修飾的全局變量在只讀存儲區(qū)分配空間
  • const只在編譯期有用,在運行期無效
  • const不能定義真正意義上的常量

const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現(xiàn)在賦值符號的左邊。const局部變量是在棧上分配空間强品,可以通過指針改變這個空間里面的值。過了編譯期屈糊,const變量的常量特性的榛,只讀特性就沒有了,只讀特性只在編譯期有效逻锐,運行期根本無效夫晌。const修飾的全局變量在只讀存儲區(qū)分配空間雕薪,因此如果用指針去修改了const修飾的全局變量,程序就會崩潰晓淀,因為修改了程序只讀存儲區(qū)中內(nèi)容所袁,大部分程序都會發(fā)生崩潰。

2凶掰、C++中的const

C++在C的基礎(chǔ)上對const進行了進化處理燥爷,具體表現(xiàn)在:

  • const聲明時,在符號表中放入常量

  • 編譯過程中發(fā)現(xiàn)常量直接以符號表中的值替換(常量折疊)

  • 編譯過程中也可能為對應(yīng)的常量分配存儲空間:

    • const用在全局或者使用了static關(guān)鍵字說明锄俄,存放在只讀數(shù)據(jù)區(qū)

      extern const int i = 10;
      static const int i = 10;
      
      // 或者修飾全局變量
      const int a =10;
      int main()
      {}
      
    • 局部變量中對const常量使用了&操作符局劲,在棧區(qū)分配空間

注意:C++編譯器雖然可能為const常量分配空間勺拣,但不會使用其存儲空間中的值

符號表是編譯過程中產(chǎn)生的一種數(shù)據(jù)結(jié)構(gòu)

#include <iostream>
#include <string>
using namespace std;

const int i = 10;         // 如果通過指針去改變i奶赠,就會出現(xiàn)段錯誤:嘗試修改只讀數(shù)據(jù)區(qū)數(shù)據(jù)
int main()
{
    const int a = 5;
    int *p = (int *)&a; // &a, 給a標識符分配空間了药有,并用p指向了該空間毅戈,
                           // 可以通過*p訪問這個地址,但是不能通過a來訪問
    *p = 10;               // 不能通過指針去改變a的值
    cout << a << endl;
    cout << *p << endl;
    
    return 0;
}

3愤惰、 與宏定義對比

C++ 中的const常量類似于宏定義

const int c = 5;
// 類似于
#define c 5

但是cosnt與宏定義的區(qū)別在于:

  • const常量是有編譯器處理
  • 編譯器對cosnt常量進行類型檢查和作用域檢查
  • 宏定義由預(yù)處理器處理苇经,只是進行單純的文本替換
#include <stdio.h>

void f()
{
    #define a 3
    const int b = 4;
}

void g()
{
    printf("a = %d\n", a);
    // 在g函數(shù)中訪問f函數(shù)中的宏定義,完全沒有問題
    // 在預(yù)處理的時候就進行了宏替換宦言,對編譯器來說扇单,就是printf("a = %d\n", 3);
    // 宏是沒有作用域的概念
    
    // const 定義的常量,被編譯器處理奠旺,是有作用域的蜘澜,不能訪問b
    printf("b = %d\n", b);
}

int main()
{
    const int A = 1;
    const int B = 2;
    int array[A + B] = {0}; 
    /* C編譯
    const修飾得到的只是具有只讀特性的變量,數(shù)組的大小是由兩個變量的大小決定的响疚,
    兩個變量相加的結(jié)果需要在運行的時候才能直到鄙信,因此編譯器編譯的時候不知道這個數(shù)組長度,直接報錯
    */
    
    /* C++編譯
    const是定義的真正意義上的常量忿晕,直接從符號表中取值装诡,編譯的時候就知道A和B的值,
    可以得到數(shù)組的長度践盼,不會報錯
    */
    int i = 0;
    
    for(i=0; i<(A + B); i++)
    {
        printf("array[%d] = %d\n", i, array[i]);
    }
    
    f();
    g();
    
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸦采,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咕幻,更是在濱河造成了極大的恐慌渔伯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅河,死亡現(xiàn)場離奇詭異咱旱,居然都是意外死亡确丢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門吐限,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲜侥,“玉大人,你說我怎么就攤上這事诸典∶韬” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵狐粱,是天一觀的道長舀寓。 經(jīng)常有香客問我,道長肌蜻,這世上最難降的妖魔是什么互墓? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮蒋搜,結(jié)果婚禮上篡撵,老公的妹妹穿的比我還像新娘。我一直安慰自己豆挽,他們只是感情好育谬,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帮哈,像睡著了一般膛檀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娘侍,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天咖刃,我揣著相機與錄音,去河邊找鬼私蕾。 笑死僵缺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踩叭。 我是一名探鬼主播磕潮,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼容贝!你這毒婦竟也來了自脯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斤富,失蹤者是張志新(化名)和其女友劉穎膏潮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體满力,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡焕参,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年轻纪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠纷。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡刻帚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涩嚣,到底是詐尸還是另有隱情崇众,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布航厚,位于F島的核電站顷歌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幔睬。R本人自食惡果不足惜眯漩,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溪窒。 院中可真熱鬧坤塞,春花似錦、人聲如沸澈蚌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宛瞄。三九已至,卻和暖如春交胚,著一層夾襖步出監(jiān)牢的瞬間份汗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工蝴簇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杯活,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓熬词,卻偏偏與公主長得像旁钧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子互拾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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