const的用法總結

2021-07-23 02:45:52 字數 3416 閱讀 2367

1. const的主要用法:

(1)定義常量

(2)修飾函式的引數

(3)修飾函式的返回值

(4)修飾函式的定義體

(5)const替代巨集(#define)

2. 用const 修飾函式的引數

(1)const 只能修飾輸入引數

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

例如:void stringcopy(char *strdestination, const char *strsource);

(2)如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const 修飾。

例如:不要將函式void func1(int x) 寫成void func1(const int x)。

(3)對於非內部資料型別的輸入引數,應該

將「值傳遞」的方式改為「const 引用傳遞」,目的是提高效率。

例如:將void func(a a) 改為void func(const a &a)。

因為函式體內將產生a 型別的臨時物件用於複製引數a,而臨時物件的構造、複製、析構過程都將消耗時間;「引用傳遞」僅借用一下引數的別名而已,不需要產生臨時物件。

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

例如:void func(int x) 不應該改為void func(const int &x)。

因為內部資料型別的引數不存在構造、析構的過程,而複製也非常快,「值傳遞」和「引用傳遞」的效率幾乎相當。

3. 用const 修飾函式的返回值

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

例如:函式const char * getstring(void);

正確的用法是: const char *str = getstring();  //寫為char *str = getstring();

將出現編譯錯誤

(2)如果函式返回值採用「值傳遞」方式,由於函式會把返回值複製到外部臨時的儲存單元中,加const 修飾沒有任何價值。

例如:不要把函式int getint(void) 寫成const int getint(void)。

(3)函式返回值採用「引用傳遞」的場合並不多,這種方式一般只出現在類的賦值函式

4.const 成員函式

任何不會修改資料成員的函式都應該宣告為const 型別。如果在編寫const 成員函式時,不慎修改了資料成員,或者呼叫了其它非const 成員函式

編譯器將指出錯誤,這無疑會提高程式的健壯性。例如:

[cpp]view plain

copy

class

stack  

;  int

stack::getcount(

void

) const  

在const成員宣告中,const 關鍵字只能放在函式宣告的尾部,大概是因為其它地方都有特定含義。

5.const 替代巨集

const 替代巨集可以消除巨集的不安全性,巨集是原原本本的替換,有時候忘了細節問題,替換舉例:

//巨集寫法

#define win_width 800

#define win_height 600

#define window_name "我的程式"

//const 寫法

const int win_width = 800;

const int win_height = 600;

const char* window_name = "我的程式";

區別:

(1) 編譯器處理方式不同

define巨集是在預處理階段展開。

const常量是編譯執行階段使用。

(2) 型別和安全檢查不同

define巨集沒有型別,不做任何型別檢查,僅僅是展開。

const常量有具體的型別,在編譯階段會執行型別檢查。

(3) 儲存方式不同

define巨集僅僅是展開,有多少地方使用,就展開多少次,不會分配記憶體。

const常量會在記憶體中分配(可以是堆中也可以是棧中)。

(4)const  可以節省空間,避免不必要的記憶體分配。 例如: 

#define pi 3.14159 //常量巨集 

const doulbe pi=3.14159; //此時並未將pi放入rom中 ...... 

double i=pi; //此時為pi分配記憶體,以後不再分配! 

double i=pi; //編譯期間進行巨集替換,分配記憶體 

double j=pi; //沒有記憶體分配 

double j=pi; //再進行巨集替換,又一次分配記憶體! 

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

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

(6)有些整合化除錯工具

可以對const進行除錯,但是不能對巨集進行除錯。

總結:const關鍵字是用於約束程式設計師和編譯器的行為的,而不是程式設計師用以保證程式正確性的良藥,除了全域性常量外,沒有任何機制保證了const宣告的常量的不可修改性,要想使得程式中定義的常量不被修改,就只能循規蹈矩的使用它。

總結const的用法

1.const的用法 1 定義常量 2 修飾函式的引數 3 修飾函式的返回值 4 修飾函式的定義體 2.用const 修飾函式的引數 1 const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const 修飾可以防止意外地改動該指標。例如 void stringcopy char strd...

總結const的用法

const的用法 1 定義常量 2 修飾函式的引數 3 修飾函式的返回值 4 修飾函式的定義體 用const 修飾函式的引數 1 const 只能修飾輸入引數 如果輸入引數採用 指標傳遞 那麼加const 修飾可以防止意外地改動該指標。例如 void stringcopy char strdesti...

const用法總結

1.const 一 對於基本宣告 const int r 100 標準const變數宣告加初始化,編譯器經過型別檢查後直接用100在 編譯時替換 二 對於指標 1.int x 10 const int r x 指標 指向的內容是常量 r指向的內容不能夠通過r改變,但如果指向的內容是非const 例如...