1. 程式人生 > >C++函數調用時的參數傳遞-3中傳遞方式

C++函數調用時的參數傳遞-3中傳遞方式

系統 問題 語言 例如 col 函數調用 一個 新特性 ostream

參數傳遞即實參向形參傳遞信息,使形參獲得對應的存儲空間及初值,C++中函數傳遞主要有3種方式:

1、按值傳遞。

以按值傳遞方式進行參數傳遞的過程為:首先計算出實參的值,然後給它所對應的形參變量分配存儲空間,該空間大小等於該形參類型的長度,然後把實參值存入到為形參分配的存儲空間裏去,該值即為形參的初值,在函數被調用時使用。而這種方式被調用的函數對實參的值改變不會有任何的影響,也就是說,即使形參的值在函數中被改變,也不會對實參值產生任何影響,實參值仍為被調用之前的值。究其原因還是實參和形參各占獨立的存儲單元,彼此之間互不影響。

按值傳遞引例:
#include <iostream>
using namespace std;
void swap(int a,int b);
int main(void)
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void swap(int a,int b)
{
int c=a;
a=b;
b=c;

}

運行結果為:

a=1,b=2

a=1,b=2

註意,雖然形參和實參都是a b,但它們是被分配到了不同的存儲空間,這涉及到作用域問題。

總結:(1)只有在函數被調用時,才為形參分配內存空間並賦予初值,當函數調用結束後,形參的內存空間被釋放,同時函數返回值(如果有的話);

(2)調用函數時形參實參類型必須一致,int型對應int型,同理double型對應double型,以此類推,否則程序會出錯;

(3)C++中函數參數的求值順序也即傳遞順序從右向左,例如:

#include <iostream>
using namespace std;
int sum(int x,int y);
int main(void)
{
int a,b;
a=1;b=2;
cout<<sum(++a,a+b)<<endl;
a=1;b=2;
cout<<sum(a+b,++a)<<endl;
return 0;
}
int sum(int x,int y)
{
return x+y;
}

運行結果為:

5

6

2,、地址傳遞。

在定義函數的時候如果將形參值定義為指針變量,則調用該函數的時候實參應為地址,這種傳遞方式即為地址傳遞。與按值傳遞不同的是,地址傳遞是將實參的存儲地址傳遞給對應形參,從而使形參指針和實參的指針都指向同一個地址,所以被調用函數中形參指針指向的地址中內容的改變同時會造成實參內容的改變。

地址傳值引例:

#include <iostream>
using namespace std;
void swap(int *,int *);
int main(void)
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
swap(&a,&b);
cout<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void swap(int *,int *)
{
int c=*a;
*a=*b;
*b=c;
}

運行結果:

a=1,b=2

a=2,b=1

註意:此時的實參和形參仍然占用不同的存儲單元,只是它們的指針指向的是同一個地址。

3、引用傳遞

引用是C語言所沒有而C++提供的一種新特性,引用可以看做是變量或者對象的別名,當建立引用的時候,程序用一個變量或者對象的名字初始化它,這樣引用就可以當做該變量或者對象的別名所使用,因此對引用的改變就是對變量或者對象本身的改變。引用的語法格式如下所示:

變量類型& 引用名=變量名;

例如定義一個整型變量的引用:

int a;

int& refa=a; \\refa作為a的別名

refa=10;

a-=40;

cout<<a<<endl;

輸出結果為-30。此時系統沒有為refa分配存儲空間,它和a代表了相同的內存空間,對refa進行改變就是對a進行改變。引用的建立和使用引例:

#include <iostream>
using namespace std;
int main(void)
{
int a=3,b=2;
int &a=refa,&b=refb;
refa=a+2;
b=refa+1;
cout<<refa<<" "<<a<<endl;
cout<<refb<<" "<<b<<endl;
refa=b;
cout<<refa<<" "<<a<<endl;
return 0;
}
運行結果為:

5 5

3 3

3 3

註意:(1)引用在定義的時候必須被初始化,必須指定是哪個變量或對象的別名,類型對應一致;

(2)引用僅僅是變量或者對象的別名,系統不會為它分配內存空間;

(3)引用一旦建立就不能被改變,即它已跟定了該變量或者對象,不能作為其它變量或對象的別名。

按值傳遞易理解但改變形參不能對實參產生影響,地址傳遞雖可以,但是在函數中多次用指針進行間接訪問會使程序難以閱讀,且易產生錯誤,而引用完美解決了上述兩個問題。引用傳遞是在函數定義時在形參前面加上“&”。

引用傳遞引例:

#include <iostream>
using namespace std;
void swap(int &,int &);
int main(void)
{
int a=1,b=2;
cout<<"a="<<a<<",b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<",b="<<b<<endl;
return 0;
}
void swap(int &,int &)
{
int c=a;
a=b;
b=c;
}

以上即為C++函數調用時的三種傳遞方式。

C++函數調用時的參數傳遞

C++函數調用時的參數傳遞-3中傳遞方式