C++中的函數(shù)知識(shí)點(diǎn)大全
(一)函數(shù)使用規(guī)則
函數(shù)的定義不能嵌套但調(diào)用可以嵌套
在函數(shù)調(diào)用時(shí),如某一默認(rèn)參數(shù)要指明一個(gè)特定值,則有其之前所有參數(shù)都必須賦值
賦默認(rèn)實(shí)參時(shí) 一旦某個(gè)形參被賦予了默認(rèn)值,它后面的所有形參都必須有默認(rèn)值,因?yàn)樵O(shè)置默認(rèn)參數(shù)的順序是自右向左;且注意默認(rèn)值不可以是局部變量
函數(shù)參數(shù)的默認(rèn)值可以是表達(dá)式
如果在函數(shù)定義時(shí)設(shè)置了默認(rèn)參數(shù),則就不能在函數(shù)聲明時(shí)再次設(shè)置,反之亦然
函數(shù)只有一個(gè) 返回值,除void類型函數(shù)
函數(shù)調(diào)用可以出現(xiàn)在執(zhí)行語(yǔ)句中,也可以出現(xiàn)在表達(dá)式中,甚至還可以作為一個(gè)函數(shù)的實(shí)參,但不可作為函數(shù)的形參,因?yàn)楹瘮?shù)返回值存在寄存器中, 沒有地址, 不能作為形參
函數(shù)是一種特殊的數(shù)據(jù)類型,正確
當(dāng)函數(shù)不是void類型且函數(shù)體內(nèi)沒有return語(yǔ)句時(shí),此時(shí)函數(shù)的返回值與返回類型相同但內(nèi)容卻是隨機(jī)的一個(gè)值
C++所有的函數(shù)本質(zhì)上都是外部函數(shù)(可延申至其他文件中使用),故extern關(guān)鍵字可省略
如果函數(shù)的形參是指向普通變量的指針變量,實(shí)參只能用指向普通變量的指針,不能用指向const變量的指針,反之則都可以用
當(dāng)函數(shù)自變量個(gè)數(shù)不確定時(shí),系統(tǒng)不自動(dòng)檢測(cè)自變量
- 函數(shù)三種傳參:
① 值傳遞:會(huì)為形參重新分配內(nèi)存空間 ,將實(shí)參的值拷貝給形參,形參的改變不會(huì)影響實(shí)參的值,函數(shù)被調(diào)用結(jié)束后,形參被釋放。
② 地址的傳遞:形參為指針變量,將實(shí)參的地址傳遞給函數(shù),可以在函數(shù)中改變實(shí)參的值。調(diào)用時(shí)為形參指針變量分配內(nèi)存,結(jié)束時(shí)釋放指針變量。
③ 引用傳遞:不會(huì)為形參重新分配內(nèi)存空間,形參只是實(shí)參的別名,形參的改變只會(huì)影響實(shí)參的值,函數(shù)調(diào)用結(jié)束后,形參不會(huì)被釋放。
(二)函數(shù)的使用
建立自定義函數(shù),調(diào)用時(shí)只需要明白函數(shù)的功能即可,故提高了程序的可讀性
sizeof 返回的值表示的含義如下(單位字節(jié)):
? 數(shù)組 —— 編譯時(shí)分配的數(shù)組空間大??;
? 指針 —— 存儲(chǔ)該指針?biāo)玫目臻g大?。ù鎯?chǔ)該指針的地址的長(zhǎng)度,是長(zhǎng)整型,應(yīng)該為 4 );
? 類型 —— 該類型所占的空間大??;
? 對(duì)象 —— 對(duì)象的實(shí)際占用空間大?。?/p>
? 函數(shù) —— 函數(shù)的返回類型所占的空間大小。函數(shù)的返回類型不能是 void
sizeof(float)是(整型)類型表達(dá)式
Math.floor() 表示向下取整,返回double類型
? Math.ceil() 表示向上取整,返回double類型
? Math.round() 四舍五入,返回int類型
用戶可以重載(不能重定義)標(biāo)準(zhǔn)庫(kù)函數(shù),若如此,該函數(shù)將失去原有含義;但若已包含標(biāo)準(zhǔn)庫(kù)頭文件及相關(guān)命名空間,則系統(tǒng)不允許用戶重新定義標(biāo)準(zhǔn)庫(kù)函數(shù),因?yàn)閮蓚€(gè)相同作用域內(nèi)的函數(shù) 如果除了返回值類型外 的函數(shù)要素都相同 那么編譯器會(huì)報(bào)重定義錯(cuò)誤
函數(shù)返回值作為右值,被const修飾無(wú)效,故此時(shí)const相當(dāng)于沒修飾
如果參數(shù)類型不一致,則函數(shù)調(diào)用時(shí)按形參類型隱式類型轉(zhuǎn)換實(shí)參
main函數(shù)默認(rèn)返回一個(gè)int類型的值
將一個(gè)字符串傳遞到函數(shù)中,傳遞的是地址,則函數(shù)形參既可以用字符數(shù)組,又可以用指針變量
函數(shù)的返回值可以是引用類型且函數(shù)返回引用可以作為左值
函數(shù)的返回類型可以是結(jié)構(gòu)體類型,這時(shí)函數(shù)將返回一個(gè)結(jié)構(gòu)體對(duì)象
所有的函數(shù)在定義它的程序中都是可見的
(三)預(yù)處理命令(包括宏定義)
預(yù)處理命令行不能以分號(hào)結(jié)尾
預(yù)處理命令行可以出現(xiàn)在程序的最后一行
預(yù)處理命令行作用域是從出現(xiàn)位置開始到源程序文件末尾
凡是以#號(hào)開頭的行,不一定都為編譯預(yù)處理命令行
在源文件的一行上不可以有多條預(yù)處理命令
預(yù)處理不做語(yǔ)法檢查
C++在編譯前由預(yù)處理器對(duì)預(yù)處理命令進(jìn)行處理(故在編譯前被執(zhí)行),編譯時(shí)進(jìn)行語(yǔ)法分析
宏替換不占用程序的運(yùn)行時(shí)間,只占編譯時(shí)間
(四)內(nèi)聯(lián)函數(shù)與宏的區(qū)別
- 內(nèi)聯(lián)函數(shù)在運(yùn)行時(shí)可調(diào)試,而宏定義不可以;
- 編譯器會(huì)對(duì)內(nèi)聯(lián)函數(shù)的參數(shù)類型做安全檢查或自動(dòng)類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會(huì);
- 內(nèi)聯(lián)函數(shù)可以訪問類的成員變量,宏定義則不能;
- 在類中聲明同時(shí)定義的成員函數(shù),自動(dòng)轉(zhuǎn)化為內(nèi)聯(lián)函數(shù)。
(五)函數(shù)與宏的區(qū)別
宏做的是簡(jiǎn)單的字符串替換(注意是字符串的替換,不是其他類型參數(shù)的替換),而函數(shù)的參數(shù)的傳遞,參數(shù)是有數(shù)據(jù)類型的,可以是各種各樣的類型.
宏的參數(shù)替換是不經(jīng)計(jì)算而直接處理的,而函數(shù)調(diào)用是將實(shí)參的值傳遞給形參,既然說是值,自然是計(jì)算得來的.
宏在編譯之前進(jìn)行,即先用宏體替換宏名,然后再編譯的,而函數(shù)顯然是編譯之后,在執(zhí)行時(shí),才調(diào)用的.因此,宏占用的是編譯的時(shí)間,而函數(shù)占用的是執(zhí)行時(shí)的時(shí)間.
宏的參數(shù)是不占內(nèi)存空間的,因?yàn)橹皇亲鲎址奶鎿Q,而函數(shù)調(diào)用時(shí)的參數(shù)傳遞則是具體變量之間的信息傳遞,形參作為函數(shù)的局部變量,顯然是占用內(nèi)存的.
函數(shù)的調(diào)用是需要付出一定的時(shí)空開銷的,因?yàn)橄到y(tǒng)在調(diào)用函數(shù)時(shí),要保留現(xiàn)場(chǎng),然后轉(zhuǎn)入被調(diào)用函數(shù)去執(zhí)行,調(diào)用完,再返回主調(diào)函數(shù),此時(shí)再恢復(fù)現(xiàn)場(chǎng),這些操作,顯然在宏中是沒有的.
宏替換不占用程序的運(yùn)行時(shí)間
宏與類型無(wú)關(guān),但是c++中函數(shù)必須指定返回類型,故宏可以做函數(shù)不能做的事
(六)函數(shù)模板
1.函數(shù)模板的格式如下:
Template <class 形參名,class 形參名,......> 返回類型函數(shù)名(參數(shù)列表){函數(shù)體}
其中,class可以用typename關(guān)鍵字代替
2.函數(shù)模板調(diào)用時(shí)不需要顯式指定類型,系統(tǒng)自動(dòng)匹配參數(shù)類型,若沒有合適的,會(huì)進(jìn)行報(bào)錯(cuò)。而類模板使用需要顯式指定類型,且對(duì)于函數(shù)模板注意要返回值和參數(shù)的類型一致
3.模板函數(shù)和普通函數(shù)都符合條件時(shí),優(yōu)先執(zhí)行普通函數(shù)
4.模板特化:(當(dāng)函數(shù)模板需要對(duì)某些類型進(jìn)行特化處理,稱為函數(shù)模板的特化,類模板的特化同理)
- ① 因?yàn)楹芏鄷r(shí)候,我們既需要一個(gè)模板能應(yīng)對(duì)各種情形,又需要它對(duì)于某個(gè)特定的類型有著特別的處理,故出現(xiàn)了模板特化
- ① 特化整體上分為全特化和偏特化
- ② 全特化:就是模板中模板參數(shù)全被指定為確定的類型。 全特化也就是定義了一個(gè)全新的類型,全特化的類中的函數(shù)可以與模板類不一樣
- ③ 偏特化:模板中的模板參數(shù)沒有被全部確定,需要編譯器在編譯時(shí)進(jìn)行確定
- ④ 對(duì)主版本模板類、全特化類、偏特化類的調(diào)用優(yōu)先級(jí)從高到低進(jìn)行排序是:全特化類>偏特化類>主版本模板類
- ⑤ 當(dāng)函數(shù)調(diào)用發(fā)現(xiàn)有特化后的匹配函數(shù)時(shí),會(huì)優(yōu)先調(diào)用特化的函數(shù),而不再通過函數(shù)模版來進(jìn)行實(shí)例化
- ⑥ 模板特化相當(dāng)于在聲明了類模板等后聲明需要模板特化然后讓接下來的代碼自己使用一個(gè)類型,故不能單獨(dú)使用,例;
5. 模板特化實(shí)現(xiàn):template<> + 完全和模板類型沒有一點(diǎn)關(guān)系的類實(shí)現(xiàn)或者函數(shù)定義;
- ① 特化為絕對(duì)類型(全特化):例:template<>class Compare{...}; // 特化為float類型,此為函數(shù)模板特化;函數(shù)模板只能全特化,沒有偏特化
- ② 特化為引用,指針類型(半特化、偏特化):例:template struct iterator_traits<_Tp*> {};
- ③ 特化為另外一個(gè)類模板(偏特化):例:template class Compare<vector>{};
6. 類模板的成員函數(shù)都是函數(shù)模板;沒使用過的成員函數(shù)(即函數(shù)模板)不會(huì)被實(shí)例化
7. 函數(shù)模板必須由程序員實(shí)例化為可執(zhí)行的函數(shù)
8. 函數(shù)模板的虛擬類型名是在編譯階段確定實(shí)際類型的
(七)函數(shù)重載
使用重載函數(shù)編程序的目的是:使用相同的函數(shù)名調(diào)用功能相似的函數(shù);使用方便,提高可讀性
重載函數(shù)的形參(個(gè)數(shù)或類型)必須不同
void x(int,char ch=’a’)與void x(int)可以在同一程序中定義,但不可以重載
(八)內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)(置)函數(shù)inline:
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題;程序在編譯器編譯的時(shí)候,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體進(jìn)行替換,而對(duì)于其他的函數(shù),都是在運(yùn)行時(shí)候才被替代。這其實(shí)就是個(gè)空間代價(jià)換時(shí)間的節(jié)省(弊:代碼被多次復(fù)制,增加了代碼量,占用更多的內(nèi)存空間),故在當(dāng)函數(shù)代碼較小并且被頻繁調(diào)用的時(shí)候。在使用內(nèi)聯(lián)函數(shù)時(shí)要留神:
① 使用基類指針或引用來調(diào)用虛函數(shù)時(shí),它都不能為內(nèi)聯(lián)函數(shù)(因?yàn)檎{(diào)用發(fā)生在運(yùn)行時(shí))。但是,使用類的對(duì)象(不是指針或引用)來調(diào)用時(shí),可以當(dāng)做是內(nèi)聯(lián),因?yàn)榫幾g器在編譯時(shí)確切知道對(duì)象是哪個(gè)類的
② 默認(rèn)情況下,在類體中定義的成員函數(shù)若不包括循環(huán)等控制結(jié)構(gòu),符合內(nèi)聯(lián)函數(shù)要求時(shí),C++會(huì)自動(dòng)將它們作為內(nèi)聯(lián)函數(shù)處理(不是所有成員函數(shù)都是內(nèi)聯(lián)函數(shù))
③ 內(nèi)聯(lián)函數(shù)在編譯時(shí)是將該函數(shù)的目標(biāo)代碼插入每個(gè)調(diào)用該函數(shù)的地方,不是運(yùn)行時(shí)
④ 內(nèi)聯(lián)函數(shù)在編譯時(shí)做參數(shù)類型檢查
⑤ 在內(nèi)聯(lián)函數(shù)中不允許使用循環(huán)語(yǔ)句(for,while)和switch結(jié)果,帶有異常接口聲明的函數(shù)也不能聲明為內(nèi)聯(lián)函數(shù)。另外,遞歸函數(shù)(自己調(diào)用自己的函數(shù))是不能被用來做內(nèi)聯(lián)函數(shù)的。內(nèi)聯(lián)函數(shù)只適合于只有1~5行的小函數(shù)
⑥ 內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次調(diào)用之前
⑦ 定義內(nèi)聯(lián)函數(shù)inline寫類型前面
⑧ 關(guān)鍵字inline 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用
⑨ 如果在類外定義inline函數(shù),則必須將類定義和成員函數(shù)定義放在同一頭文件中,否則編譯時(shí)無(wú)法進(jìn)行置換
⑩ 頭文件中不僅要包含 inline 函數(shù)的聲明,而且必須包含定義,且在定義時(shí)必須加上 inline
? 不管是 class 聲明中定義的 inline 函數(shù),還是 class 實(shí)現(xiàn)中定義的 inline 函數(shù),不存在優(yōu)先不優(yōu)先的問題
? 內(nèi)置函數(shù)不需要使用堆棧進(jìn)行現(xiàn)場(chǎng)的保護(hù)與恢復(fù)
? 用 inline 修飾的函數(shù)原型其對(duì)應(yīng)的函數(shù)也將成為內(nèi)聯(lián)函數(shù) - 錯(cuò)(自己理解:inline為建議型關(guān)鍵字)
? 內(nèi)聯(lián)函數(shù)可以是靜態(tài)的
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言 sockaddr和sockaddr_in案例詳解
這篇文章主要介紹了C語(yǔ)言 sockaddr和sockaddr_in案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08重學(xué)c/c++之?dāng)?shù)據(jù)存儲(chǔ)詳解(整數(shù)、浮點(diǎn)數(shù))
C語(yǔ)言給定了一些基本的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于重學(xué)c/c++之?dāng)?shù)據(jù)存儲(chǔ)(整數(shù)、浮點(diǎn)數(shù))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11C++11標(biāo)準(zhǔn)庫(kù)bind函數(shù)應(yīng)用教程
bind函數(shù)定義在頭文件functional中,可以將bind函數(shù)看做成一個(gè)通用的函數(shù)適配器,他接收一個(gè)可調(diào)用對(duì)象,生成一個(gè)新的可調(diào)用對(duì)象來"適應(yīng)"原對(duì)象的參數(shù)列表。本文將帶大家詳細(xì)了解一下bind函數(shù)的應(yīng)用詳解2021-12-12超詳細(xì)分析C語(yǔ)言動(dòng)態(tài)內(nèi)存管理問題
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-04-04VSCode配置C/C++并添加非工作區(qū)頭文件的方法
這篇文章主要介紹了VSCode配置C/C++并添加非工作區(qū)頭文件的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03C語(yǔ)言中的sizeof操作符用法及和strlen的區(qū)別
這篇文章主要介紹了C語(yǔ)言中的sizeof操作符用法及和strlen的區(qū)別,本文講解了sizeof的定義、sizeof的語(yǔ)法以及使用實(shí)例,最后給出sizeof與strlen的區(qū)別,需要的朋友可以參考下2015-07-07