在C++指針傳遞引用和Const關(guān)鍵字
以前,當(dāng)我們將參數(shù)傳遞給函數(shù)時(shí),我們一般使用普通變量,這稱(chēng)為pass-by-value方法。但是因?yàn)閭鬟f給函數(shù)的變量有可以出現(xiàn)超出了范圍的問(wèn)題,這樣我們實(shí)際上無(wú)法修改參數(shù)的值。
引用傳遞
引用傳遞是指通過(guò)引用將參數(shù)傳遞給函數(shù)。調(diào)用時(shí),該函數(shù)可以通過(guò)使用傳入的引用來(lái)修改參數(shù)的值。
這使我們能夠:
- 修改函數(shù)參數(shù)的值。
- 出于性能原因,避免復(fù)制變量/對(duì)象。
以下代碼顯示了傳遞引用的示例。調(diào)用函數(shù)時(shí),引用參數(shù)用實(shí)際參數(shù)初始化:
- #include <iostream>
- using namespace std;
- void swap(int &i,int &j){
- int temp = i;
- i = j;
- j = temp;
- }
- int main(){
- int a = 100;
- int b = 200;
- swap(a,b);
- cout << a << endl;
- cout << b << endl;
- }
請(qǐng)注意,int &i和int &j是函數(shù)的參數(shù)swap()。
當(dāng)swap()被調(diào)用時(shí),變量a和的值b將被修改,因?yàn)樗鼈兪峭ㄟ^(guò)引用傳遞的。輸出將是:
- 200
- 100
下面有一個(gè)函數(shù)被調(diào)用triple(),有一個(gè)main()我們調(diào)用了triple()兩次。大家認(rèn)為這段代碼會(huì)輸出什么?
- #include <iostream>
- int triple(int i) {
- i = i * 3;
- return i;
- }
- int main() {
- int num = 1;
- std::cout << triple(num) << "\n";
- std::cout << triple(num) << "\n";
- }
函數(shù)Triple()的參數(shù)是int i,所以它在這里是通過(guò)值傳遞的;傳入的參數(shù)num不會(huì)被修改。
因此輸出為
- 3
- 3
將參數(shù)從 更改int i為int &i?,F(xiàn)在正在做引用傳遞而不是值傳遞。你認(rèn)為這現(xiàn)在會(huì)輸出什么?
- #include <iostream>
- int triple(int &i) {
- i = i * 3;
- return i;
- }
- int main() {
- int num = 1;
- std::cout << triple(num) << "\n";
- std::cout << triple(num) << "\n";
- }
在第一次調(diào)用Triple()之后,num從1修改為3。因此,當(dāng)?shù)诙握{(diào)用Triple()時(shí),輸出為9。
因此輸出為
- 3
- 9
使用 Const 傳遞
const關(guān)鍵字告訴編譯器,這樣的變量不會(huì)改變的。
比如:double const pi = 3.14;。如果我們嘗試更改pi,編譯器將拋出錯(cuò)誤。
有時(shí),我們const在函數(shù)中使用參數(shù);這是當(dāng)我們知道我們想要編寫(xiě)一個(gè)函數(shù),其中參數(shù)不會(huì)在函數(shù)內(nèi)部更改的事實(shí)時(shí)。下面是一個(gè)例子:
- int triple(int const i) {
- return i * 3;
- }
在這個(gè)例子中,我們沒(méi)有修改i. 如果在函數(shù)內(nèi)部triple(),i更改了 的值,則會(huì)出現(xiàn)編譯器錯(cuò)誤。
因此,為了節(jié)省不修改參數(shù)值的函數(shù)的計(jì)算成本,我們實(shí)際上可以更進(jìn)一步并使用const引用:
- int triple(int const &i) {
- return i * 3;
- }
const 確保參數(shù)不會(huì)改變。但是,通過(guò)&i引用參數(shù),可以節(jié)省制作參數(shù)的計(jì)算成本。
下面有一個(gè)函數(shù)被調(diào)用,square()并且有一個(gè)main(),我們調(diào)用square()兩次。
- #include <iostream>
- using namespace std;
- int triple(int const &i) {
- return i * 3;
- }
- int main(){
- int a = 100;
- cout << triple(a) << endl;
- cout << triple(a) << endl;
- }
因此輸出為
- 300
- 300
由于我們沒(méi)有修改函數(shù)中的參數(shù),再次運(yùn)行代碼,輸出應(yīng)該是一樣的