1. 程式人生 > >C++學習筆記1-const引用

C++學習筆記1-const引用

    const引用可以用不同型別的物件初始化(只要能從一種型別轉換到另一種型別即可),也可以是不可定址的值,如文字常量,例如:

    同樣的初始化對於非const引用是不合法的,將導致編譯錯誤。原因如下。

    引用在內部存放的是一個物件的地址,它是該物件的別名。對於不可定址的值,如文字常量,以及不同型別的物件,編譯器為了實現引用,必須生成一個臨時物件,引用實際上指向該物件,但使用者不能訪問它。例如,當我們寫:

    編譯器將其轉換成:

    如果我們給ri賦一個新值,則這樣做不會改變dval,而是改變temp。對使用者來說,就好像修改動作沒有生效。

    const引用不會暴露這個問題,因為它們是隻讀的。不允許非const引用指向需要臨時物件的物件或值,一般來說,這比“允許定義這樣的引用,但實際上不會生效”的方案要好。

    下面給出的例子很難在第一次就能正確宣告。我們希望用一個const物件的地址來初始化一個引用。非const引用定義是非法的,將導致編譯時刻錯誤:

    下面是在打算修正pi_ref定義時首先想到的做法,但是該定義不能生效。

    如果從右向左讀這個定義,會發現pi_ref是指向一個定義為const的int型物件的指標,我們的引用不是指向一個常量,而是指向一個非常量指標,指標指向一個const物件。

    正確的定義如下:

    指標和引用有兩個主要區別:引用必須總是指向一個物件。如果用一個引用給另一個引用賦值,那麼改變的是被引用的物件而不是引用本身。