C++小知識——const詳解
阿新 • • 發佈:2018-12-08
一、const的基本使用情況
使用情況 | 格式 |
---|---|
常變數 | const 型別說明符 變數名 (可互換const和型別說明符) |
常引用 | const 型別說明符 &引用名 (可互換const和型別說明符) |
常物件 | 類名 const 物件名 (可互換const和型別說明符) |
常成員函式 | 類名::函式名(形參表) const |
常陣列 | 型別說明符 const 陣列名[大小] |
常指標 | 型別說明符 const *變數名 |
二、const修飾指標的情況
首先定義了一個整型變數b並給它賦值100
情況1:const位於*號的左側,與const放在變數宣告符中的位置無關
const int *a = &b;
等價於int const *a = &b;
這種情況下,const就是用來修飾指標所指向的變數,即指標指向為常量
這樣,可以先不進行初始化,因為雖然指標的內容是常量,但指標本身不是常量。const int *a;
是正確的。
舉個例子:假如a是一個倉庫管理員,他所管理的倉庫裡面的貨物他是沒有許可權去動的。
但是,也有兩種辦法去改變倉庫裡面的值:
最直接的當然是直接改變變數b的值了
間接的方法就是讓a指向另外一個變數
情況2:const位於*號的右側,const修飾指標本身,即指標本身是常量
int* const a;
,這種情況下不能對指標本身進行更改操作,而指標所指的內容不是常量
由於指標本身是常量,所以一定要在定義的同時進行初始化
情況3:星號的左右兩側都有,指標本身和指標指向的內容都是常量
const int* const a = &b;
三、與#define的區別
雖然它們都可以定義常量,但是const比#define有更多的優點:
- const常量有資料型別,而巨集常量沒有資料型別。
因此編譯器可以對前者進行安全檢查,而只對後者進行字元替換,而且在替換過程中可能有邊際效應- 有些除錯工具可以針對const進行除錯,而不能對巨集常量進行除錯
四、如何修改常成員函式中類的成員變數
在類的成員變數中,用
mutable修飾成員變數名
後,就可以在const成員函式中修改成員變數的值了