C++ 參考(Reference)
參考(Reference)型態代表了變數或物件的一個別名(Alias),參考型態可以直接取得變數或物件的位址,並間接透過參考型態別名來操作物件,作用類似於指標,但卻不必使用指標語法,也就是不必使用*運算子來提取值。
要定義參考型態,在定義型態時於型態關鍵字後加上&運算子,例如:
上面的程式中,最後一行即是在定義參考型態,注意參考型態一定要初始化,例如下面的定義是不能通過編譯的:
為何參考型態一定要初始化?因為參考初始化後就不能改變它所代表的物件,任何指定給參考的值,就相當於指定給原來的物件,例如:
執行結果:
您也可以參考至一個字面常量,例如:
為什麼要在前面加上const才能參考至一個字面常量呢?您知道字面常量是不可定址的,為了能夠讓符合參考定址的語義,上面這段程式編譯器會傳如下的轉換:
先想想沒有加上const的情況,如果您對ref重新指定值,則實際改變的是tmp的值,而不是字面常量10,這就在符合字面常量無法取址(也就無法改變位址上的值)的語義,但使用者可能困惑明明改變了ref,為何字面常量沒有改變,所以加上const,明確指示不可以再重新指定值給ref,例如:
如果要定義指標型態的參考該如何呢?很簡單,指標型態是使用type*來宣告,而參考則是在名稱前加上&,所以指標型態的參考就如下所示:
一個具體的例子如下:
舉一反三的話,如果有個const變數,您可以使用一個const指標,並可以如下宣告一個指標的參考:
事實上很少會直接如上的方式來使用參考,而是用於函式傳遞時一種「傳參考」(Pass by reference)方式,目的在於可於函式中直接操作目標變數或物件,或者是避免複製一個大型物件,在之後要紹函式時會見到相關應用。
要定義參考型態,在定義型態時於型態關鍵字後加上&運算子,例如:
int
var = 10; // 定義變數
int *ptr = &var; // 定義指標,指向var的位址
int &ref = var; // 定義參考,代表var變數
int *ptr = &var; // 定義指標,指向var的位址
int &ref = var; // 定義參考,代表var變數
上面的程式中,最後一行即是在定義參考型態,注意參考型態一定要初始化,例如下面的定義是不能通過編譯的:
int
&ref; // error, `ref' declared as reference but not
initialized
為何參考型態一定要初始化?因為參考初始化後就不能改變它所代表的物件,任何指定給參考的值,就相當於指定給原來的物件,例如:
#include <iostream>
using namespace std;
int main() {
int var = 10;
int &ref = var;
cout << "var: " << var
<< endl;
cout << "ref: " << ref
<< endl;
ref = 20;
cout << "var: " << var
<< endl;
cout << "ref: " << ref
<< endl;
return 0;
}
執行結果:
var: 10 ref: 10 var: 20 ref: 20 |
您也可以參考至一個字面常量,例如:
const
int &ref = 10;
為什麼要在前面加上const才能參考至一個字面常量呢?您知道字面常量是不可定址的,為了能夠讓符合參考定址的語義,上面這段程式編譯器會傳如下的轉換:
int
tmp = 10;
const int &ref = tmp;
const int &ref = tmp;
先想想沒有加上const的情況,如果您對ref重新指定值,則實際改變的是tmp的值,而不是字面常量10,這就在符合字面常量無法取址(也就無法改變位址上的值)的語義,但使用者可能困惑明明改變了ref,為何字面常量沒有改變,所以加上const,明確指示不可以再重新指定值給ref,例如:
const
int &ref = 10;
ref = 20; // error, assignment of read-only reference `ref'
ref = 20; // error, assignment of read-only reference `ref'
如果要定義指標型態的參考該如何呢?很簡單,指標型態是使用type*來宣告,而參考則是在名稱前加上&,所以指標型態的參考就如下所示:
type
*&refOfPtr = somePtr;
一個具體的例子如下:
int
var = 10;
int *ptr = &var;
int *&ref = ptr;
int *ptr = &var;
int *&ref = ptr;
舉一反三的話,如果有個const變數,您可以使用一個const指標,並可以如下宣告一個指標的參考:
const
int var = 10;
const int *ptr = &var;
const int *&ref = ptr;
const int *ptr = &var;
const int *&ref = ptr;
事實上很少會直接如上的方式來使用參考,而是用於函式傳遞時一種「傳參考」(Pass by reference)方式,目的在於可於函式中直接操作目標變數或物件,或者是避免複製一個大型物件,在之後要紹函式時會見到相關應用。