C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
引用是變量的別名。也就是說,它是某個已存在變量的另一個名字。一旦把引用初始化為某個變量,就可以使用該引用名稱或變量名稱來指向變量。
1. 創建引用
要聲明引用,可使用引用運算符 & ,如下面的語句所示:
VarType original = Value;
VarType& ReferenceVariable = original;
有如下變量
int i = 0;
我們可以為 i 聲明引用變量,如下所示:
int& r = i;
double& s = d;
在這些聲明中, & 讀作引用。因此,第一個聲明可以讀作 r 是一個初始化為 i 的整型引用,第二個聲明可以讀作 s 是一個初始化為 d 的 double 型引用。下面的實例使用了 int 和 double 引用:
#include <iostream>
using namespace std;int main ()
{// 聲明簡單的變量int i;double d;// 聲明引用變量int& r = i;double& s = d;int& r2 = r;i = 5;cout << "Value of i : " << i << endl;cout << "Address of i : " << &i << endl;cout << "Value of i reference r : " << r << endl;cout << "Address of i reference r&: " << &r << endl;cout << "Address of i reference r2&: " << &r2 << endl;cout << "Value of i reference r : " << r << endl;d = 11.7;cout << "Value of d : " << d << endl;cout << "Value of d reference : " << s << endl;return 0;
}
輸出結果:
Value of i : 5
Address of i : 0x7ffe2bf65734
Value of i reference r : 5
Address of i reference r&: 0x7ffe2bf65734
Address of i reference r2&: 0x7ffe2bf65734
Value of i reference r : 5
Value of d : 11.7
Value of d reference : 11.7
其中 r2 是 r 的引用,而 r 又是 i 的引用,所以 r2、r、i 的內存地址是相同的。
2. 引用和指針的區別
引用很容易與指針混淆,它們之間有三個主要的不同:
- 不存在空引用。引用必須連接到一塊合法的內存。
- 一旦引用被初始化為一個對象,就不能被指向到另一個對象。指針可以在任何時候指向到另一個對象。
- 引用必須在創建時被初始化。指針可以在任何時間被初始化。
3. 引用的特點
典型的函數聲明類似于下面這樣:
ReturnType DoSomething(Type parameter);
調用函數 DoSomething( ) 的代碼類似于下面這樣:
ReturnType Result = DoSomething(argument); // function call
上述代碼導致將 argument 的值復制給 parameter,再被函數 DoSomething( ) 使用。如果 argument 占用了大量內存,這個復制步驟的開銷將很大。同樣,當 DoSomething( ) 返回值時,這個值被復制給 Result。如果能避免這些復制步驟,讓函數直接使用調用者棧中的數據就太好了。為此,可使用引用。
可避免復制步驟的函數版本類似于下面這樣:
ReturnType DoSomething(Type& parameter); // note the reference&
調用該函數的代碼類似于下面這樣:
ReturnType Result = DoSomething(argument);
由于 argument 是按引用傳遞的,parameter 不再是 argument 的拷貝,而是它的別名。
#include <iostream>
using namespace std;void getSequare(int& a);int main ()
{int a = 10;cout << "&a is " << &a << endl;getSequare(a);cout << "&a is " << &a << endl;cout << "a sequare is " << a << endl;return 0;
}void getSequare(int& num)
{cout << "&num is " << &num << endl;num *= num;
}
輸出結果:
&a is 0x7ffdcf10a7a4
&num is 0x7ffdcf10a7a4
&a is 0x7ffdcf10a7a4
a sequare is 100
函數 getSequare 通過引用參數接受一個要計算其平方的數字,并通過該參數返回結果。如果忘記將參數 num 聲明為引用 & ,結果將無法返回到調用函數 main() ,因為 getSequare() 將使用 num 的本地拷貝執行運算,而函數結束時該拷貝將被銷毀。通過使用引用,可確保 getSequare()對 main() 中定義的 num 所在的內存單元進行操作。這樣,函數getSequare()執行完畢后,也可以在 main() 中使用運算結果。
4. const 用于引用
可能需要禁止通過引用修改它指向的變量的值,為此可在聲明引用時使用關鍵字 const :
int original = 30;
const int& constRef = original;
constRef = 40; // Not allowed: constRef can’t change value in original
int& ref2 = constRef; // Not allowed: ref2 is not const
5. 引用作為參數傳遞給函數
#include <iostream>
using namespace std;void getSequare(const int& a, int& result);int main ()
{int a = 10;int sequare = 0;getSequare(a, sequare);cout << "sequare is " << sequare << endl; // sequare is 100return 0;
}void getSequare(const int& num, int& result)
{result = num * num;
}
在前一個程序中,使用同一個參數來接受輸入和存儲結果,但這里使用了兩個參數,一個用于接受輸入,另一個用于存儲運算結果。為禁止修改傳入的值,必須使用關鍵字 const 將其聲明為 const 引用,如第 4 行所示。這讓 a 變為其值不能修改的參數。
C++ 函數傳參:
(1) 將變量名作為實參和形參。這時傳給形參的是變量的值,傳遞是單向的。如果在執行函數期間形參的值發生變化,并不傳回給實參。因為在調用函數時,形參和實參不是同一個存儲單元。// 同 c
(2) 傳遞變量的指針。形參是指針變量,實參是一個變量的地址,調用函數時,形參(指針變量)指向實參變量單元。這種通過形參指針可以改變實參的值。// 同 c
(3) C++提供了 傳遞變量的引用。形參是引用變量,和實參是一個變量,調用函數時,形參(引用變量)指向實參變量單元。這種通過形參引用可以改變實參的值。
引用和指針也很像,它們都不會創建副本,因此效率都很高。它們的主要區別在于:
- 選擇成員的時候,引用使用點
.來查找,而指針則使用->來查找。 - 指針可能傳遞一個
NULL過來,因此在使用前必須檢查有效性;引用則必然代表某個對象,不需要做此檢查。
6. 引用作為函數返回值
當函數返回一個引用時,則返回一個指向返回值的隱式指針。這樣,函數就可以放在賦值語句的左邊。
#include <iostream>
using namespace std;int& getValue();int main ()
{ int& a = getValue();cout << "a is " << a << endl;return 0;
}int& getValue()
{static int ret = 100;return ret;
}
(1)以引用返回函數值,定義函數時需要在函數名前加 &
(2)用引用返回一個函數值的最大好處是,在內存中不產生被返回值的副本
其它示例代碼:
double vals[] = {10.1, 12.6, 33.1, 24.1, 50.0};
double& setValues( int i )
{return vals[i]; // 返回第 i 個元素的引用
}// 要調用上面定義函數的主函數
int main ()
{cout << "改變前的值" << endl;for ( int i = 0; i < 5; i++ ){cout << "vals[" << i << "] = ";cout << vals[i] << endl;}setValues(1) = 20.23; // 改變第 2 個元素setValues(3) = 70.8; // 改變第 4 個元素cout << "改變后的值" << endl;for ( int i = 0; i < 5; i++ ){cout << "vals[" << i << "] = ";cout << vals[i] << endl;}return 0;
}
總結
以上是生活随笔為你收集整理的C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国搪胶行业市场深度
- 下一篇: 2022-2028年中国TPE弹性体行业