日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++之函数参数按引用传递

發布時間:2025/5/22 c/c++ 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++之函数参数按引用传递 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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++之函数参数按引用传递的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。