1.引用的概念
類型名 & 引用名 = 某變量名;
int n = 4;
int & r = n; // r引用了 n, r的類型是 int &
某個變量的引用,等價於這個變量,相當於該變量的一個別名。int n = 4;
int & r = n;
r = 4;
cout << r; //輸出4
cout << n; //輸出4
n = 5;
cout << r; //輸出5
2.3個注意點
定義引用時一定要將其初始化成引用某個變量。double a = 4, b = 5;
double & r1 = a;
double & r2 = r1; // r2也引用 a
r2 = 10;
cout << a << endl; // 輸出 10
r1 = b; // r1並沒有引用b,只是賦值
cout << a << endl; //輸出 5
3.引用作爲函數形參
引用應用的簡單示例。C語言中,如何編寫交換兩個整型變量值的函數?
void swap( int * a, int * b)
{
int tmp;
tmp = * a; * a = * b; * b = tmp;
}
int n1, n2;
swap(& n1,& n2) ; // n1,n2的值被交換
有了C++的引用:void swap( int& a, int& b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1,n2) ; // n1,n2的值被交換
4.引用作爲函數的返回值
int n = 4;
int & SetValue() { return n; }
int main()
{
SetValue() = 40;
cout << n;
return 0;
} //輸出: 40
5.常引用
int n;
const int & r = n;
int n = 100;
const int & r = n;
r = 200; //編譯錯
n = 300; // 沒問題
6.常引用和非常引用的轉換
至於第一個const類型引用的初始化,隨便都可以,因爲常引用不會去改變其引用的內容。一切都很合理~
那總結一下,其實很簡單,就是僅在初始化引用的時候需要注意一下:不能拿const類型的東西初始化引用類型,因爲引用類型可以改變它引用的東西。)
7.和指針的區別
8.例子:下面哪個沒錯?
A) int n = 4;
int & r = n * 5;//錯,引用的不能是表達式
B) int n = 6;
const int & r = n;//錯,常引用不能修改其引用的內容
r = 7;
C) int n = 8;
const int & r1 = n;
int & r2 = r1;//錯,不能用常引用對引用初始化
D) int n = 8;
int & r1 = n;
const int r2 = r1;
以上內容依舊摘自:PKU C++程序設計在線課筆記
9.補充,對常量進行引用
若要對常量進行引用,則編譯器首先建立一個臨時變量,然後將該常量的值置入臨時變量中,對該引用的操作就是對該臨時變量的操作。
關於引用的初始化有兩點值得注意:
- 當初始化值是一個左值(可以取得地址)時,沒有任何問題;
- 當初始化值不是一個左值時,則只能對一個const T&(常量引用)賦值。而且這個賦值是有一個過程的:首先將值隱式轉換到類型T,然後將這個轉換結果存放在一個臨時對象裏,最後用這個臨時對象來初始化這個引用變量。
//例子:
double& dr = 1; // 錯誤:需要左值
const double& cdr = 1; // ok
//第二句實際的過程如下:
double temp = double(1);
const double& cdr = temp;
參考:http://www.cnblogs.com/lbsx/archive/2009/08/28/1555581.html常引用的補充
int i = 42;
const int &r1 = i; //ok
const int &r2 = 42; //ok
const int &r3 = r1 * 2; //ok
int &r4 = r * 2; //error: 非常量引用不能引用一個表達式
讓我們想想這是爲什麼?double dval = 3014;
const int &ri = dval; //ok
其實編譯器幫我們多做了一步double dval = 3014;
const int temp = dval; //創建一個暫時的常量對象來存放dval
const int &ri = temp; //將引用到這個暫時的常量
正因爲有這個無名的中轉存量,所以常量引用纔可以引用數,表達式,還有不同類型的對象。參考:http://www.cnblogs.com/fusae-blog/p/4471787.html