国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞)

這篇具有很好參考價(jià)值的文章主要介紹了C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、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ì):

  • 可讀性更好

C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞),c/c++,c++,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞),c/c++,c++,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

  • 更容易實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用

C++/C:pass-by-value(值傳遞)與pass-by-reference(引用傳遞),c/c++,c++,c語(yǔ)言,開(kāi)發(fā)語(yǔ)言

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博客

為什么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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor at org.springf

    java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor at org.springf

    ? java.lang.IllegalArgumentException: Cannot pass null or empty values to constructor ?? ?at org.springframework.security.core.userdetails.User.init(User.java:113) ?? ?at org.springframework.security.core.userdetails.User$UserBuilder.build(User.java:535) ?? ?at com.example.mz.spingsecurity_jwt_deepstudy.SpingsecurityJwtDeepstudyApplicationTests.tes

    2024年02月04日
    瀏覽(22)
  • Vue 中change事件除了默認(rèn)參數(shù)value ,如何傳遞自己的參數(shù)

    Vue 中change事件除了默認(rèn)參數(shù)value ,如何傳遞自己的參數(shù)

    vue中@change事件除了傳遞value默認(rèn)參數(shù),如果需要傳自己的參數(shù)myprops 是有兩種方法: 但是這種方式分場(chǎng)景,如果你的myprops在data中定義好的那么就可以傳過(guò)去,如果myprops參數(shù)是像for循環(huán)里的每個(gè)item項(xiàng)目,那就報(bào)錯(cuò),提示你在data或者method中定義該參數(shù)或者方法。 這種方法任何

    2024年02月11日
    瀏覽(17)
  • 前端報(bào)錯(cuò):has been blocked by CORS policy: Response to preflight request doesn‘t pass access control chec

    前端報(bào)錯(cuò):has been blocked by CORS policy: Response to preflight request doesn‘t pass access control chec

    Access?to?XMLHttpRequest?at?\\\'https://zxxxx.com/\\\'?from?origin?\\\'http://zxxxx.com\\\'?has?been?blocked?by?CORS?policy:?Response?to?preflight?request?doesn\\\'t?pass?access?control?check:?It?does?not?have?HTTP?ok?status. 如果后端已經(jīng)設(shè)置了跨域,那就是預(yù)檢跨域請(qǐng)求問(wèn)題; 如果后端沒(méi)有設(shè)置跨域信息,則是跨域

    2024年02月02日
    瀏覽(19)
  • Selenium中find_element_by_id無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    Selenium中find_element_by_id無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    在自學(xué)selenium的時(shí)候,可能教學(xué)視頻太老了,WebDriver已經(jīng)沒(méi)有find_element_by_id這個(gè)方法了。 執(zhí)行結(jié)果如下: bug翻譯如下: AttributeError:“WebDriver”對(duì)象沒(méi)有屬性“find_element_by_id” 通過(guò)自動(dòng)補(bǔ)齊代碼發(fā)現(xiàn),WebDriver里面還是有find_element這個(gè)方法的。 通過(guò)按住Ctrl,點(diǎn)擊該方法,我們

    2024年02月11日
    瀏覽(17)
  • Bootstrap table check uncheck rows by array of values
  • selenium模塊中的find_element_by_id方法無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    selenium模塊中的find_element_by_id方法無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    在學(xué)習(xí)selenium模塊的時(shí)候,由于是在白嫖的,往年教程 點(diǎn)擊運(yùn)行后報(bào)錯(cuò) AttributeError: \\\'WebDriver\\\' object has no attribute \\\'find_element_by_id\\\' \\\'WebDriver\\\'沒(méi)有find_element_by_id這個(gè)方法 搜索出來(lái)的基本都是就這個(gè)方法進(jìn)行講解 在嘗試方法中發(fā)現(xiàn),finde_element這個(gè)方法有 點(diǎn)開(kāi)配置文件,發(fā)現(xiàn)通過(guò)find換了

    2024年02月11日
    瀏覽(20)
  • Relying upon circular references is discouraged and they are prohibited by default.循環(huán)依賴bug解決

    Relying upon circular references is discouraged and they are prohibited by default.循環(huán)依賴bug解決

    Relying upon circular references is discouraged and they are prohibited by default.循環(huán)依賴bug解決 出現(xiàn)的bug大概意思是:不鼓勵(lì)依賴循環(huán)引用,默認(rèn)情況下是禁止的。更新您的應(yīng)用程序以刪除 bean 之間的依賴循環(huán)。作為最后的手段,可以通過(guò)將 spring.main.allow-circular-references 設(shè)置為 true 來(lái)自動(dòng)中

    2024年02月02日
    瀏覽(19)
  • selenium4.3.0模塊中的find_element_by_id方法無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    selenium4.3.0模塊中的find_element_by_id方法無(wú)法使用,改用driver.find_element(by=By.ID, value=None)

    在selenium最新版本4.3.0中, 使用之前的find_element_by_id會(huì)報(bào)錯(cuò) Ctrl+點(diǎn)擊find_element,查看代碼 最新版本,改為了driver.find_element(By.ID, ‘foo’) 在自己的代碼中修改,發(fā)現(xiàn)By會(huì)被pycharm下劃線提示報(bào)錯(cuò),再次查看代碼 發(fā)現(xiàn)需要import By 再次修改自己的代碼,運(yùn)行通過(guò)

    2024年02月13日
    瀏覽(25)
  • Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘config.info‘ in value

    Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder ‘config.info‘ in value

    springcloudalibaba中出現(xiàn) Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder \\\'config.info\\\' in value \\\"${config.info}\\\" ,出現(xiàn)此報(bào)錯(cuò)大致意思為無(wú)法解析占位符的配置。 解決辦法:我們找到nacos配置列表,發(fā)現(xiàn)Data Id中 ${spring.profiles.active} 這里寫(xiě)的是dev ,而配置文件中寫(xiě)的是test測(cè)試環(huán)

    2023年04月25日
    瀏覽(96)
  • 安裝docker nvidia toolkit時(shí)報(bào)錯(cuò)E: Conflicting values set for option Signed-By

    安裝docker nvidia toolkit時(shí)報(bào)錯(cuò)E: Conflicting values set for option Signed-By

    在運(yùn)行sudo apt-get這一步時(shí),報(bào)錯(cuò): E: Conflicting values set for option Signed-By regarding source https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64/ /: /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg != E: The list of sources could not be read. 上網(wǎng)查了很多博客沒(méi)能解決問(wèn)題,后來(lái)在nvidia docker的官方

    2024年02月13日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包