首頁技術(shù)文章正文

C/C++培訓(xùn)專家:C/C++中const的區(qū)別

更新時間:2017-11-21 來源:黑馬程序員 瀏覽量:

今天來自黑馬程序員(m.pantone-color.com.cn)的培訓(xùn)專家為大家分享在c/c++中關(guān)于const區(qū)別的總結(jié),如果能把本文章徹底理解,相信大家對const的認識會上一個新的臺階。

Let’s begin!!!!

c語言全局const會被存儲到只讀數(shù)據(jù)段。c++中全局const當聲明extern或者對變量取地址時,編譯器會分配存儲地址,變量存儲在只讀數(shù)據(jù)段。兩個都受到了只讀數(shù)據(jù)段的保護,不可修改。

const int constA = 10;

int main(){

int* p = (int*)&constA;

*p = 200;

}

以上代碼在c/c++中編譯通過,在運行期,修改constA的值時,發(fā)生寫入錯誤。原因是修改只讀數(shù)據(jù)段的數(shù)據(jù)。

c語言中局部const存儲在堆棧區(qū),只是不能通過變量直接修改const只讀變量的值,但是可以跳過編譯器的檢查,通過指針間接修改const值。

const int constA = 10;

int* p = (int*)&constA;

*p = 300;

printf("constA:%d\n",constA);

printf("*p:%d\n", *p);

運行結(jié)果:

C/C++自學(xué)教程

c語言中,通過指針間接賦值修改了constA的值。

c++中對于局部的const變量要區(qū)別對待:

1.對于基礎(chǔ)數(shù)據(jù)類型,也就是const int a = 10這種,編譯器會把它放到符號表中,不分配內(nèi)存,當對其取地址時,會分配內(nèi)存。

const int constA = 10;

int* p = (int*)&constA;

*p = 300;

cout << "constA:" << constA << endl;

cout << "*p:" << *p << endl;

運行結(jié)果:

C/C++自學(xué)教程

constA在符號表中,當我們對constA取地址,這個時候為constA分配了新的空間,*p操作的是分配的空間,而constA是從符號表獲得的值。

1.對于基礎(chǔ)數(shù)據(jù)類型,如果用一個變量初始化const變量,如果const int a = b,那么也是會給a分配內(nèi)存。

int b = 10;

const int constA = b;

int* p = (int*)&constA;

*p = 300;

cout << "constA:" << constA << endl;

cout << "*p:" << *p << endl;

運行結(jié)果:

C/C++自學(xué)教程

constA 分配了內(nèi)存,所以我們可以修改constA內(nèi)存中的值。

1.對于自定數(shù)據(jù)類型,比如類對象,那么也會分配內(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;

運行結(jié)果:

C/C++自學(xué)教程

為person分配了內(nèi)存,所以我們可以通過指針的間接賦值修改person對象。

c中const默認為外部連接,c++中const默認為內(nèi)部連接.當c語言兩個文件中都有const int a的時候,編譯器會報重定義的錯誤。而在c++中,則不會,因為c++中的const默認是內(nèi)部連接的。如果想讓c++中的const具有外部連接,必須顯示聲明為: extern const int a = 10;

const由c++采用,并加進標準c中,盡管他們很不一樣。在c中,編譯器對待const如同對待變量一樣,只不過帶有一個特殊的標記,意思是”你不能改變我”。在c++中定義const時,編譯器為它創(chuàng)建空間,所以如果在兩個不同文件定義多個同名的const,鏈接器將發(fā)生鏈接錯誤。簡而言之,const在c++中用的更好。


本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓(xùn)學(xué)院


首發(fā): http://c.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!