涉及到函數(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)換成指針。