const修飾符可以修飾指針、數據成員、成員函數和類對象。接下來分別進行解釋:
1.修飾指針
const 對象一旦創建就不能改變,所以const對象必須初始化。可以是任意的表達式;
const int i = get_size(); //true
const int j = 42; //true
const int k; //false
(1)指針常量
例如:int a = 10; int * const p = &a;
const 修飾的是p這個指針,所以是指針常量,指針的地址不能改變,但是指針的內容可以改變。
int a = 10;
int b = 299;
int* const p = &a;
a = 999; // true 可以通過原來的變量修改值
*p = 100; // true
p = &b; // false
(2)常量指針
例如:int a = 10; const int *p = &a;(或 int const *p = &a;)
const 修飾的是其類型,指針指向的值不可改變,但是可以改變p的地址,因爲p這裏是一個變量。
int a = 10;
int b = 299;
int const *p = &a;
p = &b; // true
a = 999; // true
*p = 300; // false
(3)指向常量的指針常量
這個就比較簡單了,地址和值都不能改變,如下所示:
int a = 10;
const int* const p = &a;
2.修飾數據成員
修飾數據成員的時候,初始化只能在參數列表裏,被const修飾的數據成員,不能被修改。如下代碼所示:
class Const_test{
public:
Const_test(int v):value(v){
}
private:
const int value;
};
3.修飾成員函數
const放置的位置 : 函數聲明之後,實現體之前。要求在聲明和定義處都要有const修飾。const所修飾的成員函數能訪問const和非const數據成員,但不能修改非const數據成員,只能訪問const成員函數,不能訪問非const成員函數。
構成重載:const對象只能調用const成員函數。非const成員對象,優先調用非const成員函數,若無,則可調用const成員函數。
class Const_test{
public:
Const_test(int v):value(v){
}
void display()const{
age = 10; //錯誤
int temp = 10; //正確
temp = age;
print();//錯誤
}
void dispaly(){//重載
}
void print(){
}
private:
int age;
const int value;
};
4.修飾類對象
const修飾函數,是從函數層面,不修改數據。const修飾對象,是從對象的層面,不修改數據。只能調用const成員函數。