參考
宣告方法
資料型態& 參考別名 = 原始變數;
注意事項
-
宣告參考別名時,要初始化原始變數。
-
初始化後不可改變原始變數。
-
別名可以存取原始變數,參考別名與原始變數都是指向相同記憶體位址。
宣告
1
2
3
4
5
int i = 10;//原始變數
//宣告參考
int& ref = i;//初始化原始變數,ref是i的別名
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
cout << "ref的記憶體位址 = " << &ref << ", ref = " << ref << endl;
i的記憶體位址 = 0x7ff7bfeff468, i = 10
ref的記憶體位址 = 0x7ff7bfeff468, ref = 10
由執行結果可知,i跟ref的記憶體位址相同,值也相同。
一定要初始化
以下的程式寫法會編譯錯誤,因為ref參考別名沒有初始化。
1
2
3
int i = 10;//原始變數
//宣告參考
int& ref;
參考別名跟原始變數功能一樣,可以修改跟讀取記憶體內容。
參考別名跟原始變數都指向相同記憶體位址,所以可以做一樣的操作。
1
2
3
4
5
6
7
8
9
int i = 10;//原始變數
//宣告參考
int& ref = i;
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
cout << "ref的記憶體位址 = " << &ref << ", ref = " << ref << endl;
ref = 30;
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
cout << "ref的記憶體位址 = " << &ref << ", ref = " << ref << endl;
i的記憶體位址 = 0x7ff7bfeff468, i = 10
ref的記憶體位址 = 0x7ff7bfeff468, ref = 10
i的記憶體位址 = 0x7ff7bfeff468, i = 30
ref的記憶體位址 = 0x7ff7bfeff468, ref = 30
由執行結果可以發現修改ref參考別名,就等於修改變數i,i跟ref的值都變成30。
一個變數可以多個參考別名
1
2
3
4
5
6
7
8
9
10
int i = 10;//原始變數
//宣告參考
int& ref = i;
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
cout << "ref的記憶體位址 = " << &ref << ", ref = " << ref << endl;
int& ref2 = i;
cout << "ref2的記憶體位址 = " << &ref2 << ", ref2 = " << ref2 << endl;
int& ref3 = i;
cout << "ref3的記憶體位址 = " << &ref3 << ", ref3 = " << ref3 << endl;
i的記憶體位址 = 0x7ff7bfeff468, i = 10
ref的記憶體位址 = 0x7ff7bfeff468, ref = 10
ref2的記憶體位址 = 0x7ff7bfeff468, ref2 = 10
ref3的記憶體位址 = 0x7ff7bfeff468, ref3 = 10
各種寫法
&只要介於資料型態
與參考別名
之間就可以,以下的宣告別名的方式都可以。
1
2
3
4
5
6
int i = 10;//原始變數
//宣告參考別名
int&ref = i;
int &ref2 = i;
int & ref3 = i;
int& ref4 = i;
資料型態要一致,參考別名無強制轉型
以下是錯誤的參考別名宣告
1
2
3
int i = 10;//原始變數
//宣告參考別名
double& ref = i;
原始變數i是int,無法轉成double的資料型態,也沒辦法像指標有強制轉型的功能。
初始化後不可改變原始變數
1
2
3
4
5
6
7
8
9
10
11
int i = 10;//原始變數
//宣告參考
int& ref = i;
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
cout << "ref的記憶體位址 = " << &ref << ", ref = " << ref << endl;
int j = 20;
ref = j; //將j變數 指派給 ref別名
cout << "j的記憶體位址 = " << &j << ", j = " << j << endl;
cout << "ref的記憶體位址 = " << &ref << ", i = " << ref << endl;
cout << "i的記憶體位址 = " << &i << ", i = " << i << endl;
上方的程式碼
int j = 20;
ref = j; //將j變數的值 指派給 ref參考別名
以上意思並非把原始變數設為j,實際上是變數i修改成20,ref是變數i的參考別名,就等同於變數i,所以上述程式碼可以看成i = 20;
執行結果
i的記憶體位址 = 0x7ff7bfeff468, i = 10
ref的記憶體位址 = 0x7ff7bfeff468, ref = 10
j的記憶體位址 = 0x7ff7bfeff45c, j = 20
ref的記憶體位址 = 0x7ff7bfeff468, i = 20
i的記憶體位址 = 0x7ff7bfeff468, i = 20
由執行結果可以發現,執行ref = j;
參考別名j的記憶體位址跟i相同,但j的值變成20,i的值也變成20,修改ref就等同於修改i,所謂的參考別名就是給變數i另一個假名ref,但指向的都是相同記憶體位址。