C++?函數(shù)的介紹
一、基礎(chǔ)
函數(shù):封裝了一段代碼,可以在一次執(zhí)行過程中被反復(fù)調(diào)用,包含函數(shù)頭和函數(shù)體;
函數(shù)頭:
- 函數(shù)名稱(標(biāo)識符),用于后續(xù)的調(diào)用;
- 形式參數(shù),代表函數(shù)的輸入?yún)?shù);
- 返回類型,函數(shù)執(zhí)行完成后返回結(jié)果的類型;
函數(shù)體:一個語句塊(block
),包含具體的計(jì)算邏輯;
函數(shù)的聲明與定義:
- 函數(shù)聲明只包含函數(shù)頭,不包含函數(shù)體,通常在頭文件中;
- 函數(shù)聲明可以出現(xiàn)多次,定義通常出現(xiàn)一次(也有例外);
函數(shù)調(diào)用:
- 需要提供函數(shù)名與實(shí)際參數(shù);
- 實(shí)際參數(shù)拷貝初始化給形式參數(shù);
- 返回值會拷貝給函數(shù)的調(diào)用者;
- 棧幀結(jié)構(gòu)(可自行了解下);
二、參數(shù)
對于非模板函數(shù)來說,其每個形參都有確定的類型,但形參可以沒有名稱;
實(shí)參到形參的拷貝順序是不確定的;
函數(shù)的形參的傳遞一般分為:傳值、傳址、傳引用;
變長參數(shù)的定義:
1、使用initializer_list傳遞
#include <initializer_list> void fun(std::initializer_list<int> a){} int main { fun({1, 2, 3, 4}) }
注意:該方法只能傳遞類型相同的變長參數(shù);
- 可變長度模板參數(shù)
- 使用省略號表示形式參數(shù)(一般不使用)
函數(shù)的缺省實(shí)參注意點(diǎn):
1、如果某個形參具有缺省參數(shù),那么它右側(cè)的形參都必須具有缺省實(shí)參;
void fun(int x=1, int y=2){} // 這里y必須給定缺省值
2、具有缺省實(shí)參的函數(shù)調(diào)用時(shí),傳入實(shí)參按照從左到右的順序進(jìn)行匹配;
3、在一個翻譯單元中,每個形參的缺省實(shí)參只能定義一次;
4、缺省實(shí)參為對象時(shí),實(shí)參的缺省值會隨對象值的變化而變化;
main函數(shù)的版本:
- 無形參版本(一般使用)
- 帶形參版本
int main(int argc, char *argv[]) {}
argc
是非負(fù)數(shù),表述傳入?yún)?shù)個數(shù),argv是一個指針指向傳輸參數(shù)的數(shù)組頭。
三、返回類型
返回類型的幾種書寫方式:
經(jīng)典方法:位于函數(shù)頭的前部,也是最常規(guī)的寫法;
C++11引入的方式:位于函數(shù)頭的尾部;
auto fun(int x) -> int { return x*2; }
C++14引入的方式:返回類型的自動推導(dǎo);
auto fun(int a) { return a; // 會根據(jù)return語句進(jìn)行推導(dǎo) }
四、函數(shù)重載與解析
函數(shù)重載:使用相同的函數(shù)名定義多個函數(shù),每個函數(shù)具有不同的參數(shù)列表;
注意:不能基于不同的返回類型進(jìn)行重載;
名稱查找:
- 分為限定查找和非限定查找:有無限定在某個作用域中;
- 非限定查找會進(jìn)行域的逐級查找——名稱隱藏;
- 查找通常只會在已聲明的名稱集合中進(jìn)行;
重載解析:在名稱查找的基礎(chǔ)上進(jìn)一步選擇合適的調(diào)用函數(shù);
- 過濾不能被調(diào)用的版本:參數(shù)個數(shù)不對、無法將實(shí)參轉(zhuǎn)為形參、實(shí)參不滿足形參的限制條件;
五、內(nèi)聯(lián)函數(shù)
定義:將比較簡單的函數(shù)邏輯展開到調(diào)用函數(shù)的部分,避免棧幀銷毀,提升性能;
關(guān)鍵字:inline
,如果一個函數(shù)在多個翻譯單元展開,加入這個關(guān)鍵字可以避免重復(fù)定義;
1.constexpr函數(shù)
定義:之前有介紹常量表達(dá)式時(shí)用到了該關(guān)鍵字,現(xiàn)在對于函數(shù)也可以用該關(guān)鍵字;
作用:使得函數(shù)在編譯器被執(zhí)行,當(dāng)然在有變量情況下也可在運(yùn)行期執(zhí)行;
constexpr int fun(int x){ // int y; std::cin >> y; 會報(bào)錯,該語句需要用戶傳入?yún)?shù),只能在運(yùn)行期執(zhí)行 return x * 2; } int main { constexpr int x = fun(2); // 編譯器會翻譯成 move eax 4, 去掉constexpr也可以 return x; }
注意:constexpr
函數(shù)中的語句必須是可以在編譯器執(zhí)行的語句;
拓展:關(guān)鍵字consteval
(C++20引入),函數(shù)只能在編譯器執(zhí)行;
六、函數(shù)指針
作用:可以用于高階函數(shù)中,將函數(shù)指針作為參數(shù);
代碼案例:
int add(x) { return x + 1}; using T = int(int); int fun(K* F, int x) { int tmp = (*F)(x); return tmp * 2; } int main { std::cout << fun(&add, 50) << std::endl; }
說明:這就是用函數(shù)指針定義的一個高階函數(shù),在之后的很多高階函數(shù)、泛型算法中也是這樣的用法;
注意:當(dāng)函數(shù)對象進(jìn)行賦值或者返回值時(shí),返回的是一個函數(shù)指針類型的對象;
七、思考
1、我們常常會見到如下代碼,是由什么作用?
extern "C" int fun(int x, int y) { return x + y; }
C語言對于函數(shù)是不能重載的,當(dāng)用C調(diào)用C++程序時(shí),往往找不到C++編譯后的函數(shù)名,可通過如上代碼定義一個函數(shù)為C類型函數(shù);
2、可以用別名定義一個函數(shù)類型嗎?
using X = int[3]; X a; // 這是定義了一個數(shù)組,同int a[3] using X = int(int); X fun; // 這是定義了一個int返回類型的函數(shù)
函數(shù)也是有類型的,可以用別名定義,并且函數(shù)類型不包含形參名稱,并且只能聲明,不能定義;
總結(jié):
本篇主要介紹了函數(shù)的基礎(chǔ)概念以及一些特殊的函數(shù)方法和類型。重點(diǎn)需要注意的就是函數(shù)重載以及函數(shù)指針,這個在后續(xù)的模板以及泛型編程都會用到;下一篇將討論C++中的內(nèi)存,也是最重要的一個部分。
到此這篇關(guān)于C++ 函數(shù)的介紹的文章就介紹到這了,更多相關(guān)C++函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何實(shí)現(xiàn)socket網(wǎng)絡(luò)編程的多線程
首先,學(xué)好計(jì)算機(jī)網(wǎng)絡(luò)知識真的很重要。雖然,學(xué)不好不會影響理解下面這個關(guān)于宏觀講解,但是,學(xué)好了可以自己打漁吃,學(xué)不好就只能知道眼前有魚吃卻打不到漁。在Java中網(wǎng)絡(luò)程序有2種協(xié)議:TCP和UDP,下面可以和小編一起學(xué)習(xí)下2019-05-05C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理
與java、golang等自帶垃圾回收機(jī)制的語言不同,C++并不會自動回收內(nèi)存,這往往會導(dǎo)致內(nèi)存泄漏和內(nèi)存溢出等問題,所以掌握C++中的內(nèi)存管理技巧和工具是非常重要的,本文就來和大家詳細(xì)講講2023-05-05OpenCV霍夫變換(Hough Transform)直線檢測詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV霍夫變換直線檢測的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12函數(shù)指針與指針函數(shù)的學(xué)習(xí)總結(jié)
函數(shù)指針是指向函數(shù)的指針,指針函數(shù)是指一個函數(shù)的返回值是一個指針。以下就是對函數(shù)指針與指針函數(shù)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07C++中cin.getline()和getline()函數(shù)的區(qū)別小結(jié)
這篇文章主要介紹了C++中cin.getline()和getline()函數(shù)區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03C/C++中的sizeof運(yùn)算符和size_t類型的詳解
今天小編就為大家分享一篇關(guān)于C/C++中的sizeof運(yùn)算符和size_t類型的詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10Qt利用QDrag實(shí)現(xiàn)拖拽拼圖功能詳解
QDrag類為MIME-based拖拽數(shù)據(jù)轉(zhuǎn)換提供支持。本文為大家主要介紹如何利用QDrag類實(shí)現(xiàn)拖拽拼圖功能。左邊是打散的圖,拖動到右邊進(jìn)行復(fù)現(xiàn),此外程序還支持手動拖入原圖片,感興趣的可以了解一下2022-07-07