C++之函数参数按引用传递
引用是C++中的概念,初學者容易把引用和指針混淆一起。
一下程序中,n是m的一個引用(reference),m是被引用物(referent)。
?int m;
?int &n = m;
n相當于m的別名(綽號),對n的任何操作就是對m的操作。
所以n既不是m的拷貝,也不是指向m的指針,其實n就是m它自己。
l???引用的規則:
(1)引用被創建的同時必須被初始化(指針則可以在任何時候被初始化)。
(2)不能有NULL引用,引用必須與合法的存儲單元關聯(指針則可以是NULL)。
(3)一旦引用被初始化,就不能改變引用的關系(指針則可以隨時改變所指的對象),這里指不能再綁定其他的對象,只要不是const,就可以改變值,即可以通過引用改變綁定對象的值,因為它們其實是相同的。
以下示例程序中,k被初始化為i的引用。語句k = j并不能將k修改成為j的引用,只是把k的值改變成為6。由于k是i的引用,所以i的值也變成了6。
?int i = 5;
?int j = 6;
?int &k = i;
?k = j; // k和i的值都變成了6;
引用的主要功能是傳遞函數的參數和返回值。
內聯函數是代碼被插入到調用者代碼處的函數。如同 #define 宏,內聯函數通過避免被調用的開銷來提高執行效率,尤其是它能夠通過調用(“過程化集成”)被編譯器優化。
????內聯函數和宏很類似,而區別在于,宏是由預處理器對宏進行替代,而內聯函數是通過編譯器控制來實現的。而且內聯函數是真正的函數,只是在 需要用到的時候,內聯函數像宏一樣的展開,所以取消了函數的參數壓棧,減少了調用的開銷。你可以象調用函數一樣來調用內聯函數,而不必擔心會產生于處理宏 的一些問題。
#include <iostream>
using namespace std;
void swap(int &i, int &j){
????i^=j;
????j=i^j;
????i=i^j;
????cout<<"the call function: "<<i<<"\t"<<j<<endl;
}
void print( const int &l){//如果形參是const,實參both。如果實參const,說明實參不能被改動,則形參必須const。
????cout<<"l= "<<l<<endl;
}
void main(){
????int i=3,j=5;
????swap(i,j);
????const int k=6;//定義的同時必須初始化,const int k;k=6;報錯
????int &m=i;//引用定義的同時必須初始化,而且要關聯到某一類型。int??&m=3報錯
????double b=3.0;
????double &a=b;
????//cout<<sizeof(a)<<endl;//引用的sizeof指向其綁定的對象的大小
????char *r;
????//cout<<sizeof(r)<<endl;//指針都是4個字節
????float array[12];
????cout<<sizeof(array)<<endl;//數組的sizeof就是本身類型占用字節數*個數
????//error :&m=j;引用一旦初始化后不可再綁定其他對象
????double n=1.2;
????const int &t=n;//const類型的引用可以綁定到其他類型,而非const類型的引用不可以。。。
//????print(k);
//????cout<<"the main function: "<<i<<"\t"<<j<<endl;
//????cout<<"k= "<<k<<endl;
}
//總結:一般變量想被外部文件使用,直接在引用的地方加上extern就ok了。const變量不行,如果想外部引用,初始化的地方加extern,引用的地方也要加
?
本節主要講函數調用及參數傳遞的一些問題。
首先說參數調用,參數調用做了2件事情,用對應的實參初始化函數的形參,并將控制權轉移給被調用函數,主調函數的執行被掛起,被調函數開始執行。函數的運行以形參的隱式定義和初始化開始。執行到return的時候,被調函數完成,主調函數在調用處開始恢復執行,并將函數的返回值用作求解調用操作符的結果,繼續處理在執行調用的語句中的剩余工作。
?
參數傳遞
第一種傳遞方式:值傳遞
值傳遞需要復制對應的實參實現初始化,當用實參副本初始化形參時,函數并沒有訪問調用函數所傳遞的實參本身,對實參副本的修改也是局部的,函數調用結束就結束了,因此不會修改實參的值。
引用傳遞:
因為復制實參并不是在所有的情況下都適合,不適合復制實參的情況包括:
當需要在函數中修改實參的值時;
當需要以大型對象作為實參傳遞時,對實際的應用而言,復制對象所付出的時間和存儲空間代價往往過大
當沒有辦法實現對象的復制時
?
引用形參直接關聯到綁定的對象而非對象的副本,必須使用與該引用綁定的對象初始化該引用。引用形參完全以相同的模式工作。在c語言中,人們習慣用指針,在c++中使用引用。
?
使用引用形參返回額外的信息。這個跟上面有些類似,只不過說如果你想要多返回些東西,但是直接又沒法返回,那么就借助引用好了,通過引用改變改變實參的值。
?
利用const引用避免復制。這個主要是大型對象的時候,復制代價比較高。比如string。。。
很多時候如果不需要改變值,就加上 const 。double fl=1.2;
const double *pl=&fl;//這個是正確的,賦值初始化
*pl=4.3;//error:因為已經是const類型的了,不允許改變值,不過指針pl還是可以指向其他對象的。
double *cosnt plt;這個時候plt是不能更改的。。。
string.h是c語言對應的標準庫,在c++里面對應的是<cstring>
總結
以上是生活随笔為你收集整理的C++之函数参数按引用传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静态函数讲解
- 下一篇: OJ系列之---IP与整数之间的转换