現有以下程序:c++
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」是非法的。函數
咱們知道指針和引用的類型必須與其所指向和所引用的對象的類型一致,可是有一個例外就是指向常量的指針能夠指向很是量對象,而常量引用能夠被任意表達式初始化,咱們的形參要求的是一個普通引用,因此其引用的類型必須與其引用對象的類型一致,爲了讓咱們的函數頭可以應用在更多場合,因此咱們決定將「普通引用」聲明成「常量引用」,函數聲明更改成如下形式:spa
/* *更改以前的函數頭: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」的類型是「指向常量的指針的常量引用」。指針
可是code
在進行更多實驗以後有以下程序:對象
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 &」。blog
綜上所述,新增的「const」是做用於指針的。編譯