C 中引用不能重新賦值的理解

2021-07-11 00:04:02 字數 956 閱讀 1954

教材上說引用是不能重新賦值的,可是下面的程式能正常執行,不會出錯。這裡怎麼出現了引用賦值語句呢(語句[1])?是不是教材錯了?原因究竟是什麼呢?

請看如下程式:

#include

void main()

{ int i=1,j=5;

int& k=i;

k=j; //語句[1]

cout

<<"i="

<"; j="

<"; k="

《首先想想程式執行結果應該是什麼呢?

vc6.0上執行後的結果是:

i=5; j=5; k=5

分析:

程式沒有錯誤,是正確的,但是並不能說明:引用能重新賦值。很明顯,引用是不能重新賦值的,只是理解上錯了!

引用的賦值:是指引用初始化時,它的引用物件只能是變數,並且,一旦它指定為某乙個物件的引用後,就不能更改了。但是,可以用這個引用來改變它的物件的值,從而達到引用的目的——作為變數物件的別名。

如上例,引用k初始化為i,即k從此以後一直是i的引用,若想讓k不再是i的引用而成為別的變數的引用那是不可能的。所以,接下來的一句「k=j;」就不能理解成:取消k是i的引用而將k作為j的引用。正確的理解應該是:利用引用k來改變它所指物件i的值,即相當於語句「k=5;」。若在上示例語句「k=j;」後加上一句「j=10」,結果將是:「i=5; j=10; k=5」,從這個結果就能很好理解了。

所謂的引用的重新賦值,應該是:

int x,y,z;

int &x=y;

&x=z;

這種是對引用x,改變了它的指定物件,一開始是y的引用,之後,又重新說明是z的引用,這種引用的重新賦值是不允許的。

另外:

常引用所引用的物件的值是不能更改的,即上述示例中若將語句「int& k=i;」更改為「const int& k=i;」,則在編譯時就會出現錯誤了。

C 中引用不能再更改繫結的物件的理解

c primer教材上說引用不能再改變繫結搞得物件,也就是引用再第二次賦值。可是下面的程式能正常執行,不會出錯。這裡怎麼出現了引用賦值語句呢 語句 1 是不是教材錯了?原因究竟是什麼呢?請看如下程式 include void main 首先想想程式執行結果應該是什麼呢?vc6.0上執行後的結果是 i...

C 非常量引用不能指向臨時物件

目錄 舉例分析 解決1 舉例 非常量引用 指向 臨時物件 即 將 臨時物件 傳遞給 非常量引用型別。如以下情況就會出現 實現實數rational類,實數可以使用 號相加,運算的結果要可以使用 cout 以分數形式輸出 實數rational 的值 rational a 4,5 rational b 1...

深入理解PHP中賦值與引用

先看下面的問題 a 10 將常量值賦給變數,會為a分配記憶體空間 b a 變數賦值給變數,是不是copy了乙份副本,b也分配了記憶體空間呢?c a 引用是不會為c分配空間的,c和a是共用乙份空間的。對於中間的那個問題,你的答案是什麼呢?在今天之前,我的答案是會為b分配記憶體空間。因為我是這麼理解的 ...