C++ Const的作用總結
面試或者工作中,我們經常遇到const修飾符定義的變量,函數和對象等。那么const的作用具體是什么,有哪些。今天自己好好的總結了一下,記錄下來方便自己以后時間久了不記得,可以回頭看一下。
在C中,我們都是習慣用#define來定義常量,C++中提供了const修飾符來定義常量,這種方式更靈活,更安全。主要表現在define常量是沒有類型定義的,const常量是類型化的,它有地址,可以用指針指向這個值,但是不能修改它。
Const的使用
- 和指針一起使用
Const可以和指針一起使用,它們的組合情況比較復雜,可歸納為三種:指向常量的指針,常指針和指向常量的常指針。
(1) 指向常量的指針是指一個指向常量的指針變量,例如:
const char* info = “name”; // 聲明指向常量的指針
這條語句的含義是:聲明一個名為info的指針變量,它指向一個字符型的常量,初始化為info指向字符串“name”。
所以下面的一句是錯誤的:info [3] = ‘b’;
因為這里指針所指的數據(name)是常量,不能通過解引用來修改該數據。
然后下面這句話是允許的:info = “sex”;
因為指針本身是變量,可以指向其他的內存單元。
(2) 常指針是指把指針本身,而不是它指向的對象聲明為常量,例如:
char * const info = “name”; // 常指針
這條語句的含義是:聲明一個名為info的指針變量,它指向一個字符型數據的常指針,初始化為“name”的地址。常指針就是創建一個不能移動的固定指針(地址不能改變),但是它所指的數據是可以改變的。
所以下面的一句是錯誤的:info = “sex”;
因為指針本身是常量,不能指向其他的內存單元。
然后下面這句話是允許的:info [3] = ‘b’;
因為指針所指向的數據是可以通過解引用來修改的。
(3) 指向常量的常指針是指這個指針本身不能改變,它所指向的值也不能改變,聲明一個指向常量的常指針,二者都要聲明為const,例如:
const char * const info = “name”;
這里就是上面兩種的結合了,info = “sex”和info [3] = ‘b’都是錯誤的。
其他說明:
a. 常量一旦建立,在程序的任何地方都不能在修改。
b. 與#define定義的常量不同,const定義的常量因為有自己的數據類型,這樣C++編譯時就會進行嚴格的類型檢查,具有良好的編譯時的檢測性。
c. 函數的參數也可以用const說明,用於保證實參在該函數內部不被改動。
- 常引用
如果在聲明引用是用const修飾,那么該引用就被稱為常引用。常引用所引用的對象不能被更新。如果用常引用做為形參,便不會產生對實參不希望的修改。
定義:const 數據類型 &引用名;
如: int a = 5;
const int &b = a;
其中,b是一個常引用,它所引用的對象不允許更改,如果出現:
b=6;
則是非法的。(如果你寫a=6,這個不會出問題,因為a不是常類型變量。)
常引用常常被用作形參,例如:
void main() { int a = 10; int b = 20; add(a, b); } int add(cons int &a, const int &b) { // a += 10; // 非法的,形參a為常引用,不能改變它的值 return (a + b); }
- 常對象
如果在聲明對象的時候用const修飾,則稱被聲明的對象為常對象。常對象的數據成員值在對象的整個生命周期內不能被改變。
定義:類名 const 對象名[(參數表)]或者const 類名 對象名[(參數表)]
在定義對象時必須進行初始化,而且不能被更新,C++不允許直接或間接的更改常對象的數據成員。
- 常對象成員
(1) 常數據成員
類的數據成員可以是常量或常引用,使用const說明的數據成員稱為常數據成員。如果在一個類中聲明了常數據成員,那么構造函數就只能通過初始化列表對該數據成員進行初始化,而任何其他的函數都不能對該成員函數賦值。
(2) 常成員函數
在類中使用關鍵字const的函數稱為常成員函數,常成員函數的格式如下:
返回類型 函數名(參數表)const;
const是函數類型的組成部分,所以在函數的實現部分也要帶關鍵字const。
如:
void showDate() const; // 聲明 void showDate() const // 實現 { printf(“year”); }
說明:
a. 如果將一個對象聲明為常對象,則通過該對象只能調用它的常成員函數,而不能調用普通的成員函數。常成員函數是常對象的唯一的對外接口。
b. 常成員函數不能更新對象的數據成員,也不能調用該類中的普通成員函數,這就保證了在常成員函數中絕對不會更新數據成員的值。