《c++primer》ch6 函數(shù)

涉及到函數(shù)之后厉颤,我認(rèn)為已經(jīng)是基礎(chǔ)的較后面的部分绩鸣,因?yàn)檫@開始慢慢涉及到了一門語言的思想觀念怀大,設(shè)計(jì)的想法,以及對(duì)編程人員的要求呀闻。所以這些部分不知道要知道怎么用化借,更要知道為什么會(huì)這樣。當(dāng)然第一遍看的時(shí)候捡多,也沒有多少編程經(jīng)驗(yàn)蓖康,可能無法有更多的想法,只能跟著書里慢慢理解了垒手。

6.1 函數(shù)基礎(chǔ)

形參和實(shí)參:

實(shí)參是形參的初始值蒜焊,函數(shù)的形參列表可以為空。
局部靜態(tài)對(duì)象科贬,定義成static類型泳梆,在程序的執(zhí)行路徑第一次經(jīng)過對(duì)象定義語句時(shí)初始化,并且知道程序終止才被銷毀榜掌,在此期間即使對(duì)象所在的函數(shù)結(jié)束執(zhí)行也不會(huì)對(duì)它有影響优妙。

6.2 參數(shù)傳遞

如果形參是引用類型,它將綁定到對(duì)應(yīng)的實(shí)參上唐责,稱為引用傳遞鳞溉;否則,將實(shí)參的值拷貝后賦給形參鼠哥,稱為值傳遞熟菲。

6.2.1 傳值參數(shù)

將實(shí)參的值拷貝給形參看政。當(dāng)是指針形參時(shí),指針的行為和其他非引用類型一樣抄罕,執(zhí)行指針拷貝類型時(shí)允蚣,拷貝的是指針的值〈艋撸拷貝之后是不同的指針嚷兔,但是指向的是相同的值,我們可以在函數(shù)中修改指針?biāo)笇?duì)象的值做入。在C++中冒晰,建議使用引用類型的形參替代指針。

6.2.2 傳引用參數(shù)

** 1.使用引用避免拷貝竟块。 因?yàn)橛械念愵愋褪遣荒芸截惖暮耍蛘咴诳截愐恍┐蟮念愵愋蛯?duì)象或者容器對(duì)象比較低效。
如果函數(shù)不需要改變引用參數(shù)的值浪秘,最好將其聲明為常量引用蒋情。
** 2.使用引用形參返回額外信息。
由于函數(shù)不能有多個(gè)返回值耸携,在我們需要返回多個(gè)值的時(shí)候棵癣,可以額外傳一個(gè)引用參數(shù)。
** 3.可以直接操作引用形參所引的對(duì)象夺衍。 **

6.2.3 const形參和實(shí)參

和其它初始化一樣狈谊,當(dāng)用實(shí)參初始化形參時(shí)會(huì)忽略掉頂層const。也就是刷后,形參的頂層const會(huì)被忽略掉的畴。(這個(gè)可以思考一下渊抄,我們可以通過形參的const在參數(shù)中控制是否需要改變形參尝胆,以及對(duì)應(yīng)的實(shí)參,這樣更方便我們傳參數(shù)护桦。當(dāng)然有了這個(gè)我們就不能重載有無const的兩個(gè)函數(shù)了含衔,因?yàn)闀?huì)被編譯器相同對(duì)待。)
盡量使用常量引用二庵,除了在使用的時(shí)候贪染,無法把常量引用初始化為引用(很簡(jiǎn)單的道理),另外催享,也會(huì)給調(diào)用者一種誤導(dǎo)杭隙。

6.2.4 數(shù)組形參

無法以值傳遞的方式使用數(shù)組參數(shù)。數(shù)組的特點(diǎn):不允許拷貝因妙、使用數(shù)組會(huì)將其轉(zhuǎn)化為指針痰憎。

void print(const int*);
void print(const int[]);
void print(const int[10]);  //這里的維度表示我們期望數(shù)組含有多少個(gè)元素票髓,實(shí)際不一定

關(guān)于數(shù)組長度

由于傳遞數(shù)組引用的時(shí)候,只是數(shù)組的首元素指針铣耘,所以有時(shí)候我們需要在形參定義的時(shí)候洽沟,就將數(shù)組大小傳遞給形參。這里有幾種方式蜗细。

6.2.5 mian處理命令行選項(xiàng)

當(dāng)使用argv[]中的實(shí)參時(shí)裆操,第一個(gè)實(shí)參保存的是程序名,所以應(yīng)該從第二個(gè)開始炉媒。

6.2.6 含有可變形參的函數(shù)

有時(shí)候我們預(yù)先不知道向函數(shù)傳遞幾個(gè)實(shí)參踪区。1.如果所有的實(shí)參類型相同,可以傳遞名為initializee_list的標(biāo)準(zhǔn)庫類型吊骤;2.如果實(shí)參類型不同朽缴,可以編寫一種特殊的函數(shù),也就是所謂的可變參數(shù)模板水援。

6.3 返回類型和return語句

return語句終止當(dāng)前執(zhí)行的函數(shù)密强,并將控制權(quán)返回到調(diào)用該函數(shù)的地方。
return語句不要返回局部對(duì)象的引用或引用(因?yàn)榫植繉?duì)象會(huì)在函數(shù)調(diào)用完成后刪除蜗元,會(huì)產(chǎn)生未定義的結(jié)果)或渤。
c++11新標(biāo)準(zhǔn)中函數(shù)可以返回花括號(hào)包圍的值列表,主函數(shù)main的返回值奕扣,非0的返回值由機(jī)器決定薪鹦。

6.4 函數(shù)重載

擁有頂層const不影響傳入函數(shù)的對(duì)象。另外惯豆,如果形參是某種類型的指針或引用池磁,則通過區(qū)分其指向的是常量對(duì)象還是非常量對(duì)象可以實(shí)現(xiàn)函數(shù)重載,此時(shí)的const是底層的楷兽。
不能僅僅通過函數(shù)的返回值區(qū)分兩個(gè)同名的函數(shù)

重載與作用域

一般來說地熄,將函數(shù)聲明置于局部作用域內(nèi)不是一個(gè)明智的選擇。在不同的作用域中無法重載函數(shù)名芯杀。
在c++中端考,名字查找發(fā)生在類型檢查之前。

6.5 特殊用途語言特性

大多數(shù)程序都有用的特性:默認(rèn)實(shí)參揭厚、內(nèi)聯(lián)函數(shù)却特、constexpr函數(shù)。

默認(rèn)實(shí)參

一旦某個(gè)形參賦予了默認(rèn)值筛圆,后面的所有形參必須有默認(rèn)值裂明。函數(shù)調(diào)用時(shí),實(shí)參按其位置進(jìn)行解析太援,只能省略尾部的實(shí)參闽晦。
一個(gè)函數(shù)被聲明多次的時(shí)候轰绵,在給定的作用域中一個(gè)形參只能被賦予一次默認(rèn)實(shí)參,也就是函數(shù)的后續(xù)聲明尼荆。

內(nèi)聯(lián)函數(shù)inline

將它在每個(gè)調(diào)用點(diǎn)上“內(nèi)聯(lián)的”展開左腔,一般來說用于優(yōu)化規(guī)模較小、流程直接捅儒、頻繁調(diào)用的函數(shù)液样。

constexpr函數(shù)

constexpr函數(shù)指能用于常量表達(dá)式的函數(shù)。函數(shù)的返回值及所有形參的類型都得是字面值類型巧还,并且函數(shù)體中必須有且只有一條return語句鞭莽。
編譯器把對(duì)constexpr函數(shù)的調(diào)用替換成其結(jié)果值。為了能在編譯過程中隨時(shí)展開麸祷,constexpr函數(shù)被隱式的指定 為內(nèi)聯(lián)函數(shù).
內(nèi)聯(lián)函數(shù)和constexpr函數(shù)通常定義在頭文件中.

調(diào)試幫助

assert預(yù)處理宏,以一個(gè)表達(dá)式作為條件.
我們可以使用一個(gè)#define 語句定義NDEBUG澎怒,關(guān)閉調(diào)試狀態(tài)

6.6 函數(shù)匹配

當(dāng)幾個(gè)重載函數(shù)的形參數(shù)量相等以及某些形參的類型可以由其它類型轉(zhuǎn)換得來時(shí)。

確定候選函數(shù)和可行函數(shù)

函數(shù)匹配第一步:選定本次調(diào)用對(duì)應(yīng)的重載函數(shù)集阶牍。
候選函數(shù)的兩個(gè)特征:與被調(diào)用的函數(shù)同名喷面,其聲明在調(diào)用點(diǎn)可見。
第二步考察本次調(diào)用提供的實(shí)參走孽,從候選函數(shù)中選出能被這組實(shí)參調(diào)用的函數(shù)惧辈。

實(shí)參類型轉(zhuǎn)換

確定最佳匹配的排序:

  • 1.精確匹配:實(shí)參形參類型相同,實(shí)參從數(shù)組或函數(shù)類型轉(zhuǎn)化為對(duì)應(yīng)的指針類型磕瓷,實(shí)參添加頂層const或者從實(shí)參中刪除頂層const盒齿。
  • 2.通過const轉(zhuǎn)換實(shí)現(xiàn)的匹配。
  • 3.通過類型提升實(shí)現(xiàn)的匹配困食。
  • 4.通過算術(shù)類型轉(zhuǎn)換或指針轉(zhuǎn)換實(shí)現(xiàn)的匹配边翁。
  • 5.通過類類型轉(zhuǎn)換實(shí)現(xiàn)的匹配。

6.7 函數(shù)指針

函數(shù)指針指向的是函數(shù)而非對(duì)象硕盹。和其他指針一樣符匾,函數(shù)指針指向某種特定類型。函數(shù)的類型由它的返回類型和形參類型共同決定莱睁,與函數(shù)名無關(guān)待讳。

重載函數(shù)的指針

編譯器通過指針類型決定選用哪個(gè)函數(shù),指針類型必須與重載函數(shù)中的某一個(gè)精確匹配仰剿。

函數(shù)指針形參

和數(shù)組類似,雖然不能定義函數(shù)類型的形參痴晦,但是形參可以是指向函數(shù)的指針南吮。此時(shí),形參看起來是函數(shù)類型誊酌,實(shí)際上是被當(dāng)成指針使用部凑。
可以直接把函數(shù)當(dāng)成實(shí)參使用露乏,會(huì)自動(dòng)轉(zhuǎn)換成指針。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涂邀,一起剝皮案震驚了整個(gè)濱河市瘟仿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比勉,老刑警劉巖劳较,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浩聋,居然都是意外死亡观蜗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門衣洁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墓捻,“玉大人,你說我怎么就攤上這事坊夫∽┑冢” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵环凿,是天一觀的道長厂画。 經(jīng)常有香客問我,道長拷邢,這世上最難降的妖魔是什么袱院? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮瞭稼,結(jié)果婚禮上忽洛,老公的妹妹穿的比我還像新娘。我一直安慰自己环肘,他們只是感情好欲虚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悔雹,像睡著了一般复哆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腌零,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天梯找,我揣著相機(jī)與錄音,去河邊找鬼益涧。 笑死锈锤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播久免,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼浅辙,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了阎姥?” 一聲冷哼從身側(cè)響起记舆,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呼巴,沒想到半個(gè)月后泽腮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伊磺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盛正,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屑埋。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豪筝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摘能,到底是詐尸還是另有隱情续崖,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布团搞,位于F島的核電站严望,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏逻恐。R本人自食惡果不足惜像吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望复隆。 院中可真熱鬧拨匆,春花似錦、人聲如沸挽拂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏栈。三九已至台腥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間绒北,已是汗流浹背黎侈。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镇饮,地道東北人蜓竹。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓箕母,卻偏偏與公主長得像储藐,于是被迫代替她去往敵國和親俱济。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 總體上必須清楚的:1)程序結(jié)構(gòu)是三種: 順序結(jié)構(gòu) , 循環(huán)結(jié)構(gòu)(三個(gè)循環(huán)結(jié)構(gòu)), 選擇結(jié)構(gòu)(if 和 switch...
    靜熙老師哈哈哈閱讀 806評(píng)論 1 20
  • 307钙勃、setValue:forKey和setObject:forKey的區(qū)別是什么蛛碌? 答:1, setObjec...
    AlanGe閱讀 1,532評(píng)論 0 1
  • 收集非原創(chuàng)文章,如遇原作者辖源,請(qǐng)私聊我蔚携,我會(huì)表明出處! 1--10 1. C++中什么數(shù)據(jù)分配在椏巳模或堆酝蜒,靜態(tài)存儲(chǔ)區(qū)以...
    Juinjonn閱讀 4,939評(píng)論 0 30
  • (這篇就是結(jié)局了,最后說兩句矾湃,感謝編輯的推薦亡脑,這么一篇拙作居然也上了首頁,實(shí)在心中有愧邀跃。無論如何霉咨,感謝堅(jiān)持看完的讀...
    紙上人生閱讀 9,684評(píng)論 3 3