C/C++編程筆記:C++中的 const 變量詳解,教你正確認識const用法

1、C中的const
1、局部const變量存放在堆棧區(qū)中,會分配內(nèi)存(也就是說可以通過地址間接修改變量的值)。測試代碼如下:

運行結(jié)果:

2、全局const變量存放在只讀數(shù)據(jù)段(不能通過地址修改,會發(fā)生寫入錯誤), 默認為外部聯(lián)編,可以給其他源文件使用(需要用extern關(guān)鍵字修飾)

運行結(jié)果:

由于分文件編寫,不好呈現(xiàn),所以在這里不為大家提供c語言全局const變量默認為外部聯(lián)編的案例。如果各讀者有興趣,可自行嘗試。具體步驟如下,可新建一個源文件,并且提供a變量的聲明,如:extern const int a。
2、C++中的const
1、普通局部const變量
對于基本類型,以符號表中的數(shù)據(jù)進行初始化的普通局部const變量,此時不會分配內(nèi)存,將其放入符號表中,如果對它取地址,則會開辟一個新的空間,也就是說會創(chuàng)建一個臨時變量,如果通過地址間接進行修改值不會影響到其本身。測試代碼如下:

運行結(jié)果:

在這里解釋一下上述代碼:第二行代碼,使用了const(expression),顯示轉(zhuǎn)換,這是由于c++比c類型轉(zhuǎn)換更嚴格。所以需要將 const int * 轉(zhuǎn)換為 int * 才能夠進行賦值,并且第二行代碼將被隱式轉(zhuǎn)換為如下代碼:
????????int temp=a;
????????int *ptr=&temp;
//所以對指針 ptr 指向的內(nèi)存空間進行操作,并不會影響到 a。
對于基本類型,用變量初始化的普通局部const變量,此時會在堆棧區(qū)開辟內(nèi)存,可以通過地址間接修改值。測試代碼如下:

運行結(jié)果:

(3)對于自定義類型,都會分配內(nèi)存,可以通過地址間接修改值

運行結(jié)果:

2、普通全局const變量
與局部const變量基本相同,只是內(nèi)存開辟在全局/堆區(qū),對于c++而言,全局const變量默認為內(nèi)部聯(lián)編,可以在定義時加extern關(guān)鍵字聲明為外部聯(lián)編。 由于分文件編寫不好展示,請讀者自行嘗試。
3、const 成員變量/成員函數(shù)
const成員變量只能被const成員函數(shù)訪問
const成員函數(shù),能夠訪問所有成員變量,但是在函數(shù)體內(nèi)不能直接修改變量的值(包括普通成員變量),如果需要在函數(shù)體內(nèi)修改普通成員變量的值,需要在變量定義的前面添加mutable關(guān)鍵字,或者通過地址間接修改。注意:const成員函數(shù)只能被該類的const對象訪問。測試代碼如下:

運行結(jié)果:

3、C/C++中const異同總結(jié)
c語言全局const會被存儲到只讀數(shù)據(jù)段。c++中全局const當聲明extern或者對變量取地址時,編譯器會分配存儲地址,變量存儲在只讀數(shù)據(jù)段。兩個都受到了只讀數(shù)據(jù)段的保護,不可修改。
c語言中局部const存儲在堆棧區(qū),只是不能通過變量直接修改const只讀變量的值,但是可以跳過編譯器的檢查,通過指針間接修改const值。
c++中對于局部的const變量要區(qū)別對待:
(1)對于基礎(chǔ)數(shù)據(jù)類型,也就是const int a =? 10這種,編譯器會把它放到符號表中,不分配內(nèi)存,當對其取地址時,會分配內(nèi)存。
a在符號表中,當我們對a取地址,這個時候為a分配了新的空間,*p操作的是分配的空間,而a是從符號表獲得的值。
(2)對于基礎(chǔ)數(shù)據(jù)類型,如果用一個變量初始化const變量,如果const int a = b,那么也是會給a分配內(nèi)存。
(3)對于自定數(shù)據(jù)類型,比如類對象,也會分配內(nèi)存。
c中const默認為外部連接,c++中const默認為內(nèi)部連接.當c語言兩個文件中都有const int a的時候,編譯器會報重定義的錯誤。而在c++中,則不會,因為c++中的const默認是內(nèi)部連接的。如果想讓c++中的const具有外部連接,必須顯示聲明為: extern const int a = 10;
希望對你有幫助!
自學C/C++編程難度很大,如果你想更快提升自己的編程能力和編寫項目的水平,歡迎一起共同成長!

學習C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學習C/C++編程的視頻教程,有興趣或者正在學習的小伙伴一定要去看一看哦!會對你有幫助的~