在C和C 裡const的用法異同總結

2021-06-23 07:15:18 字數 1687 閱讀 5213

c中const的用法總結起來主要分為以下兩種:

1, 在定義變數時使用(由於const常量在定義後不能被修改,所以在定義時一定要進行初始化操作):

a)  最簡單的用法,說明變數為乙個常變數(在以下例子裡,int 和const的先後順序可以改變的,這無所謂):

const int a=100; 

int const b=100;

b)  說明指標為指向常數的指標,即指標本身的值是可以改變的:

const int *a=&b;

c)  說明指標本身的值不可改變,但指向的內容可改變:

int * const a = &b;

d)  說明指標為指向常數的常指標,即指標本身與指標指向的內容都不可改變:

const int * const a = &b;

e)  說明引用為常數引用,即不能改變引用的值:

const int &a=100。

2,  在定義函式時使用:

a) 作為引數使用,說明函式體內是不能修改該引數的:

void func(const int a);

b) 作為返回值使用,說明函式的返回值是不能被修改的:

const int func();

c) 在函式中使用const,情況與定義變數的情況基本一致: 

c++中區別於c的const用法主要分為以下兩種

1, const類成員

const類成員在物件構造期間允許被初始化並且在以後不允許被改變。const類成員和一般的const 變數有所不同。const類成員是對應於每個物件而言,它在物件構造期間被初始化,在這個物件的生存週期中不允許被改變。

2, const 成員函式

const 成員函式不允許在此函式體內對此函式對應的類的所有成員變數進行修改,這樣可以提高程式的健壯性。const一般放在函式體後:

functiontype   fun()   const。 

3,const在c和c++中最大的不同是,在c中,const預設具有外部鏈結,而c++中則是內部鏈結。所以當你只在定義const常量的檔案中使用該常量時,c++不給你的const常量分配空間,此時const int c = 0;相當於#define c 0;而在c中,它會給每個const 常量分配記憶體空間。

4,請看下面乙個程式:

#include

int main()

在vc6.0中命名為.c檔案,編譯時,編譯器提示錯誤,int b[a]這行:expected constant expression

命名為.cpp檔案,則沒問題。

這個問題跟編譯器無關,code::blocks之所以編譯能通過,其實是因為gcc預設是啟用編譯器擴充套件的,把工程的build option中的"in c mode ,supper all iso c90 programs.........."和"treat as errors the warnings demonded by strict iso ......"兩項選上,去掉所有的gcc擴充套件,實行嚴格的c90標準,就不能通過編譯了。 

這個問題其實跟const是所謂「唯讀」還是「常量」也無關,const在c/c++語法中的確切意義,依然是乙個不能通過被它修飾的識別符號直接改變的變數。

問題的真正原因是:在c中,常量表示式必須是編譯期常量,a不是編譯期常量(是執行期常量),無論c90還是c99都如此,但c++沒有了這個規定,對此不作限制。正因為const int i在c中不是常量表示式,因此不能用於定義陣列。

const在c和c 中的用法

下面只是針對於基本型別 對於標準c來說 const修飾的變數是唯讀變數,會分配記憶體空間。但是不能作為左值直接改變。可以通過指標來改變 對於現代c編譯器來說 會做一些優化,會進入符號表。如果有對記憶體的操作出現,那麼它就不會去符號表取值,而是去記憶體中取值。這個和c 進入符號表有些不同。對於c 來說...

const在c和c 中的用法

c中const的用法總結起來主要分為以下兩種 1 在定義變數時使用 由於const常量在定義後不能被修改,所以在定義時一定要進行初始化操作 a 最簡單的用法,說明變數為乙個常變數 在以下例子裡,int 和const的先後順序可以改變的,這無所謂 const int a 100 int const b...

const在c中的用法

常量和變數的樣子完全一樣,只是常量的值不允許被修改。我們用const這個關鍵字來宣告乙個常量。例 const int a 10 int const a 10 兩種方式都可以宣告乙個常量效果是一樣的。我們也可以用const來修飾指標 const與識別符號 例 define num 20 const i...