進化後的const關鍵字

2021-08-15 16:53:34 字數 1450 閱讀 2026

const修飾的變數是唯讀的,本質還是變數。

const修飾的區域性變數在棧上分配空間const修飾的全域性變數在唯讀儲存區分配空間const只在編譯期有用,在執行期無用

a) const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。實際上可以用指標改變它的量。

b) 在一些編譯器中,會將const變數儲存在唯讀儲存區,那麼我們使用指標進行修改其值會造成程式的崩潰。

問題:那麼我們在c++編譯器下編譯與c編譯器相同的程式,會有什麼不同的現象嗎?

示例**:

#include 

int main()

輸出結果:

begin…

c = 0

*p = 5

end…

我們發現,在c++編譯中得到的結果是c=0,而在c編譯中得到的結果是c=5。也就是說c++中,使用指標修改const變數失敗了。

那麼,c++對const做了何種改變呢?

c++在c基礎上對const進行了進化處理

1. 當碰見const宣告時在符號表中放入常量

2. 編譯過程中若發現使用常量則直接以符號表中的值替換

符號表:符號表實際上就是編譯器編譯的過程中產生的表。(實際上就是乙個資料結構)在符號表中,源**中的每個識別符號(變數名、常量名等)都和它的宣告或使用資訊繫結在一起,比如資料型別、作用域以及記憶體位址。

3. 編譯器過程中若發現下述情況則給對應的常量分配儲存空間對const常量使用了extern

對const常量使用&操作符

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

4. c++中的const常量類似於巨集定義,但又與巨集定義不同

const常量是由編譯器處理(巨集定義是預編譯器處理的),編譯器對const常量進行型別檢查和作用域檢查(巨集定義沒有型別和作用域的概念),巨集定義由預處理器處理,單純的文字替換。(例如把a換成3 ↓)

5. 與c語言不同,c++中的const不是唯讀變數,而是乙個真正意義上的常量

儘管c++編譯器可能會為const常量分配空間,但並不會使用儲存空間的值,這樣其實是為了相容c語言中const常量的語法特性。

const關鍵字用法

1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...

關鍵字const詳解

關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...

const關鍵字用法

const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...