引用是一個目標變量的別名。對引用的一切操作和對變量的直接操作是一樣的。引用的聲明如下:
【數據類型】【&】【定義的引用名稱】=【目標變量名】;
引用不是一種數據類型,并不占存儲單元,沒有數組的引用。
引用的作用:
- 可用做函數參數。引用作為參數傳遞給函數時,在內存中并沒有產生變量實體的副本,它只是源目標變量的一個別名。
- 常引用。
const 【數據類型標識符】&【引用名】=【目標變量名】;
char x=1;
const char &rx=x;
rx=2; //錯誤:rx是只讀的
x=2; //正確
這樣的好處是可以不用擔心變量的值被別名以為的改掉。
- 引用作為函數返回值。
【數據類型】&【函數名】(形參列表){函數體}
實例:
#include<iostream>
using namespace std;
int temp; //全局變量temp;
int f1(int x)
{
temp=(int)(x*x);
return temp;
}
int &f2(int x)
{
temp=(int)(x*x);
return temp;
}
int main()
{
int a=f1(5);//系統生產成返回值的副本
int b=f2(5);//系統不生成返回值的副本,可以從被調函數中返回一個全局變量的引用
int &c=f2(5);//系統不生成返回值的副本,可以從被調函數中返回一個全局變量的引用
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
getchar();
}
注意:不能返回局部變量的值。局部變量在被函數調用返回后就被銷毀。那么它返回的引用所指向的內存已經沒有任何意義,運行時會出現不可預知的錯誤。
#include<iostream>
using namespace std;
int &f1(int x)
{
int tmp;
tmp=x;
cout<<"In f1:"<<endl;
cout<<"&tmp is:"<<&tmp<<endl;
cout<<"tmp is:"<<tmp<<endl<<endl;
return tmp;
}
int main()
{
int &a=f1(5);
a=9;
cout<<"In main:"<<endl;
cout<<"&a is:"<<&a<<endl;
cout<<"a is:"<<a<<endl;
getchar();
return 0;
}
結果:

在f1結束后tmp的內存就已經釋放,a是tmp的別名雖然還是指向了那段內存,但是已經沒有任何意義了。
注意:
- 不能返回函數內部new分配的內存引用。因為被函數返回的引用只是作為臨時變量出現的,沒有被賦予一個實際的變量空間,所以這個引用所指向的空間就無法釋放,造成內存泄露。
- 可以返回類成員的引用,但最好是const。