引用

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.常引用

定義引用時,前面加const關鍵字,即爲“常引用”
int n;
const int & r = n; 
r 的類型是 const int &
不能通過常引用去修改其引用的內容:
int n = 100;
const int & r = n;
r = 200; //編譯錯
n = 300; // 沒問題

6.常引用和非常引用的轉換

const T & 和T & 是不同的類型!!!
T & 類型的引用或T類型的變量可以用來初始化const T & 類型的引用。
const T 類型的常變量和const T & 類型的引用則不能用來初始化T &類型的引用,除非進行強制類型轉換。
(這個我的理解是,因爲你去初始化的是引用,而引用要改變的是變量本身,所以當然不能拿const類型的東西(不管是const變量還是const引用)去初始化引用了,要用它們初始化引用,也只能初始化const類型的引用。
至於第一個const類型引用的初始化,隨便都可以,因爲常引用不會去改變其引用的內容。一切都很合理~
那總結一下,其實很簡單,就是僅在初始化引用的時候需要注意一下:不能拿const類型的東西初始化引用類型,因爲引用類型可以改變它引用的東西。

7.和指針的區別

C++的引用首先跟指針的最大區別就是引用不是一個對象,而指針是一個對象;其次引用在其定義時就要初始化,而指針可以不用。

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++程序設計在線課筆記
C++方面的很多內容書上都看過,但還是有些知識掌握得不是很好,藉此課程快速複習一下,並做總結。“盜”了 PKU 兩位不錯的老師的課件,作爲回報,打個廣告:這課不錯哈,大家快去學~
後面的學習筆記不再贅述出處。

9.補充,對常量進行引用

若要對常量進行引用,則編譯器首先建立一個臨時變量,然後將該常量的值置入臨時變量中,對該引用的操作就是對該臨時變量的操作。

關於引用的初始化有兩點值得注意:

  1. 當初始化值是一個左值(可以取得地址)時,沒有任何問題;
  2. 當初始化值不是一個左值時,則只能對一個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

常引用的補充

引用要引用正確的自身的類型,但是常量引用可以引用一個非const的對象,一個數,或者表達式。
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


發佈了145 篇原創文章 · 獲贊 12 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章