C 高階之 函式

2021-08-27 03:56:42 字數 2470 閱讀 9212

入口函式main:

main()函式是c++的入口函式,一般情況返回值為int型別(這也是c++標準的要求,所以部分嚴格的編譯器要求main返回值必須為int),和正常函式不同的是,如果main函式沒有顯式出現return,大部分編譯器會預設新增return 0而不是編譯失敗。

雖然main函式是入口函式,但並不代表一定是第乙個執行的函式。所有外部物件的建構函式、類中的靜態物件有初始化時這些物件的建構函式都會先於main函式執行。

main函式可以帶引數

main(int argc, char* argv)

函式引數的傳遞:

__cdecl 是c和c++程式預設的函式呼叫約定,引數從右到左的順序入棧,由主調函式維護堆疊(呼叫前壓入,呼叫結束後彈出)

傳遞的引數不是簡單的變數而是表示式時,需要先將表示式化簡,然後在實現函式呼叫。

(詳細過程和c沒區別,不寫了。。。)

函式引數的預設值:

c++語言允許指定函式引數的預設值。

1.最好在函式宣告時指明引數預設值,而在函式定義時加入注釋。否則分離編譯時可能出現問題。

2.不帶預設值的引數要在帶預設值引數的左邊。(防止二義性)

3.引數預設值可能會帶來函式過載的二義性。

函式呼叫:

傳值呼叫和引用呼叫,基礎型別時兩種區別不大,但是在引數為類型別來說,區別很大,因為傳值呼叫會在進入函式體之前在堆疊上建立乙個實參的副本,而引用呼叫則沒有這個操作,所以效能更好。

禁止傳值呼叫:

某些場景下可能考慮禁止傳值呼叫,由於建立副本的操作時利用拷貝建構函式進行的,所以,要禁止傳值呼叫,只要把拷貝建構函式顯式定義並設定為private或者protect即可。

class a;}

void show(a a) {}

void test()

不過這樣也有問題,就是也阻止了類物件做為函式的返回值,所以,如果有需要,這種情況下需要返回物件的引用。

可變長的引數:

(有專門說過,不寫了。。。)

函式指標:

returntype  (*pfunc) (var_list) 

returntype為返回型別 pfunc為函式指標名 var_list就是引數列表

函式過載:

相同的作用域中定義的函式,函式名相同,引數列表不同(可能是個數不同,也可能是對應的引數型別不同)形成過載。

不同的作用域中的相同名稱函式只會形成隱藏,而不是過載。(只能呼叫特定的函式)

定義函式的作用域發生巢狀,內部作用域定義的函式將隱藏外圍作用域中定義的函式。

類的靜態成員函式和例項成員函式可以形成過載(這也意味著不能同時定義具有相同名稱,相同引數列表的靜態成員函式和例項成員函式)

函式過載和覆蓋:

過載發生在同一作用域的兩個函式之間,覆蓋發生在基類成員函式和派生類成員函式之間(派生類覆蓋基類)

過載的兩個函式,名字相同,引數列表一定不同,返回值不限制。形成覆蓋的兩個函式,名稱,引數列表,返回型別一定相同

類的靜態成員函式和例項成員函式可以形成過載,覆蓋只存在於基類的例項成員函式和派生類的例項成員函式之間。

函式呼叫時,過載的函式入口位址是編譯時確定的(靜態連編),覆蓋是執行時確定的(虛函式的動態繫結機制)

如何確定具體呼叫哪個實際函式?

1確定過載函式集合(候選函式)2找出可行函式(引數個數相同或者多餘的引數是有預設值的)

3尋找最佳匹配。

1)準備匹配 2)提公升匹配 3)利用標準轉換的匹配 4)利用使用者定義的轉換匹配 5)利用函式宣告的...匹配(可變引數)

找不到可行函式或者在某一層次上有大於1個最佳匹配(二義性)時匹配失敗

操作符過載

就是對操作符(+ - *  / () 等)過載,是**更直觀比如 兩個類相加可以直接寫成類似於數學表示式的形式 a+b;

只有c++預定義的操作符集中的操作符才可以進行過載。操作符本質等同於乙個函式,由operator關鍵字後跟操作符組成

operator+就是加法的操作符過載。

操作符所帶的運算元個數不可改變,優先順序不可改變。

不能對基本資料型別定義其它操作,即對操作符過載,運算元其中之一必須為使用者自定義型別或者列舉型別。

. .* ::  ?:等操作符不可以被過載

操作符過載後,可以顯示呼叫,也可以隱式呼叫 如a+b和 a.operator+(b)是相同的。

型別轉換操作符的過載

class a

void printf()

/***cpp.cpp***/

void show()

/***c.c***/

void show(); //呼叫c++的函式,需要在這裡做宣告

int main()

C 高階之函式模板

我們知道c 中有函式過載這個概念,函式過載的功能就是把乙個函式重寫多次使其可以具有多種型別的引數。簡單的來說就是用同一種函式名定義多個函式,這些函式的引數個數和引數型別不同。利用函式模版就可以更簡單的來實現不同函式的引數需求。其實函式模版和函式過載是非常相似的 唯一的區別就是 函式過載需要寫多個函式...

C 高階函式

函式式程式設計有很多優點,詳情可以參考我的博文 卡馬克 用c 進行函式式程式設計 在c 中,我們可以借助於函式物件或者函式指標來實現高階函式。高階函式是至少滿足下列乙個條件的函式 接受乙個或多個函式作為輸入 輸出乙個函式 公式 1 int sumint int a,int b for int i a...

(C )函式高階

include iostream using namespace std intfunc int a,int b 20,int c 30 1.如果某個位置已經有了預設引數,在這個引數之後都必須有預設引數 intfunc2 int a,int b 10,int c 10 b有預設引數,則c也需要有預設...