1、C中的const
1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值),測驗代碼如下:
運行結果:
2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾)
運行結果:
由于分檔案撰寫,不好呈現,所以在這里不為大家提供c語言全域const變數默認為外部聯編的案例,如果各讀者有興趣,可自行嘗試,具體步驟如下,可新建一個源檔案,并且提供a變數的宣告,如:extern const int a,
2、C++中的const
1、普通區域const變數
對于基本型別,以符號表中的資料進行初始化的普通區域const變數,此時不會分配記憶體,將其放入符號表中,如果對它取地址,則會開辟一個新的空間,也就是說會創建一個臨時變數,如果通過地址間接進行修改值不會影響到其本身,測驗代碼如下:
運行結果:
在這里解釋一下上述代碼:第二行代碼,使用了const(expression),顯示轉換,這是由于c++比c型別轉換更嚴格,所以需要將 const int * 轉換為 int * 才能夠進行賦值,并且第二行代碼將被隱式轉換為如下代碼:
int temp=a;
int *ptr=&temp;
//所以對指標 ptr 指向的記憶體空間進行操作,并不會影響到 a,
對于基本型別,用變數初始化的普通區域const變數,此時會在堆疊區開辟記憶體,可以通過地址間接修改值,測驗代碼如下:
運行結果:
(3)對于自定義型別,都會分配記憶體,可以通過地址間接修改值
運行結果:
2、普通全域const變數
與區域const變數基本相同,只是記憶體開辟在全域/堆區,對于c++而言,全域const變數默認為內部聯編,可以在定義時加extern關鍵字宣告為外部聯編, 由于分檔案撰寫不好展示,請讀者自行嘗試,
3、const 成員變數/成員函式
const成員變數只能被const成員函式訪問
const成員函式,能夠訪問所有成員變數,但是在函式體內不能直接修改變數的值(包括普通成員變數),如果需要在函式體內修改普通成員變數的值,需要在變數定義的前面添加mutable關鍵字,或者通過地址間接修改,注意:const成員函式只能被該類的const物件訪問,測驗代碼如下:
運行結果:
3、C/C++中const異同總結
c語言全域const會被存盤到只讀資料段,c++中全域const當宣告extern或者對變數取地址時,編譯器會分配存盤地址,變數存盤在只讀資料段,兩個都受到了只讀資料段的保護,不可修改,
c語言中區域const存盤在堆疊區,只是不能通過變數直接修改const只讀變數的值,但是可以跳過編譯器的檢查,通過指標間接修改const值,
c++中對于區域的const變數要區別對待:
(1)對于基礎資料型別,也就是const int a = 10這種,編譯器會把它放到符號表中,不分配記憶體,當對其取地址時,會分配記憶體,
a在符號表中,當我們對a取地址,這個時候為a分配了新的空間,*p操作的是分配的空間,而a是從符號表獲得的值,
(2)對于基礎資料型別,如果用一個變數初始化const變數,如果const int a = b,那么也是會給a分配記憶體,
(3)對于自定資料型別,比如類物件,也會分配記憶體,
c中const默認為外部連接,c++中const默認為內部連接.當c語言兩個檔案中都有const int a的時候,編譯器會報重定義的錯誤,而在c++中,則不會,因為c++中的const默認是內部連接的,如果想讓c++中的const具有外部連接,必須顯示宣告為: extern const int a = 10;
希望對你有幫助!
自學C/C++編程難度很大,如果你想更快提升自己的編程能力和撰寫專案的水平,歡迎一起共同成長!
C語言C++編程學習交流圈子,QQ群【757874045】微信公眾號:C語言編程學習基地
有一些原始碼和資料分享,歡迎轉行也學習編程的伙伴,和大家一起交流成長會比自己琢磨更快哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252.html
標籤:C++
上一篇:統計區間素數數量