教材上說引用是不能重新賦值的,可是下面的程序能正常運行,不會出錯。這里怎么出現了引用賦值語句呢(語句[1])?是不是教材錯了?原因究竟是什么呢?
請看如下程序:
#include<iostream.h> void main() { int i=1,j=5; int& k=i; k=j; //語句[1] cout<<"i="<<i<<"; j="<<j<<"; k="<<k<<endl; }
首先想想程序運行結果應該是什么呢?
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;”,則在編譯時就會出現錯誤了。
轉載:https://blog.csdn.net/gao1440156051/article/details/51073433