C++函數(shù)傳遞三種方式解讀
C++編程語(yǔ)言中的函數(shù)可以以多種傳遞的方式來(lái)實(shí)現(xiàn)一些特定功能的實(shí)現(xiàn)。我們今天就為大家總結(jié)了這些傳遞方式,讓大家能夠?qū)@方面的知識(shí)有一個(gè)深刻的理解。首先就讓我們一起來(lái)看看C++函數(shù)傳遞的相關(guān)方式吧、
C++函數(shù)傳遞的方式總共有三種,分別為:值傳遞、指針傳遞和引用傳遞。
值傳遞:
- void fun(int x)
- {
- x += 5; //修改的只是y在棧中copy x,x只是y的一個(gè)副本,在內(nèi)存中重新開辟的
一塊臨時(shí)空間把y的值送給了x;這樣也增加了程序運(yùn)行的時(shí)間,降低了程序的效率。- }
- void main(void)
- {
- int y = 0;
- fun(y);
- cout<<\"y = \"<<y<<endl; //y = 0;
- }
指針傳遞:
- void fun(int *x)
- {
- *x += 5; //修改的是指針x指向的內(nèi)存單元值
- }
- void main(void)
- {
- int y = 0;
- fun(&y);
- cout<<<<\"y = \"<<y<<endl; //y = 5;
- }
引用傳遞:
- void fun(int &x)
- {
- x += 5; //修改的是x引用的對(duì)象值 &x = y;
- }
- void main(void)
- {
- int y = 0;
- fun(y);
- cout<<<<\"y = \"<<y<<endl; //y = 5;
- }
看了C++函數(shù)傳遞后我們繼續(xù)來(lái)談“const只能用于修飾輸入?yún)?shù)”的情況。#t#
當(dāng)輸入?yún)?shù)用“值傳遞”方式時(shí),我們不需要加const修飾,因?yàn)橛弥祩鬟f時(shí),函數(shù)將自動(dòng)用實(shí)際參數(shù)的拷貝初始化形式參數(shù),當(dāng)在函數(shù)體內(nèi)改變形式參數(shù)時(shí),改變的也只是棧上的拷貝而不是實(shí)際參數(shù)。
但要注意的是,當(dāng)輸入?yún)?shù)為ADT/UDT(用戶自定義類型和抽象數(shù)據(jù)類型)時(shí),應(yīng)該將“值傳遞”改為“const &傳遞”,目的可以提高效率。
例如:
void fun(A a); //效率底。函數(shù)體內(nèi)產(chǎn)生A類型的臨時(shí)對(duì)象用于復(fù)制參數(shù) a,但是臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過(guò)程都將消耗時(shí)間。
void fun(A const &a); //提高效率。用“引用傳遞”不需要產(chǎn)生臨時(shí)對(duì)象,省了臨時(shí)對(duì)象的構(gòu)造、復(fù)制、析構(gòu)過(guò)程消耗的時(shí)間。但光用引用有可能改變a,所以加const
當(dāng)輸入?yún)?shù)用C++函數(shù)傳遞中的“指針傳遞”方式時(shí),加const修飾可防止意外修改指針指向的內(nèi)存單元,起到保護(hù)作用。
例如:
void funstrcopy(char *strdest,const char *strsrc) //任何改變strsrc指向的內(nèi)存單元,編譯器都將報(bào)錯(cuò)
些時(shí)保護(hù)了指針的內(nèi)存單元,也可以保護(hù)指針本身,防止其地址改變。
例如:
- void funstrcopy(char *strdest,const char *const strsrc)
以上就是對(duì)C++函數(shù)傳遞的三種方式的介紹。