引用遇上const和指標

2021-08-17 03:23:14 字數 1371 閱讀 4434

int a = 1;

int b = 2;

const

int *c = &a;

const

int* &d = c;

const

int* const &e = c;

d = &b;//正確

e = &b;//錯誤

*d = 3;//錯誤

int *f = &a;

int* &g = f;

int* const &h = f;

g = &b;//正確

h = &b;//錯誤

*g = 3;//正確

當const引用是引用的乙個指標的時候,那麼指標的值是不能通過這個引用來改變值的。而前面的const int *則表示 指標所指向的類容是不能改變的。

知乎看的

int a = 10;

int *b = &a;

const

int* &p = b;//錯誤

const

int* const &p = b;//正確

直接編譯得到的錯誤資訊是:

error: invalid initialization of non-const reference of type 'const int*&' from an rvalue of type 'const int*'
對於**:

const int* &p = b;
左邊定義了乙個叫p的引用。如果你寫成 int* const &p,那麼p無疑是『指向int*的常引用』。但原來的寫法,p實際上是乙個『指向const int*的(非常)引用』。那麼等號右邊呢?本來b是個左值,但型別是int*而非const int*。根據c++標準,下列隱式轉換是允許的:

b是個int*左值,因此不能直接使用第二條規則來把它變成乙個const int*左值。因此,先通過第一條規則把它轉化成了右值,再使用第二條規則轉化為const int*。等價於:

int const * & p = static_cast(b);
但此時:

基於以上兩點,最終觸發了『不能用乙個const int*右值來初始化乙個對const int*的非常引用』的錯誤。

右邊是右值,當然不能被左值引用捕獲。不過c++還有乙個特別的規定,就是如果左邊是t const &的話,可以隱式捕獲乙個右值並延長他的生命週期。於是你寫:

int * const & p = b;

int const * const & p = b;

就沒有問題。

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...

當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的值從而修...