const表明一個值是不可更改的,我一直試圖瞭解如下語句中,const的作用
const int & getInt();int & getInt();
二者的差距在於前者的傳回值是個右值,後者的傳回值是個左值。也就是說,前者返回後只能賦值給其他變數(因為它被const修飾了,也就是說這個這個變數所指向的記憶體是不能被更改的),而後者可以稱為賦值的對象。
對此,我寫了如下一個程式段:
int & getInt(int &n){ return n;}int main(){ int n=1; int a = getInt(n); a++; cout<<n<<endl; cout<<a<<endl; return 0;}
對於這段程式,你預期的結果是什嗎?答案是:
n=1a=2
把上面程式做一個小小的修改:
int & getInt(int &n){ return n; } int main() { int n=1; int& a = getInt(n); a++; cout<<n<<endl; cout<<a<<endl; return 0;}
輸出是
n=2a=2
這裡涉及到函數傳回值的定義了。
通俗點來說吧,函數的傳回值大部分情況是是返回的一個右值,也就是說你在函數的外面是要這麼乾的:type name=fuction(....)。也就是說函數外面你聲明的變數(也可以說是接住函數傳回值的變數)一定是和函數傳回值類型相同的或者可以由傳回值類型轉化而成的類型。這麼一說的話,以上兩段程式也就不難理解了,因為
int a=2;int &b=a;int c=b;
是合法的,一個引用變數(此處為b)賦值給一個普通變數是合法的,所以一個int &類型的傳回值賦值給int類型是合理的,只不過從此之後a和n(第一段程式)就天各一方,沒有任何關係了,如果此時把a聲明int &a,那麼a還是指向的n那塊記憶體,所以兩個變數還是一條繩子上的螞蚱。
當然,一種特殊的情況還是要記住的,const &可以返回一個左值!