當const指標遇到const引用

2021-06-21 03:12:09 字數 1394 閱讀 8474

首先,咱們先理清這麼幾個概念:const指標;指向const物件的指標;const引用;指向const物件的引用。

這裡const指標跟其它普通的const變數如const int i;沒有啥本質的區別。只不過變數變成了指標變數罷了,所以ptr在定義時必須要初始化,否則編譯錯誤。

ptr是指向const物件的指標,即不能通過*ptr來改變物件的值。此時,ptr本身並不是個常量型別,所以在定義的時候不是必須要初始化。此外,關於ptr的賦值,既可以將非const物件的位址賦給ptr,也可以將const物件的指標賦給ptr。但是不管ptr所指的物件能不能發生改變,都不能通過ptr來間接地對所指物件做寫操作。

跟指向const物件的指標類似,不管變數i是不是const型別,都不能對ref做寫操作。

看到這裡,不要感覺奇怪。const引用和指向const物件的引用本來就是同一種說法。回憶一下,引用型別在定義的時候都必須提供初始化,此後就不能再更改引用其他物件。如果你願意,可以這麼認為:所有的引用型別都是常引用。因為引用一旦指定,就不能更改,所能做的就只是通過引用對其所引用的物件的值進行更改。在c++術語裡面,大家一般都把指向const物件的引用稱為是const引用。所以你一般看到的const引用的定義其實就是指向const物件的引用的定義了。

下面就剛才所闡述的幾個概念,試想一下這麼乙個問題:對函式void test(const char*& ptr);進行test("1111");呼叫會出現編譯錯誤不?

分析:對test形參型別從右往左讀,首先,ptr是乙個引用型別;然後,ptr引用的是乙個指向常字元的指標。所以不能通過ptr來對所指物件做更改,但是可以對ptr的值做更改。畢竟,ptr不是乙個常型別,指向的物件是個常型別。進行test("1111」)呼叫時,由於「1111」會轉化為const char* const型別,即指向常字元的常指標型別,所以既不能對實參指標本身做寫操作,也不能對實參所指物件做寫操作。得出的結論就是:test("1111")呼叫會出現編譯錯誤。

修改方法就是:void test(const char* const& ptr);

#include using namespace std;

void test(const char *& ptr) // this should be modified as: void test(const char* const& ptr)

int main()

上述**出出現編譯錯誤,錯誤資訊如下:

const.cpp: 在函式『int main()』中:

const.cpp:20:13: 錯誤: 用型別為『const char*』的右值初始化型別為『const char*&』的非常量引用無效

const.cpp:5:6: 錯誤: 在傳遞『void test(const char*&)』的第 1 個實參時

當const遇上指標

const關鍵字 可以有很多用處,比如 define row 10 就代表row的值恒為10,不可修改。而const int row 10 也可以將值恆定,無法修改。還有 const int num 10 將陣列整個保護,無法修改。但,並不是將被保護量變為常量,而是在處理時將其看為常量,不能對其修改...

當const遇上了指標

將指標指向常量物件,這樣可以防止使用指標來修改所指向的值 int num 6 const int p p 8 非法,不能改變指向常量物件的值 但是,物件num本身不是常量可以被修改 num 8 合法的 也就是說,它指向的那個值並不是常量,因此我們不能通過p來修改它指向的值但是可以修改num的值從而修...

指向const物件指標 const指標

指向const物件指標 const指標 2010 07 22 16 40 1.指向const物件的指標 指向const物件的指標是乙個指標,但是不能通過它修改它指向的物件的值.宣告方法 const int p 指向const物件的指標在初始化後不允許對它指向的物件的值進行修改.const int i...