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 例如...