在《資料結構與演算法分析 C++描述》第16頁提到了C++中三種不同的參數傳遞方式,分別是:1、按常量引用調用(call by constant reference)2、按值調用 3、引址調用(call
by reference)。上網查了下資料之後我還是覺得分成這樣三種更便於理解:
1、按值調用: 形如 int fun(int x)
2、指標調用:形如 int fun(int* p)
3、引址調用:形如 int fun(int &x) 或者 int fun(const int &x)
按值調用存在實參的複製開銷,要是有傳回值又要複製一次。所以對於比較複雜的類類型實參,按值調用的複製開銷是很大的。由於函數fun會對實參x複製之後再進行處理,所以按值調用的函數不管怎麼處理都不會改變實參的值。
#include <iostream>using namespace std;int fun(int x){x=100;return 0;}void main(){int a=1;int b=fun(a);cout<<"a="<<a<<endl;}
輸出結果是:a=1
指標調用有人說指標調用是一種按值調用,也可以這樣理解吧。這是因為函數的形參是指標,所以函數複製的也就是指標。fun函數對指標進行處理的時候也就直接對實參指標指向的對象進行了處理,所以按指標調用的函數會修改實參對象。
#include <iostream>using namespace std;int fun(int* p){*p=100;return 0;}void main(){int a=1;int *p=&a;int b=fun(p);cout<<"a="<<*p<<endl;}
輸出結果:a=100
引址調用我們知道引用是獨佔的,即一旦建立了引用並初始化為某特定對象,它將總是引用此對象,給引用賦值並不會使它“指向”另外的對象,只是改變了對象的值。所以沒有加const修飾的引址調用函數可以改變實參的值,比如:int
fun(int &x),但是在進入函數和離開函數的時候沒有發生複製。如果在形參類型之前再加上const則稱為按“常量引用調用”這時函數只能讀取實參的值而不可以改變它,例如:int fun(const int &x)。
#include <iostream>using namespace std;int fun(int &x){x=100;return 0;}void main(){int a=1;int b=fun(a);cout<<"a="<<a<<endl;}
輸出結果:a=100
如果在fun(int &x)形參類型之前加上const,在編譯時間會發生如下錯誤: