C C 語言中const的用法

2022-09-01 12:03:09 字數 2729 閱讀 8968

c++中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在**中. 所以在c++中const修飾的量可以用在陣列的定義中。

而在c中,const是乙個不能被改變的普通變數

,既然是變數,就要占用儲存空間,所以編譯器不知道編譯時的值.而且,陣列定義時的下標必須為常量.

在c語言中: const int size; 這個語句是正確的,因為它被c編譯器看作乙個宣告,指明在別的地方分配儲存空間。

但在c++中這樣寫是不正確的.

c++中const預設是內部連線,如果想在c++中達到以上的效果,必須要用extern關鍵字。 c++中,const預設使用內部連線;而c中使用外部連線.

內連線:

編譯器只對正被編譯的檔案建立儲存空間,別的檔案可以使用相同的表示符或全域性變數.c/c++中內連線使用static關鍵字指定.

外連線:

所有被編譯過的檔案建立一片單獨儲存空間.一旦空間被建立,聯結器必須解決對這片儲存空間的引用.全域性變數和函式使用外部連線.通過extern關鍵字宣告,可以從其他檔案訪問相應的變數和函式. c++中,是否為const分配空間要看具體情況. 如果加上關鍵字extern或者取const變數位址,則編譯器就要為const分配儲存空間.

c++中定義常量的時候不再採用define,因為define只做簡單的巨集替換,並不提供型別檢查.

在c語言中const指標表示該指標是乙個常量,一旦進行初始化完成之後就無法改變它指向的位置。指向const的指標說明使用這個指標無法改變其指向的位址處的值,特別強調的一點是使用這個指標不能夠改變。言外之意就是說,可以通過其他的方式改變。

比如:char ch='c';

const char *ptr=&ch;

*ptr='a';//這樣做是不允許的

ch='a';//這樣做完全可以,並且*ptr的值也是'a'

下面是從網上摘抄的對const不錯的總結

const最常用的就是定義常量,除此之外,它還可以修飾函式的引數、返回值和函式的定義體。

如果引數作輸出用,不論它是什麼資料型別,也不論它採用「指標傳遞」還是「引用傳遞」,都不能加const 修飾,否則該引數將失去輸出功能。

const 只能修飾輸入引數:

如果輸入引數採用「指標傳遞」,那麼加const 修飾可以防止意外地改動該指標,起到保護作用。

將「const &」修飾輸入引數的用法總結如下:

(1)對於非內部資料型別的輸入引數,應該將「值傳遞」的方式改為「const 引用傳遞」,目的是提高效率。例如將void func(a a) 改為void func(const a &a)。

(2)對於內部資料型別的輸入引數,不要將「值傳遞」的方式改為「const 引用傳遞」。否則既達不到提高效率的目的,又降低了函式的可理解性。例如void func(int x) 不應該改為void func(const int &x)。

如果給以「指標傳遞」方式的函式返回值加const 修飾,那麼函式返回值(即指標)的內容不能被修改,該返回值只能被賦給加const 修飾的同型別指標。例如函式

const char * getstring(void);

如下語句將出現編譯錯誤:

char *str = getstring();

正確的用法是

const char *str = getstring();

如果返回值不是內部資料型別,將函式a geta(void) 改寫為const a & geta(void)的確能提高效率。但此時千萬千萬要小心,一定要搞清楚函式究竟是想返回乙個物件的「拷貝」還是僅返回「別名」就可以了,否則程式會出錯。

函式返回值採用「引用傳遞」的場合並不多,這種方式一般只出現在類的賦值函式中,目的是為了實現鏈式表達。

例如:

classa;

a a, b, c;

//a, b, c 為a 的物件

a = b = c;//

正常的鏈式賦值

a = b)= c;//

不正常的鏈式賦值,但合法

如果將賦值函式的返回值加const 修飾,那麼該返回值的內容不允許被改動。上例中,語句 a = b = c 仍然正確,但是語句 (a = b) = c 則是非法的。

關於const函式的幾點規則:

a. const物件只能訪問const成員函式,而非const物件可以訪問任意的成員函式,包括const成員函式.

b. const物件的成員是不可修改的,然而const物件通過指標維護的物件卻是可以修改的.

c. const成員函式不可以修改物件的資料,不管物件是否具有const性質.它在編譯時,以是否修改成員資料為依據,進行檢查.

e. 然而加上mutable修飾符的資料成員,對於任何情況下通過任何手段都可修改,自然此時的const成員函式是可以修改它的

1、非靜態成員函式後面加const(加到非成員函式或靜態成員後面會產生編譯錯誤)

2、表示成員函式隱含傳入的this指標為const指標,決定了在該成員函式中,

任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指標的const引用);

3、唯一的例外是對於mutable修飾的成員。

加了const的成員函式可以被非const物件和const物件呼叫

但不加const的成員函式只能被非const物件呼叫

來自為知筆記(wiz)

C語言中const的用法

1 const的普通用法 const int n 10 意思很明顯,n是乙個唯讀變數,程式不可以直接修改其值。這裡還有乙個問題需要注意,即如下使用 int a n 在ansi c中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而n只是乙個變數。2 const用於指標 const int p int...

C語言中const的用法

關鍵字const用來定義常量,如果乙個變數被const修飾,那麼它的值就不能再被改變,我想一定有人有這樣的疑問,c語言中不是有 define嗎,幹嘛還要用const呢,我想事物的存在一定有它自己的道理,所以說const的存在一定有它的合理性,與預編譯指令相比,const修飾符有以下的優點 1 預編譯...

C語言中const的用法

const是c語言中的關鍵字,用來定義常變數。1 在使用const時有以下規則 const將變數變為唯讀。只有讀許可權,沒有寫許可權 資料型別對const無影響。如以下兩種定義無區別 int const a 10 不管const是在int前或後,都無影響。const int a 10 都對整形變數a...