C 知識點之const關鍵字

2021-08-07 13:28:17 字數 1857 閱讀 9604

用於定義常量變數,這樣這個變數在後面就不可以再被修改:

const

int ivalue = 10;

ivalue = 20; //編譯報錯,ivalue不可被修改

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

例如:void stringcopy(char *strdestination, const char *strsource);如果輸入引數採用「值傳遞」,由於函式將自動產生臨時變數用於複製該引數,該輸入引數本來就無需保護,所以不要加const修飾。除非是想將該入參當作常量使用。

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

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

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

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

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

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

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

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

正確的用法是: const char *str = getstring(); //寫為char *str = getstring();將出現編譯錯誤

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

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

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

const 關鍵字放在函式宣告的尾部。

例如:void func(const int* pint) const {}

任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改了資料成員,或者呼叫了其它非const 成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性。

const

int i = 10;

//int *p = (int*)(&i); //c語言版本

int *p=const_cast

(&i); //c++版本

*p = 20;

c語言中const表示唯讀的變數,既然把const看成是變數,那麼其在記憶體中就會有儲存他的空間,並且可以通過指標間接的改變該記憶體空間的值,當通過指標p改變該記憶體中的值後,再獲取i的值的時候,會訪問該空間,得到的是被改變後的值。

c++把const看做常量,編譯器會使用常數直接替換掉對i的引用,例如cout

關鍵字知識點總結

一 關鍵字 1 static 全域性靜態變數 在全域性變數前加上關鍵字static,全域性變數就定義成乙個全域性靜態變數.儲存位置 靜態儲存區,在整個程式執行期間一直存在。初始化 未經初始化的全域性靜態變數會被自動初始化為0 作用域 全域性靜態變數在宣告他的檔案之外是不可見的,準確地說是從定義之處開...

C 之const關鍵字

函式與const 類與const 使用const關鍵字修飾的常量是唯讀的,在程式執行時不能更改。const關鍵字可以用在型別名前,也可以用在型別說明符後。常量 const double rate 0.069 const在型別名之前 const int amount 10 string const n...

C 關鍵字之const

我只要一聽到被面試者說 const意味著常數 不是常數,可以是變數,只是你不能修改它 我就知道我正在和乙個業餘者打交道。去年dan saks已經在他的文章裡完全概括了const的所有用法,因此esp 譯者 embedded systems programming 的每一位讀者應該非常熟悉const能...