現有如下程序:
1 int compare(const int &num1, const int *&num2) 2 { 3 return (num1 > *num2) ? num1 : *num2; 4 } 5 6 int main() 7 { 8 int i = 9; 9 int temp = 7; 10 int *p = &temp; 11 compare(i, p); 12 return 0; 13 }
會在11行處引發編譯錯誤:不能用“int*”類型的值去初始化“const int*&”類型的值,也就是說我們提供的實參“p”是非法的。
我們知道指針和引用的類型必須與其所指向和所引用的對象的類型一致,但是有一個例外就是指向常量的指針可以指向非常量對象,而常量引用可以被任意表達式初始化,我們的形參要求的是一個普通引用,所以其引用的類型必須與其引用對象的類型一致,為了讓我們的函數頭能夠應用在更多場合,所以我們決定將“普通引用”聲明成“常量引用”,函數聲明更改為以下形式:
/* *更改之前的函數頭:int compare(const int &num1, const int *&num2) *更改之后的函數頭:int compare(const int &num1, const int *const &num2) */ int compare(const int &num1, const int *const &num2) { return (num1 > *num2) ? num1 : *num2; } int main() { int i = 9; int temp = 7; int *p = &temp; compare(i, p); return 0; }
此時程序編譯通過,運行之后可以得到我們期望的結果。此時變量“num2”的類型是“指向常量的指針的常量引用”。
但是
在進行更多實驗之后有如下程序:
1 int compare(const int &num1, int *const &num2) 2 { 3 return (num1 > *num2) ? num1 : *num2; 4 } 5 6 int main() 7 { 8 int i = 9; 9 int temp = 7; 10 const int *p = &temp; 11 compare(i, p); 12 return 0; 13 }
其中,變量“num2”的類型從“const int *const &”變成了“int *const &”,如果根據之前的結論,可以得出現在num2的類型是“整形指針的常量引用”,根據c++語法定義我們可以得知常量引用可以用任意表達式來初始化,那么上面這段代碼就將是無誤的,可是在第11行出現了編譯錯誤:不能將實參“const int *”用於形參“int *const &”。
綜上所述,新增的“const”是作用於指針的。