C/C++編程筆記:C++入門知識(shí)丨函數(shù)和函數(shù)模板
本篇要學(xué)習(xí)的內(nèi)容和知識(shí)結(jié)構(gòu)概覽

函數(shù)的參數(shù)及其傳遞方式
1. 函數(shù)參數(shù)傳遞方式
傳值:
? ? 傳變量值: 將實(shí)參內(nèi)存中的內(nèi)容拷貝一份給形參, 兩者是不同的兩塊內(nèi)存
? ? 傳地址值: 將實(shí)參所對(duì)應(yīng)的內(nèi)存空間的地址值給形參, 形參是一個(gè)指針, 指向?qū)崊⑺鶎?duì)應(yīng)的內(nèi)存空間
傳引用:
? ? 形參是對(duì)實(shí)參的引用, 形參和實(shí)參是同一塊內(nèi)存空間
2. 對(duì)象作為函數(shù)參數(shù), 也就是傳變量值
將實(shí)參對(duì)象的值傳遞給形參對(duì)象, 形參是實(shí)參的備份, 當(dāng)在函數(shù)中改變形參的值時(shí), 改變的是這個(gè)備份中的值, 不影響原來(lái)的值
像這樣:

3. 對(duì)象指針作為函數(shù)參數(shù), 也就是傳地址值
形參是對(duì)象指針, 實(shí)參是對(duì)象的地址值, 雖然參數(shù)傳遞方式仍然是傳值方式, 因?yàn)樾螀⒑蛯?shí)參的地址值一樣, 所以它們都指向同一塊內(nèi)存, 我們通過(guò)指針更改所指向的內(nèi)存中的內(nèi)容, 所以當(dāng)在函數(shù)中通過(guò)形參改變內(nèi)存中的值時(shí), 改變的就是原來(lái)實(shí)參的值
像這樣:

對(duì)于數(shù)組, 因數(shù)組名就是代表的數(shù)組首地址, 所以數(shù)組也能用傳數(shù)組地址值的方式

4. 引用作為函數(shù)參數(shù), 也就是傳地址(注意: 這里不是地址值)
在函數(shù)調(diào)用時(shí), 實(shí)參對(duì)象名傳給形參對(duì)象名, 形參對(duì)象名就成為實(shí)參對(duì)象名的別名. 實(shí)參對(duì)象和形參對(duì)象代表同一個(gè)對(duì)象, 所以改變形參對(duì)象的值就是改變實(shí)參對(duì)象的值
像這樣:

優(yōu)點(diǎn):?引用對(duì)象不是一個(gè)獨(dú)立的對(duì)象,不單獨(dú)占內(nèi)存單元, 而對(duì)象指針要另外開辟內(nèi)存單元(內(nèi)存中放實(shí)參傳過(guò)來(lái)的地址),所以傳引用比傳指針更好用。
5. 默認(rèn)參數(shù)
不要求程序在調(diào)用時(shí)必須設(shè)定該參數(shù), 而由編譯器在需要時(shí)給該參數(shù)賦默認(rèn)值.?
規(guī)則1:當(dāng)程序需要傳遞特定值時(shí)需要顯式的指明. 默認(rèn)參數(shù)必須在函數(shù)原型中說(shuō)明.
如果函數(shù)在main函數(shù)后面定義, 而在聲明中設(shè)置默認(rèn)參數(shù), 在定義中不需要設(shè)置默認(rèn)參數(shù)
像這樣:

如果函數(shù)在main函數(shù)前面定義, 則在定義中設(shè)置默認(rèn)參數(shù)
像這樣:

規(guī)則2:默認(rèn)參數(shù)可以多于一個(gè),但必須放在參數(shù)序列的后部。
像這樣:
可以有一個(gè)默認(rèn)參數(shù):void PrintValue(int a, int b, int c = 0);
可以是有多個(gè)默認(rèn)參數(shù):void PrintValue(int a, int b = 0, int c = 0);
不可以在中間設(shè)置默認(rèn)參數(shù):void PrintValue(int a, int b = 0, int c);
規(guī)則3:如果一個(gè)默認(rèn)參數(shù)需要指定一個(gè)特定值時(shí),則在此之前的所有參數(shù)都必須賦值

6. 使用const保護(hù)數(shù)據(jù)
用const修飾要傳遞的參數(shù), 該函數(shù)只能使用參數(shù), 而無(wú)權(quán)修改參數(shù), 以提高系統(tǒng)的自身安全.
像這樣:

函數(shù)返回值
C++函數(shù)返回值類型可以是除數(shù)組和函數(shù)以外的任何類型
當(dāng)返回值是指針或引用對(duì)象時(shí), 需要注意函數(shù)返回值所指的對(duì)象必須存在, 因此不能將函數(shù)內(nèi)部的局部對(duì)象作為函數(shù)返回值, 因?yàn)楹瘮?shù)內(nèi), 局部變量或者對(duì)象在函數(shù)運(yùn)行完畢后內(nèi)存就釋放啦
1. 返回引用的函數(shù)
函數(shù)可以返回一個(gè)引用, 目的是為了讓該函數(shù)位于賦值運(yùn)算符的左邊
格式: 數(shù)據(jù)類型 & 函數(shù)名(參數(shù)列表);
像這樣:

2. 返回指針的函數(shù)
返回值是存儲(chǔ)某種數(shù)據(jù)類型數(shù)據(jù)的內(nèi)存地址, 這種函數(shù)稱為指針函數(shù)
格式: 數(shù)據(jù)類型 * 函數(shù)名(參數(shù)列表);
像這樣:

3. 返回對(duì)象的函數(shù)
格式: 數(shù)據(jù)類型 函數(shù)名(參數(shù)列表);
像這樣:

4. 函數(shù)返回值作為函數(shù)參數(shù)
如果函數(shù)返回值作為另一個(gè)函數(shù)的參數(shù), 那么這個(gè)返回值必須與另一個(gè)函數(shù)的參數(shù)類型一致
像這樣:

內(nèi)聯(lián)函數(shù)
1. 內(nèi)聯(lián)函數(shù)的概念
使用關(guān)鍵字inline聲明的函數(shù)稱為內(nèi)聯(lián)函數(shù), 內(nèi)聯(lián)函數(shù)必須在程序中第一次調(diào)用此函數(shù)的語(yǔ)句出現(xiàn)之前定義, 這樣編譯器才知道內(nèi)聯(lián)函數(shù)的函數(shù)休, 然后進(jìn)行替換
像這樣:

2. 注意
在C++中, 除具有循環(huán)語(yǔ)句, switch語(yǔ)句的函數(shù)不能說(shuō)明為內(nèi)聯(lián)函數(shù)外, 其它函數(shù)都可以說(shuō)明為內(nèi)聯(lián)函數(shù).
3. 作用
使用內(nèi)聯(lián)函數(shù)可以提高程序執(zhí)行速度, 但如果函數(shù)體語(yǔ)句多, 則會(huì)增加程序代碼量.
函數(shù)重載和默認(rèn)參數(shù)
1. 函數(shù)重載
一個(gè)函數(shù)名具有多種功能, 具有多種形態(tài), 稱這種我為多態(tài)性, 一個(gè)名字, 多個(gè)函數(shù)
函數(shù)重載要滿足的條件:
參數(shù)類型不同或者參數(shù)個(gè)數(shù)不同
像這樣:

2. 函數(shù)重載與默認(rèn)參數(shù)
當(dāng)函數(shù)重載與默認(rèn)參數(shù)相結(jié)合時(shí), 能夠有效減少函數(shù)個(gè)數(shù)及形態(tài), 縮減代碼規(guī)模.
這樣我們每種數(shù)據(jù)類型只保留一個(gè)函數(shù)即可完成我們的功能, 直接少了兩個(gè)函數(shù).
像這樣:

如果使用默認(rèn)參數(shù), 就不能對(duì)參數(shù)個(gè)數(shù)少于默認(rèn)個(gè)數(shù)的函數(shù)形態(tài)進(jìn)行重載, 只能對(duì)于多于默認(rèn)參數(shù)個(gè)數(shù)的函數(shù)形態(tài)進(jìn)行重載.
像這樣:

函數(shù)模板
從而上面可以看出, 它們是邏輯功能完全一樣的函數(shù), 所提供的函數(shù)體也一樣, 區(qū)別僅僅是數(shù)據(jù)類型不同, 為了統(tǒng)一的處理它們, 引入了函數(shù)模板.?
現(xiàn)在我們的函數(shù)從4個(gè)縮減成一個(gè), 但是我們的功能沒有減少, 反而增加了. 比如我們可以計(jì)算char, float類型
1. 什么是函數(shù)模板
在程序設(shè)計(jì)時(shí)沒有使用實(shí)際存在的類型, 而是使用虛擬的參數(shù)參數(shù), 故其靈活性得到加強(qiáng).
當(dāng)用實(shí)際的類型來(lái)實(shí)例化這種函數(shù)時(shí), 就好像按照模板來(lái)制造新的函數(shù)一樣, 所以稱為函數(shù)模板
格式:?一般用T來(lái)標(biāo)識(shí)類型參數(shù), 也可以用其它的
Template <class T>?
像這樣:

當(dāng)用用函數(shù)模板與具體的數(shù)據(jù)類型連用時(shí), 就產(chǎn)生了模板函數(shù), 又稱為函數(shù)模板實(shí)例化
2. 函數(shù)模板的參數(shù)
函數(shù)模板名<模板參數(shù)>(參數(shù)列表);
我們可以將參數(shù)列表的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換為指定的數(shù)據(jù)類型
像這樣:int sumValue2 = sumWithValue<int>(3.2, 5.1);
我們將參數(shù)列表里的數(shù)據(jù)強(qiáng)制轉(zhuǎn)換為int類型, 再參與計(jì)算
也可以樣:double sumValue2 = sumWithValue(3.2, (double)5);
我們也可以將參數(shù)列表里的單個(gè)參數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換, 再參與計(jì)算
不過(guò)我們一般不會(huì)加上模板參數(shù).
3. 使用關(guān)鍵字typename
用途就是代替template參數(shù)列表中的關(guān)鍵字class
像這樣
template <typename T>
只是將class替換為typename, 其它一樣使用.
強(qiáng)烈建議大家使用typename, 因?yàn)樗褪菫槟0宸?wù)的, 而class是在typename出現(xiàn)之前使用的, 它還有定義類的作用, 不直觀, 也會(huì)在一些其它地方編譯時(shí)報(bào)錯(cuò).
總結(jié):
可能對(duì)于初學(xué)者來(lái)說(shuō), 函數(shù)有點(diǎn)不是很好理解, 包括我當(dāng)初也是, 不要想得過(guò)于復(fù)雜, 其實(shí)它就是一段有特定功能的代碼, 只不過(guò)我們給這段代碼起了個(gè)名字而已, 這樣就會(huì)提高代碼的可讀性和易維護(hù)性。
自學(xué)C/C++編程難度很大,不妨和一些志同道合的小伙伴一起學(xué)習(xí)成長(zhǎng)!

另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~