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