c++參數傳遞的三種方式

    在《數據結構與算法分析 C++描述》第16頁提到了C++中三種不同的參數傳遞方式,分別是:1、按常量引用調用(call by constant reference2、按值調用 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,在編譯時會發生如下錯誤:



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章