溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中的函數(shù)概念有哪些

發(fā)布時間:2022-04-11 10:26:49 來源:億速云 閱讀:193 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“C++中的函數(shù)概念有哪些”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++中的函數(shù)概念有哪些”文章能幫助大家解決問題。

(一)函數(shù)使用規(guī)則

  1. 函數(shù)的定義不能嵌套但調(diào)用可以嵌套

  2. 在函數(shù)調(diào)用時,如某一默認參數(shù)要指明一個特定值,則有其之前所有參數(shù)都必須賦值

  3. 賦默認實參時 一旦某個形參被賦予了默認值,它后面的所有形參都必須有默認值,因為設(shè)置默認參數(shù)的順序是自右向左;且注意默認值不可以是局部變量

  4. 函數(shù)參數(shù)的默認值可以是表達式

  5. 如果在函數(shù)定義時設(shè)置了默認參數(shù),則就不能在函數(shù)聲明時再次設(shè)置,反之亦然

  6. 函數(shù)只有一個 返回值,除void類型函數(shù)

  7. 函數(shù)調(diào)用可以出現(xiàn)在執(zhí)行語句中,也可以出現(xiàn)在表達式中,甚至還可以作為一個函數(shù)的實參,但不可作為函數(shù)的形參,因為函數(shù)返回值存在寄存器中, 沒有地址, 不能作為形參

  8. 函數(shù)是一種特殊的數(shù)據(jù)類型,正確

  9. 當函數(shù)不是void類型且函數(shù)體內(nèi)沒有return語句時,此時函數(shù)的返回值與返回類型相同但內(nèi)容卻是隨機的一個值

  10. C++所有的函數(shù)本質(zhì)上都是外部函數(shù)(可延申至其他文件中使用),故extern關(guān)鍵字可省略

  11. 如果函數(shù)的形參是指向普通變量的指針變量,實參只能用指向普通變量的指針,不能用指向const變量的指針,反之則都可以用

  12. 當函數(shù)自變量個數(shù)不確定時,系統(tǒng)不自動檢測自變量

13. 函數(shù)三種傳參:

① 值傳遞:會為形參重新分配內(nèi)存空間 ,將實參的值拷貝給形參,形參的改變不會影響實參的值,函數(shù)被調(diào)用結(jié)束后,形參被釋放。

② 地址的傳遞:形參為指針變量,將實參的地址傳遞給函數(shù),可以在函數(shù)中改變實參的值。調(diào)用時為形參指針變量分配內(nèi)存,結(jié)束時釋放指針變量。

③ 引用傳遞:不會為形參重新分配內(nèi)存空間,形參只是實參的別名,形參的改變只會影響實參的值,函數(shù)調(diào)用結(jié)束后,形參不會被釋放。

(二)函數(shù)的使用

  • 建立自定義函數(shù),調(diào)用時只需要明白函數(shù)的功能即可,故提高了程序的可讀性

  • sizeof 返回的值表示的含義如下(單位字節(jié)):

數(shù)組 —— 編譯時分配的數(shù)組空間大??;
指針 —— 存儲該指針所用的空間大?。ù鎯υ撝羔樀牡刂返拈L度,是長整型,應(yīng)該為 4 );
類型 —— 該類型所占的空間大??;
對象 —— 對象的實際占用空間大小;

函數(shù) —— 函數(shù)的返回類型所占的空間大小。函數(shù)的返回類型不能是 void

  • sizeof(float)是(整型)類型表達式

  • Math.floor() 表示向下取整,返回double類型

Math.ceil() 表示向上取整,返回double類型

Math.round() 四舍五入,返回int類型

  • 用戶可以重載(不能重定義)標準庫函數(shù),若如此,該函數(shù)將失去原有含義;但若已包含標準庫頭文件及相關(guān)命名空間,則系統(tǒng)不允許用戶重新定義標準庫函數(shù),因為兩個相同作用域內(nèi)的函數(shù) 如果除了返回值類型外 的函數(shù)要素都相同 那么編譯器會報重定義錯誤

  • 函數(shù)返回值作為右值,被const修飾無效,故此時const相當于沒修飾

  • 如果參數(shù)類型不一致,則函數(shù)調(diào)用時按形參類型隱式類型轉(zhuǎn)換實參

  • main函數(shù)默認返回一個int類型的值

  • 將一個字符串傳遞到函數(shù)中,傳遞的是地址,則函數(shù)形參既可以用字符數(shù)組,又可以用指針變量

  • 函數(shù)的返回值可以是引用類型且函數(shù)返回引用可以作為左值

  • 函數(shù)的返回類型可以是結(jié)構(gòu)體類型,這時函數(shù)將返回一個結(jié)構(gòu)體對象

  • 所有的函數(shù)在定義它的程序中都是可見的

(三)預(yù)處理命令(包括宏定義)

  • 預(yù)處理命令行不能以分號結(jié)尾

  • 預(yù)處理命令行可以出現(xiàn)在程序的最后一行

  • 預(yù)處理命令行作用域是從出現(xiàn)位置開始到源程序文件末尾

  • 凡是以#號開頭的行,不一定都為編譯預(yù)處理命令行

  • 在源文件的一行上不可以有多條預(yù)處理命令

  • 預(yù)處理不做語法檢查

  • C++在編譯前由預(yù)處理器對預(yù)處理命令進行處理(故在編譯前被執(zhí)行),編譯時進行語法分析

  • 宏替換不占用程序的運行時間,只占編譯時間

(四)內(nèi)聯(lián)函數(shù)與宏的區(qū)別

  • 內(nèi)聯(lián)函數(shù)在運行時可調(diào)試,而宏定義不可以;

  • 編譯器會對內(nèi)聯(lián)函數(shù)的參數(shù)類型做安全檢查或自動類型轉(zhuǎn)換(同普通函數(shù)),而宏定義則不會;

  • 內(nèi)聯(lián)函數(shù)可以訪問類的成員變量,宏定義則不能;

  • 在類中聲明同時定義的成員函數(shù),自動轉(zhuǎn)化為內(nèi)聯(lián)函數(shù)。

(五)函數(shù)與宏的區(qū)別

  • 宏做的是簡單的字符串替換(注意是字符串的替換,不是其他類型參數(shù)的替換),而函數(shù)的參數(shù)的傳遞,參數(shù)是有數(shù)據(jù)類型的,可以是各種各樣的類型.

  • 宏的參數(shù)替換是不經(jīng)計算而直接處理的,而函數(shù)調(diào)用是將實參的值傳遞給形參,既然說是值,自然是計算得來的.

  • 宏在編譯之前進行,即先用宏體替換宏名,然后再編譯的,而函數(shù)顯然是編譯之后,在執(zhí)行時,才調(diào)用的.因此,宏占用的是編譯的時間,而函數(shù)占用的是執(zhí)行時的時間.

  • 宏的參數(shù)是不占內(nèi)存空間的,因為只是做字符串的替換,而函數(shù)調(diào)用時的參數(shù)傳遞則是具體變量之間的信息傳遞,形參作為函數(shù)的局部變量,顯然是占用內(nèi)存的.

  • 函數(shù)的調(diào)用是需要付出一定的時空開銷的,因為系統(tǒng)在調(diào)用函數(shù)時,要保留現(xiàn)場,然后轉(zhuǎn)入被調(diào)用函數(shù)去執(zhí)行,調(diào)用完,再返回主調(diào)函數(shù),此時再恢復(fù)現(xiàn)場,這些操作,顯然在宏中是沒有的.

  • 宏替換不占用程序的運行時間

  • 宏與類型無關(guān),但是c++中函數(shù)必須指定返回類型,故宏可以做函數(shù)不能做的事

(六)函數(shù)模板

1.函數(shù)模板的格式如下:

Template <class 形參名,class 形參名,......> 返回類型函數(shù)名(參數(shù)列表){函數(shù)體}

其中,class可以用typename關(guān)鍵字代替

  • 函數(shù)模板調(diào)用時不需要顯式指定類型,系統(tǒng)自動匹配參數(shù)類型,若沒有合適的,會進行報錯。而類模板使用需要顯式指定類型,且對于函數(shù)模板注意要返回值和參數(shù)的類型一致

  • 模板函數(shù)和普通函數(shù)都符合條件時,優(yōu)先執(zhí)行普通函數(shù)

  • 模板特化:(當函數(shù)模板需要對某些類型進行特化處理,稱為函數(shù)模板的特化,類模板的特化同理)

① 因為很多時候,我們既需要一個模板能應(yīng)對各種情形,又需要它對于某個特定的類型有著特別的處理,故出現(xiàn)了模板特化

① 特化整體上分為全特化和偏特化

② 全特化:就是模板中模板參數(shù)全被指定為確定的類型。 全特化也就是定義了一個全新的類型,全特化的類中的函數(shù)可以與模板類不一樣

③ 偏特化:模板中的模板參數(shù)沒有被全部確定,需要編譯器在編譯時進行確定

④ 對主版本模板類、全特化類、偏特化類的調(diào)用優(yōu)先級從高到低進行排序是:全特化類>偏特化類>主版本模板類

⑤ 當函數(shù)調(diào)用發(fā)現(xiàn)有特化后的匹配函數(shù)時,會優(yōu)先調(diào)用特化的函數(shù),而不再通過函數(shù)模版來進行實例化

⑥ 模板特化相當于在聲明了類模板等后聲明需要模板特化然后讓接下來的代碼自己使用一個類型,故不能單獨使用,例;![img](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps386C.tmp.jpg)

5. 模板特化實現(xiàn):template<> + 完全和模板類型沒有一點關(guān)系的類實現(xiàn)或者函數(shù)定義;

① 特化為絕對類型(全特化):例:template<>class Compare{...}; // 特化為float類型,此為函數(shù)模板特化;函數(shù)模板只能全特化,沒有偏特化

② 特化為引用,指針類型(半特化、偏特化):例:template struct iterator_traits<_Tp*> {};

③ 特化為另外一個類模板(偏特化):例:template class Compare<vector>{};

  • 類模板的成員函數(shù)都是函數(shù)模板;沒使用過的成員函數(shù)(即函數(shù)模板)不會被實例化

  • 函數(shù)模板必須由程序員實例化為可執(zhí)行的函數(shù)

  • 函數(shù)模板的虛擬類型名是在編譯階段確定實際類型的

(七)函數(shù)重載

  • 使用重載函數(shù)編程序的目的是:使用相同的函數(shù)名調(diào)用功能相似的函數(shù);使用方便,提高可讀性

  • 重載函數(shù)的形參(個數(shù)或類型)必須不同

  • void x(int,char ch=&rsquo;a&rsquo;)與void x(int)可以在同一程序中定義,但不可以重載

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

1. 內(nèi)聯(lián)(置)函數(shù)inline:

引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題;程序在編譯器編譯的時候,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達式用內(nèi)聯(lián)函數(shù)的函數(shù)體進行替換,而對于其他的函數(shù),都是在運行時候才被替代。這其實就是個空間代價換時間的節(jié)?。ū祝捍a被多次復(fù)制,增加了代碼量,占用更多的內(nèi)存空間),故在當函數(shù)代碼較小并且被頻繁調(diào)用的時候。在使用內(nèi)聯(lián)函數(shù)時要留神:

① 使用基類指針或引用來調(diào)用虛函數(shù)時,它都不能為內(nèi)聯(lián)函數(shù)(因為調(diào)用發(fā)生在運行時)。但是,使用類的對象(不是指針或引用)來調(diào)用時,可以當做是內(nèi)聯(lián),因為編譯器在編譯時確切知道對象是哪個類的

② 默認情況下,在類體中定義的成員函數(shù)若不包括循環(huán)等控制結(jié)構(gòu),符合內(nèi)聯(lián)函數(shù)要求時,C++會自動將它們作為內(nèi)聯(lián)函數(shù)處理(不是所有成員函數(shù)都是內(nèi)聯(lián)函數(shù))

③ 內(nèi)聯(lián)函數(shù)在編譯時是將該函數(shù)的目標代碼插入每個調(diào)用該函數(shù)的地方,不是運行時

④ 內(nèi)聯(lián)函數(shù)在編譯時做參數(shù)類型檢查

⑤ 在內(nèi)聯(lián)函數(shù)中不允許使用循環(huán)語句(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ù)定義放在同一頭文件中,否則編譯時無法進行置換

⑩ 頭文件中不僅要包含 inline 函數(shù)的聲明,而且必須包含定義,且在定義時必須加上 inline

? 不管是 class 聲明中定義的 inline 函數(shù),還是 class 實現(xiàn)中定義的 inline 函數(shù),不存在優(yōu)先不優(yōu)先的問題

? 內(nèi)置函數(shù)不需要使用堆棧進行現(xiàn)場的保護與恢復(fù)

? 用 inline 修飾的函數(shù)原型其對應(yīng)的函數(shù)也將成為內(nèi)聯(lián)函數(shù) - 錯(自己理解:inline為建議型關(guān)鍵字)

? 內(nèi)聯(lián)函數(shù)可以是靜態(tài)的

關(guān)于“C++中的函數(shù)概念有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)
AI