06 C 函式高階

2021-10-04 10:07:04 字數 3663 閱讀 8449

01函式預設引數

02函式佔位引數

03函式過載

函式的構成包括五部分:int func(int a)

返回值型別,函式名,引數列表,函式體,返回語句(void型別可以省略)

同名函式,引數列表不同,會發生過載

例如:

1.

intfunc

(int a)

2.int

func

(int a,

int b)

3.int

func

(int b,

int a)

4.float

func

(double a)

5.float

func

(float b)

6.float

func

(double a,

float b)

7.float

func

(int a)

其中1-

6會發生過載

因為:滿足函式名相同,引數列表不同

其中:引數列表不同包括,引數列表的個數,位置,順序等

1和7不會發生過載(返回值型別不同不能作為過載的條件)

類中的成員函式的過載問題

成員函式被過載的特徵有:

相同的範圍(在同乙個類中)

函式名字相同

引數不同

virtual關鍵字可有可無

派生類(父類的子類)中重新定義父類中的函式,其函式名、引數列表、返回值型別同父類中的被覆蓋的函式嚴格一致,而且覆蓋函式和被覆蓋函式只有函式體(花括號中的部分)不同,當派生類物件呼叫子類中與父類中函式同名的函式時會自動呼叫子類中這個函式,而不是父類中的被覆蓋函式,這種機制就叫做覆蓋。

也就是函式過載只發生在父類與子類中

成員函式被覆蓋的特徵有:

1) 不同的範圍(分別位於派生類與基類)

2) 函式名字相同

3) 引數相同

4) 基類函式必須有virtual關鍵字

#include

using

namespace std;

//定義父類

class

father

void

func

(float x)

virtual

void

func02

(void)}

;//定義子類

class

sun:

public father };

void

main

(void

)

函式father::func(int)與father::func(float)相互過載

函式father::func02(void)被sun::func02(void)覆蓋

派生類的函式遮蔽了與其同名的基類函式,規則如下:

如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏。

注意別與過載混淆:過載發生同一類中

如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏。

注意別與覆蓋混淆:有virtual關鍵字修飾時才是覆蓋

#include

using

namespace std;

//定義父類

class

father

void

func02

(float x)

virtual

void

func03

(void)}

;//定義子類

class

sun:

public father

//子類函式與父類中的函式,函式名相同引數列表也相同,父類函式沒有virtual關鍵字修飾,覆蓋

void

func02

(float x)

virtual

void

func03

(void)}

;void

main

(void

)

注意,func03()函式屬於覆蓋,而func01()與func02()屬於隱藏。

從上面的執行結果,我們可以注意到在覆蓋中,用基類指標和派生類指標呼叫函式func03()時,系統都是執行的派生類函式,而非基類的func03(),這樣實際上就是完成的「介面」功能。

而在隱藏方式中,用基類指標和派生類指標呼叫函式func01()

func02()時,系統會進行區分,基類指標呼叫時,系統執行基類的函式,而派生類指標呼叫時會執行派生類中的函式,系統「隱藏」了基類的函式,這也就是「隱藏」的由來。

#include

using

namespace std;

#include

//函式的預設引數

//在c++中,函式的形參列表中的形參是可以有預設值的

//語法:返回值型別 函式名(引數=預設值){}

//注意:

//1.當不設定預設引數的時候,有多少引數就要傳多少值,少傳乙個都不行

//2.使用預設引數(要放在引數列表後面),當不傳值得時候使用預設引數,傳值的時候使用傳過來的值

//3.宣告和函式實現只能有乙個可以有預設值,否則會產生二義性

intfunc

(int a,

int b,

int c=30)

intmain()

#include

using

namespace std;

#include

//函式佔位引數

//c++中函式的形參列表裡可以有佔位引數,用來佔位,呼叫函式時必須填補該位置

//語法:返回值型別 函式名(資料型別){}

//注意:佔位引數也要傳值,但是傳的值不能使用(那也得傳),佔位引數也可以設定預設引數

void

func1

(int a,

int=10)

void

func

(int a,

int)

intmain()

#include

using

namespace std;

#include

//函式過載

//作用:函式名可以復用,提高函式的復用性

/*函式過載的條件:

同乙個作用域下

函式名稱相同

函式:引數:型別不同,或者個數不同,或者順序不同(反正就是不同)(注意是引數)

注意:函式的返回值不可以作為函式過載的條件(返回值型別能變)

*//*

函式過載的注意事項

1.引用作為過載的條件

2.函式過載碰到預設引數(當使用func(10),編譯器會懵逼,不知道呼叫哪乙個)

func(int a ,int b=10){}

func(int a){}

*/void

func()

void

func

(int a)

intmain()

06 C 名字控制

建立名字是程式設計過程中一項最基本的活動,當乙個專案很大時,它會不可避免地包含大量名字。c 允許我們對名字的產生和名字的可見性進行控制。我們之前在學習c語言可以通過static關鍵字來使得名字只得在本編譯單元內可見,在c 中我們將通過一種通過命名空間來控制對名字的訪問。在c 中,名稱 name 可以...

06 C語言變數

變數的本質 變數的本質其實是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小的範圍,在範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為 c 是大小寫敏感的。以下...

06 C 筆記 常量

1.進製 字首 0x 或 0x 表示十六進製制,0 表示八進位制,沒有字首則表示十進位制。字尾 可以是 u 或 l 的組合,其中,u 和 l 分別表示 unsigned 和 long。字尾可以是大寫或者小寫。2.科學記數法 e3.字串 轉義字元同c 的用法 string a hello,world ...