1.常變數
const int i = 10;
int const i = 10;
兩種表達方式沒區別
2.指標與const
- 如果const位於
*
的左側,則const就是用來修飾指標所指向的變數,即指標指向為常量; - 如果const位於
*
的右側,const就是修飾指標本身,即指標本身是常量。 - 利用英文從右邊往左邊讀,並且以to為分界,to之前為描述指標的特性,to之後為描述目標的特性
指標常量: 指向常量的指標
const int *a;
int const *a;
1.對於指向常量的指標,不能透過指標來修改物件的值。
2.不能使用void*指標儲存const物件的地址,必須使用const void*型別的指標儲存const物件的地址。
3.允許把非const物件的地址賦值給const物件的指標,如果要修改指標所指向的物件值,必須透過其他方式修改,不能直接透過當前指標直接修改。
eg:
const int p = 10; //定義一個常量
const void * vp = &p;//將這個常量地址付給這指向常量的指標
int val = 3;
ptr = &val; // ok,指標可以改變自己的指向
*ptr=4;//error,不能透過指標來修改物件的值
常指標:const指標不能修改指向
int* const a;
eg:
int num=0, num1=1;
int * const ptr=# // const指標必須初始化!且const指標的指向不能修改
ptr = &num1; // error! const指標不能修改指向!
*ptr=1;//ok,const指標指向的值能修改
指向常量的常指標
const int* const a;
3.類函式中的const
const物件只能訪問const成員函式,而非const物件可以訪問任意的成員函式,包括const成員函式.
int Apple::add(int num) const
int Apple::add(int num)
- Apple物件可以訪問add()和add() const;
- const Apple物件只能訪問add() const;
在一個類中,任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const成員函式時,不慎修改 資料成員,或者呼叫了其它非const成員函式,編譯器將指出錯誤,這無疑會提高程式的健壯性
類中常量
不能在類宣告中初始化 const 資料成員。以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道 SIZE 的值是什麼。(c++11標準前)
class A
{
const int SIZE = 100; // 錯誤,企圖在類宣告中初始化 const 資料成員
int array[SIZE]; // 錯誤,未知的 SIZE
};
根本原因:const的生命週期在物件A創造之前是不存在的。
正確做法
class A
{
A(int size); // 建構函式
const int SIZE ;
};
A::A(int size) : SIZE(size) // 建構函式的定義
{
}
A a(100); // 物件 a 的 SIZE 值為 100
A b(200); // 物件 b 的 SIZE 值為 200
cosnt static 常量 可以解決生命週期的問題