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

來源:互聯網
上載者:User

    在《資料結構與演算法分析 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,在編譯時間會發生如下錯誤:



 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.