最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C++ 參數(shù)傳遞

2023-04-02 15:06 作者:S-a-i_  | 我要投稿

每次調(diào)用函數(shù)都會重新創(chuàng)建他的形參,并用傳入的實參對形參進(jìn)行初始化。

當(dāng)形參是引用類型時,我們說他對應(yīng)的實參被引用傳遞,或者函數(shù)被傳引用調(diào)用,和其他引用一樣,引用形參也是他綁定的對象的別名。

當(dāng)實參的值被拷貝給形參時,實參和形參是兩個相互獨立的對象,我們說這樣的實參被值傳遞或者函數(shù)被傳值調(diào)用。



傳值參數(shù)

盡管函數(shù)改變了val的值,但是這個改動不會影響到實參的值(圖中的cnt)。

指針形參

當(dāng)執(zhí)行指針拷貝操作時,拷貝的是指針的值,拷貝之后兩個指針是不同的指針,因為指針使我們可以間接訪問他所指的對象,所以通過指針可以修改他所指對象的值。

C++中建議使用引用類型的形參代替指針,如圖二。



傳引用參數(shù)

通過引用形參,允許函數(shù)改變一個或多個實參的值。

reset函數(shù)中,i其實就是a的另一個名字,所以對i的操作就是對a的操作。


使用引用避免拷貝

拷貝大的類對象或容器對象比較低效,甚至有的類不支持拷貝,所以只能通過引用參數(shù)訪問該類對象。

我們?nèi)绻容^兩個很長的string對象,我們就要避免拷貝他們,應(yīng)該使用引用形參,又因為不需要改變string的內(nèi)容,把形參定義為常量的引用。

注意:如果函數(shù)無需改變引用形參的值,最好將其聲明為常量引用。


使用引用形參返回額外信息

如果我們想一個函數(shù)返回多個參數(shù),可以使用引用形參。

如果我們想記錄一個string某個字符第一次出現(xiàn)的位置并且直到他出現(xiàn)了多少次。

const形參和實參

這里我們復(fù)習(xí)一下

用實參初始化形參的時候形參會忽略頂層const,當(dāng)形參有頂層const時,傳給他常量對象或者非常量對象都是可以的。

fcn可以讀取i的值,但是不能向i寫值,同時調(diào)用fcn時,既可以傳int也可以傳const int。

因為頂層const被忽略掉,所以上面兩個fcn傳入的參數(shù)可以完全一樣,因此第二個fcn是錯誤的。


指針或引用形參與const

形參的初始化方式和變量初始化是一樣的,我們可以使用非常量初始化一個底層const,凡是反過來不行。

要想調(diào)用引用版本的reset,只能使用int類型對象,而不能使用字面值,求值結(jié)果為int表達(dá)式、需要轉(zhuǎn)換的對象或者const int類型對象。要想調(diào)用指針版本的reset只能用int*。

如果函數(shù)的參數(shù)是常量引用,那么允許我們用字面值去初始化。


盡量使用常量引用

把函數(shù)不會改變的形參定義成普通引用會帶給調(diào)用者一種誤導(dǎo),即函數(shù)可以修改他的實參的值。此外使用引用而非常量引用也會極大的限制函數(shù)所能接受的參數(shù)類型。就像我們剛才說的,我們不能把const對象、字面值或者需要類型轉(zhuǎn)換的對象傳遞給普通引用形參。

錯誤!

還有一種難以覺察的錯誤

如果其他函數(shù)中定義了常量引用,那么這個參數(shù)在非常量定義的find_char中無法使用。

你有幾種辦法可以解決該問題。

1修改is_sentence的參數(shù)類型,這樣他們都不能接受字面值

2修改find_char的參數(shù)類型

3在is_sentence中定義一個副本,把這個副本傳給find_char



數(shù)組形參

我們不能拷貝數(shù)組,所以無法以值傳遞的方式使用數(shù)組參數(shù),因為數(shù)組會被轉(zhuǎn)換為指針,所以當(dāng)我們用函數(shù)傳遞一個數(shù)組時,實際上傳遞的時數(shù)組的首元素的指針。

這三個函數(shù)時等價的,當(dāng)編譯器處理print函數(shù)時,只檢查傳入的參數(shù)是否時const int*類型。

因為數(shù)組是以指針的形式傳遞給函數(shù)的,所以函數(shù)一開始并不知道數(shù)組的確切尺寸,管理指針形參有三種常用技術(shù)。

使用標(biāo)記指定數(shù)組長度

這種方法要求數(shù)組本身包含一個結(jié)束標(biāo)記,對于想int那樣所有取值都合法的數(shù)據(jù)就不太有效了。

使用標(biāo)準(zhǔn)庫規(guī)范

這種方法是傳遞指向數(shù)組首尾元素的指針。只要調(diào)用者能正確計算指針?biāo)傅奈恢?,上述方法就是正確的。

顯式傳遞一個數(shù)組大小的形參

只要size的值不超過數(shù)組實際大小,函數(shù)就是安全的。


數(shù)組形參和const

我們對引用的討論同樣適用于指針(也就是數(shù)組首元素的指針),只有當(dāng)確定需要改寫元素值的時候我們才定義非常量指針。


數(shù)組引用形參

我們可以定義數(shù)組的引用,所以形參也可以是數(shù)組的引用。

這一用法無形中限制了print的使用,因為只能作用于大小為10的數(shù)組,我們以后會詳細(xì)介紹如何給引用類型的形參傳遞任意大小的數(shù)組。

面對多維數(shù)組,其實也就是數(shù)組的數(shù)組,我們傳遞的也是數(shù)組首元素的指針,數(shù)組第二維的大小都是數(shù)組類型的一部分,不可忽略。

這兩種是等價定義,此時編譯器會忽略掉第一個維度,所以最好不要把他包括在形參列表內(nèi),matrix看似是一個二維數(shù)組,實際上是指向含有10個數(shù)組的指針。

注意:括號必不可少!


C++ 參數(shù)傳遞的評論 (共 條)

分享到微博請遵守國家法律
扬州市| 嘉义县| 门头沟区| 黄浦区| 志丹县| 夹江县| 长武县| 探索| 芒康县| 长治县| 五河县| 共和县| 云浮市| 宣化县| 邵阳县| 尚义县| 五家渠市| 义乌市| 青冈县| 上饶市| 岚皋县| 娄烦县| 临安市| 大方县| 台北县| 玉屏| 黄骅市| 噶尔县| 图们市| 双江| 延边| 河东区| 南漳县| 西峡县| 黑河市| 孟村| 长沙县| 监利县| 古交市| 深圳市| 调兵山市|