const分別在C和C 語言裡的含義和實現機制

2021-07-31 16:37:26 字數 4004 閱讀 7617

簡單地說:const在c語言中表示唯讀的變數,而在c++語言中表示常量.

c語言const是constant的縮寫,是恆定不變的意思,也翻譯為常量,但是很多人都認為被const修飾的值都是常量,其實這是不精確的.因為,精確來說應該是唯讀的變數,其值在編譯的時候不能被使用,因為編譯器在編譯的時候不知道其儲存的內容.或許當初這個關鍵字應該被替換為readonly.

c語言中const定義的變數只是給出了對應的記憶體位址,而不是像#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行過程中只有乙個備份(因為它是全域性的唯讀變數,存放在靜態區),而#define定義的巨集變數在記憶體中有若干個備份.

c++語言:

const是c++中常用的型別修飾符,常型別是指使用型別修飾符const說明的型別,常型別的變數或物件的值是不能被更新的.

c++引入const的初始目的是為了取代預編譯指令,消除他的缺點,同時繼承它的優點.<缺點:只是簡單值和**的替代,缺乏型別的檢測機制,安全性不好;優點有三:1.避免意義模糊的數字出現,清晰程式語義2.方便引數的調整和修改,3.提高程式執行效率,因為不需要為常量分配空間》

問題出來了:為什麼const能取代預定義語句?

1.   首先,以const修飾的變數和物件具有不可變性,這是它能取代預定義語句的基礎.

2.   第二,很明顯,它同樣能避免意義模糊的數字定義,也可以方便地進行引數的調整與修改.

3.   第三,c++編譯器通常不為普通const常量(普通是指內建型別,不包括結構體等型別)分配儲存空間,只是把它們儲存在符號表中(注意:c語言中則會為const變數分配儲存空間),這使得它們成為了編譯期間的常量,沒有了儲存和讀記憶體的操作,使得它的效率非常高,同時,也是它能取代預定義語句的重要基礎.

4.   最後,const定義也能像普通的變數定義一樣,它會由編譯器對它進行型別的安全檢查,消除了預定義語句帶來的安全隱患.

我們使用一張表來總結const的作用:

no.

作用

說明

參考**

1可以定義const常量

const int max = 100; 

2便於進行型別檢查

const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤

void f(const int i)

//對傳入的引數進行型別檢查,不匹配進行提示 3

可以保護被修飾的東西

防止意外的修改,增強程式的健壯性。

void f(const int i)

//如果在函式體內修改了i,編譯器就會報錯

4可以很方便地進行引數的調整和修改

同巨集定義一樣,可以做到不變則已,一變都變

5為函式過載提供了乙個參考

class a

//乙個函式

void f(int i) const  //

上乙個函式的過載

......};6

可以節省空間,避免不必要的記憶體分配

const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的常量在程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有若干個拷貝

#define pi 3.14159         //

常量巨集const doulbe  pi=3.14159;  //

此時並未將pi放入rom中

......

double i=pi;   //

此時為pi分配記憶體,以後不再分配!

double i=pi;  //

編譯期間進行巨集替換,分配記憶體

double j=pi;  //

沒有記憶體分配

double j=pi;  //

再進行巨集替換,又一次分配記憶體! 7

提高了效率

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高

const的實現機制

const

究竟是如何實現的呢?

對於宣告為

const

的內建型別,例如

int,

short

,long

等等,編譯器會如何實現

const

的本意?那麼對於非內建型別是否也是與內建資料型別一樣處理呢,例如對於結構體型別則會怎樣處理呢?下面通過幾個小例子來說明這些問題:

c

語言const

示例

const int i=10;

int *p=(int *)(&i);

*p=20;

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

猜一猜輸出結果是什麼?

i=20 *p=20

c++語言

const示例1

: const int i=10;

int *p=const_cast(&i);

*p=20;

cout<<"i="<

輸出結果是

i=10 *p=20

c++語言

const示例2

: struct test

};int main(int argc, char* argv)

輸出結果是

j=40 *q=40

示例結果分析

看到上面三組輸出結果,我們可以分析兩個問題:

問題

1:c語言和

c++語言中的

const

究竟表示什麼

?

問題

2:const

的實現機制究竟是怎樣的

?問題1

,對於const int

型別的變數i,

c語言中通過指標

p修改了值後,

i變成了

20;而在

c++中,通過指標

p修改了值後,

i仍然是10。

問題2,c++

語言中const struct test

的元素j

通過指標

q被改變了,為何

const int 

與const struct test

的反應機制不同?

針對問題

1,我們知道

c語言中

const

表示唯讀的變數,既然把

const

看成是變數,那麼其在記憶體中就會有儲存他的空間,並且可以通過指標間接的改變該記憶體空間的值,當通過指標

p改變該記憶體中的值後,再獲取

i的值的時候,會訪問該空間,得到的是被改變後的值。而

c++把

const

看做常量,編譯器會使用常數直接替換掉對

i的引用,例如

cout《會理解成

cout<<10; 

並不會去訪問

i的記憶體位址去取資料,這裡有點像是

c語言裡的巨集

#define i 10

。因此c++裡i

會輸出10

,而*p

會輸出20.

針對問題2,

c++語言中只是對於內建資料型別做常數替換,而對於像結構體這樣的非內建資料型別則不會。因為結構體型別不是內建資料型別,編譯器不知道如何直接替換,因此必須要訪問記憶體去取資料,而訪問記憶體去取資料必然會取到被指標

q改變後的值,因此會造成與

c++中

const int

型別完全不一樣的處理模式。

const分別在C和C 語言裡的含義和實現機制

const分別在c和c 語言裡的含義和實現機制 2013 07 02 09 14 31 收藏 const的含義 簡單地說 const在c語言中表示唯讀的變數,而在c 語言中表示常量.c語言const是constant的縮寫,是恆定不變的意思,也翻譯為常量,但是很多人都認為被const修飾的值都是常量...

const分別在C和C 語言裡的含義和實現機制

const的含義 簡單地說 const在c語言中表示唯讀的變數,而在c 語言中表示常量.c語言const是constant的縮寫,是恆定不變的意思,也翻譯為常量,但是很多人都認為被const修飾的值都是常量,其實這是不精確的.因為,精確來說應該是唯讀的變數,其值在編譯的時候不能被使用,因為編譯器在編...

? 分別在C 中得意思

表示判斷是否為空 比如我們常用得三元表示式 var a a?b c a如果為空則取b 否則取c 表示空合併運算子 用於定義可空型別和引用型別的預設值。如果此運算子的左運算元不為null,則此運算子將返回左運算元,否則返回右運算元。例如 a b 當a為null時則返回b,a不為null時則返回a本身。...