型別名 &參照名 = 同型別的某變數名;
此種寫法就定義了一個某種型別的參照,並將其初始化為參照某個同型別的變數。“參照名”的命名規則和普通變數相同。例如:int n; int & r = n;r 就是一個參照,也可以說 r 的型別是 int &。第二條語句使得 r 參照了變數 n,也可以說 r 成為了 n 的參照。
#include <iostream> using namespace std; int main() { int n = 4; int & r = n; //r參照了n,從此r和n是一回事 r = 4; //修改r就是修改n cout << r << endl; //輸出4 cout << n << endl; //輸出4 n = 5; //修改n就是修改r cout << r << endl; //輸出 5 int & r2 = r; //r2和r參照同一個變數,就是n cout << r2 << endl; //輸出 5 return 0; }
#include <iostream> using namespace std; int n = 4; int & SetValue() { return n; //返回對n的參照 } int main() { SetValue() = 40; //返回值是參照的函數呼叫表示式,可以作為左值使用 cout << n << endl; //輸出40 int & r = SetValue(); cout << r << endl; //輸出40 return 0; }SetValue 函數的返回值是一個參照,是 int & 型別的。因此第 6 行使得其返回值成為變數 n 的參照。
#include <iostream> using namespace std; void Swap(int a, int b) { int tmp; //以下三行將a、b值互換 tmp = a; a = b; b = tmp; cout << "In Swap: a = " << a << " b = " << b << endl; } int main() { int a = 4, b = 5; Swap(a, b); cout << "After swaping: a = " << a << " b = " << b << endl; return 0; }在上面的程式中,Swap 函數的返回值型別是 void,因此函數體內可以不寫 return 語句。 在不寫 return 語句的情況下,函數執行到末尾的
}
才返回。#include<iostream> using namespace std; void Swap(int & a, int & b) { //交換a、b的值 int tmp; tmp = a; a = b; b = tmp; } int main() { int n1 = 100, n2 = 50; Swap(n1, n2); //n1、n2 的值被交換 cout << n1 << " " << n2 << endl; //輸出 50 100 }第 11 行,進入 Swap 函數後,a 參照了 n1,b 參照了 n2,a、b 值的改變會導致 n1、n2 值的改變。因此本行會使 n1 和 n2 的值交換。
int n; const int & r = n;上面的語句定義了常參照 r,其型別是 const int &。
int n = 100; const int & r = n; r = 200; //編譯出錯,不能通過常參照修改其參照的內容 n = 300; //沒問題,n的值變為300注意,const T& 和 T& 是不同的型別。T& 型別的參照或 T 型別的變數可以用來初始化 const T & 型別的參照,const T 型別的常變數和 const T & 型別的參照則不能用來初始化 T & 型別的參照,除非進行強制型別轉換。例如下面的程式:
void Func(char & r) { } void Func2(const char & r) { } int main() { const char cc = 'a'; char c; const char & rcl = cc; const char & rc2 = c; //char變數可以用來初始化 const char & 的參照 char & r = cc; //編譯出錯,const char 型別的常變數不能用來初始化 char & 型別的參照 char & r2 = (char &)cc; //沒問題,強制型別轉換 Func(rcl); //編譯出錯,引數型別不匹配 Func2(rcl); //沒問題,引數型別匹配 return 0; }