一、C++的引用(reference)
1.1、引用的概念
c++中新增了引用(reference)的概念,引用可以作為一個(gè)已定義變量的別名。
Declares a named variable as a reference, that is, an alias to an already-existing object or function.
1.2、引用的定義與初始化
基本語(yǔ)法:Type& ref = val;
運(yùn)用定義完成后,相當(dāng)于目標(biāo)變量有兩個(gè)名稱,變量名ref實(shí)際上是一段連續(xù)內(nèi)存空間的別名
注意事項(xiàng):
1、&在此不是求地址運(yùn)算,而是起標(biāo)識(shí)作用。
2、必須在聲明引用變量時(shí)進(jìn)行初始化。比如:int a = 10; int& b = a;
3、引用初始化后不能改變,即不能在作為別的變量的引用
int a = 10;
int& b = a;
int c = 20;
b = c; \\錯(cuò)誤!reference初始化之后不能再次賦值
4、數(shù)組不能定義引用
1.3、引用和指針的區(qū)別
C++中指針與引用的區(qū)別 - 知乎
1.4、C++為什么要引入引用?
1.4.1、優(yōu)勢(shì):
- 可讀性更好
- 更容易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
1.4.2、必要性:
引用就是頂層const指針
為什么需要引用:是一個(gè)訪談里面的一段話,里面說(shuō)設(shè)計(jì)c++語(yǔ)法的時(shí)候之所以增加引用,是因?yàn)?span style="color:#fe2c24;">重載賦值運(yùn)算符的時(shí)候,指針不好使。
二、c語(yǔ)言的值傳遞和引用傳遞
先看一段簡(jiǎn)單的passing by value代碼:
void passByValue(int num){
num++;
printf("function number: %d\n",num); //num=>11
}
int main(){
int num = 10;
passByValue(num);
printf("original number: %d\n",num); //num=>10
return 0;
}
運(yùn)行此代碼就會(huì)發(fā)現(xiàn),num被復(fù)制到了函數(shù)中,并沒(méi)有改變其本身值。
下面是一段passing by reference的代碼,值得注意的是C語(yǔ)言不像C++一樣有真正的引用(reference),所以傳遞reference的時(shí)候要用到pointer來(lái)實(shí)現(xiàn)。
void passByReference(int* num){
(*num)++; //"dereference"
printf("function number: %d\n",*num); //num=>11
}
int main(){
int num = 10;
passByReference(&num);
printf("original number: %d\n",num); //num=>11
return 0;
}
運(yùn)行此代碼可以看到,兩次print出來(lái)的都是11。因此可知傳遞的是變量的地址,在函數(shù)內(nèi)對(duì)變量做出改變會(huì)影響到原變量的值。
?三、c++語(yǔ)言的值傳遞、指針傳遞和引用傳遞
例如:c++中常用的vector容器作為參數(shù)時(shí),有三種傳參方式,分別如下:
function1(vector<int> vec),傳值
function2(vector<int> &vec),傳引用
function3(vector<int> *vec),傳指針
三種方式對(duì)應(yīng)的調(diào)用形式分別為:
function1(vec),傳入值
function2(vec),傳入引用
function3(&vec),傳入地址
三種方式的效果分別為:
會(huì)發(fā)生拷貝構(gòu)造
不會(huì)發(fā)生拷貝構(gòu)造
不會(huì)發(fā)生拷貝構(gòu)造
?
pass-by-reference與pass-by-value相比,后者多調(diào)用了一次拷貝構(gòu)造函數(shù)與析構(gòu)函數(shù),且當(dāng)形參為非基本類型時(shí),也將在棧區(qū)開(kāi)辟更多的空間。因此,參數(shù)傳遞盡可能使用pass-by-reference方式,如果不希望函數(shù)內(nèi)部對(duì)實(shí)參進(jìn)行更改,可以在形參前加canst修飾。
但是,并不是pass-by-reference方式一定優(yōu)于pass-by-value,由于引用的實(shí)質(zhì)是指針實(shí)現(xiàn),引用真正傳遞的是指針,進(jìn)行間接尋址,在傳遞內(nèi)置類型時(shí)(如 int),指針?biāo)伎臻g甚至高于變量所占內(nèi)存空間(char類型占用一個(gè)字節(jié),而32bit系統(tǒng)指針占用4個(gè)字節(jié)),且間接尋址的效率要低些,因此,此時(shí)應(yīng)選用pass-by-value更有效。同理,大多數(shù)STL容器內(nèi)含的東西僅僅比指針類型多一點(diǎn)。因此,pass-by-reference節(jié)省空間有限,且間接尋址降低了程序效率,選用pass-by-value效率更高。
?
REF:
C++ reference - cppreference.com
Standard C++
[C++引用] 關(guān)于return by reference 和 pass by reference_c++returnbyreference_llnllm的博客-CSDN博客
C++ Functions - Pass By Reference - GeeksforGeeks
引用傳遞(passing by references) 在C語(yǔ)言和C++中的區(qū)別_J_039的博客-CSDN博客
C++ 高效編程:pass-by-value(值傳遞)與pass-by-reference(引用傳遞)_c99 pass by reference_hik_老鬼的博客-CSDN博客文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-692328.html
為什么C++既有指針又有引用 | 指針和引用的區(qū)別 |_嗶哩嗶哩_bilibili文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692328.html
到了這里,關(guān)于C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!