教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

c++培訓(xùn)之C/C++中const的區(qū)別

更新時(shí)間:2016年08月01日09時(shí)27分 來(lái)源:傳智播客C/C++學(xué)科 瀏覽次數(shù):

C/C++中const的區(qū)別

今天來(lái)自傳智博客(fskzgqt.cn)的培訓(xùn)專家為大家分享在c/c++中關(guān)于const區(qū)別的總結(jié),如果能把本文章徹底理解,相信大家對(duì)const的認(rèn)識(shí)會(huì)上一個(gè)新的臺(tái)階。
Let’s  begin!!!!
c語(yǔ)言全局const會(huì)被存儲(chǔ)到只讀數(shù)據(jù)段。c++中全局const當(dāng)聲明extern或者對(duì)變量取地址時(shí),編譯器會(huì)分配存儲(chǔ)地址,變量存儲(chǔ)在只讀數(shù)據(jù)段。兩個(gè)都受到了只讀數(shù)據(jù)段的保護(hù),不可修改。
 
      const int constA = 10;
      int main(){
           int* p = (int*)&constA;
           *p = 200;
     }
以上代碼在c/c++中編譯通過(guò),在運(yùn)行期,修改constA的值時(shí),發(fā)生寫(xiě)入錯(cuò)誤。原因是修改只讀數(shù)據(jù)段的數(shù)據(jù)。
c語(yǔ)言中局部const存儲(chǔ)在堆棧區(qū),只是不能通過(guò)變量直接修改const只讀變量的值,但是可以跳過(guò)編譯器的檢查,通過(guò)指針間接修改const值。
const int constA = 10;
int* p = (int*)&constA;
*p = 300;
printf("constA:%d\n",constA);
printf("*p:%d\n", *p);
運(yùn)行結(jié)果:
 
c語(yǔ)言中,通過(guò)指針間接賦值修改了constA的值。
c++中對(duì)于局部的const變量要區(qū)別對(duì)待:
1.對(duì)于基礎(chǔ)數(shù)據(jù)類型,也就是const int a = 10這種,編譯器會(huì)把它放到符號(hào)表中,不分配內(nèi)存,當(dāng)對(duì)其取地址時(shí),會(huì)分配內(nèi)存。
const int constA = 10;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;
運(yùn)行結(jié)果:
 
constA在符號(hào)表中,當(dāng)我們對(duì)constA取地址,這個(gè)時(shí)候?yàn)閏onstA分配了新的空間,*p操作的是分配的空間,而constA是從符號(hào)表獲得的值。
1.對(duì)于基礎(chǔ)數(shù)據(jù)類型,如果用一個(gè)變量初始化const變量,如果const int a = b,那么也是會(huì)給a分配內(nèi)存。
int b = 10;
const int constA = b;
int* p = (int*)&constA;
*p = 300;
cout << "constA:" << constA << endl;
cout << "*p:" << *p << endl;
運(yùn)行結(jié)果:
 
constA 分配了內(nèi)存,所以我們可以修改constA內(nèi)存中的值。
1.對(duì)于自定數(shù)據(jù)類型,比如類對(duì)象,那么也會(huì)分配內(nèi)存。
    const Person person; //未初始化age
//person.age = 50; //不可修改
Person* pPerson = (Person*)&person;
//指針間接修改
pPerson->age = 100;
cout << "pPerson->age:" << pPerson->age << endl;
pPerson->age = 200;
cout << "pPerson->age:" << pPerson->age << endl;
運(yùn)行結(jié)果:
 
為person分配了內(nèi)存,所以我們可以通過(guò)指針的間接賦值修改person對(duì)象。
c中const默認(rèn)為外部連接,c++中const默認(rèn)為內(nèi)部連接.當(dāng)c語(yǔ)言兩個(gè)文件中都有const int a的時(shí)候,編譯器會(huì)報(bào)重定義的錯(cuò)誤。而在c++中,則不會(huì),因?yàn)閏++中的const默認(rèn)是內(nèi)部連接的。如果想讓c++中的const具有外部連接,必須顯示聲明為: extern const int a = 10;
const由c++采用,并加進(jìn)標(biāo)準(zhǔn)c中,盡管他們很不一樣。在c中,編譯器對(duì)待const如同對(duì)待變量一樣,只不過(guò)帶有一個(gè)特殊的標(biāo)記,意思是”你不能改變我”。在c++中定義const時(shí),編譯器為它創(chuàng)建空間,所以如果在兩個(gè)不同文件定義多個(gè)同名的const,鏈接器將發(fā)生鏈接錯(cuò)誤。簡(jiǎn)而言之,const在c++中用的更好。
好的今天的分享先到這里,老夫的分享只是剛剛開(kāi)始,如果大家對(duì)學(xué)習(xí)c/c++還有什么問(wèn)題可以關(guān)注我的個(gè)人微信xie4855787,也可以登陸傳智播客教育集團(tuán)官網(wǎng)fskzgqt.cn了解更多的學(xué)習(xí)技巧和免費(fèi)的教學(xué)視頻。
我們的目標(biāo)是讓大家開(kāi)心的學(xué)習(xí),高薪的就業(yè)。
青山不改,綠水長(zhǎng)流,老夫去也


 本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://fskzgqt.cn/c/ 
0 分享到:
和我們?cè)诰€交談!