C 函式過載

2021-10-04 08:19:34 字數 3392 閱讀 9838

在實際開發中,有時候我們需要實現幾個功能類似的函式,例如把變數的值寫入檔案,變數的型別可能是int、long、double、char,通過引數把變數傳入函式。在c語言中不允許函式同名,程式設計師只能設計出四個不同名的函式,其函式宣告如下:

bool

writetofile_int

(char

*filename,

int value)

;// 寫入int

bool

writetofile_long

(char

*filename,

long value)

;// 寫入long

bool

writetofile_double

(char

*filename,

double value)

;// 寫入double

bool

writetofile_char

(char

*filename,

char

*value)

;// 寫入char字串

c語言中函式命名不能重複對程式設計師是一種負擔,程式設計序的時候需要想象出相近的函式名,呼叫函式的時候,書寫函式名也是一件麻煩的事情。

c++允許多個函式擁有相同的名字,只要它們的引數列表不同就可以,這就是函式的過載(function overloading),借助過載,多個功能相近的一系列函式可以使用同一函式名。

函式的引數列表包括引數的型別、引數的個數和引數的順序,只要有乙個不同就叫做引數列表不同。

使用c++函式過載,把變數的值寫入檔案的函式宣告修改如下:

bool

writetofile

(char

*filename,

int value)

;// 寫入int

bool

writetofile

(char

*filename,

long value)

;// 寫入long

bool

writetofile

(char

*filename,

double value)

;// 寫入double

bool

writetofile

(char

*filename,

char

*value)

;// 寫入char字串

過載就是在乙個作用範圍內(同乙個程式、同乙個類、同乙個命名空間等)有多個名稱相同但引數列表不同的一系列函式。

在使用過載函式時,同名函式的功能應當相似,不要用相同名稱的函式名去實現不相干的功能,雖然程式也能執行,但可讀性不好,使人覺得莫名其妙。

注意,引數列表不同包括引數的個數不同、型別不同或順序不同,僅僅引數名稱不同是不可以的,函式返回值也不能作為過載的依據。

編譯器在編譯c++程式時會根據引數列表對函式進行重新命名,例如:

bool

writetofile

(char

*filename,

int value)

;

重新命名為

bool

_writetofile_char_int

(char

*filename,

int value)

;

bool

writetofile

(char

*filename,

long value)

;

重新命名為

bool

_writetofile_char_long

(char

*filename,

long value)

;

程式被編譯時,編譯器會根據引數列表逐個匹配,選擇對應的函式,如果匹配失敗,編譯器就會報錯,這叫做過載決議(overload resolution)。

所以,函式過載僅僅是語法層面的,本質上它們還是不同的函式,占用不同的記憶體,入口位址也不一樣。

我們在介紹c語言字串的時候,學習了strcpy函式。

char

*strcpy

(char

*dest,

const

char

*src)

;

strcpy函式有兩個缺陷:1)沒有對dest變數進行初始化;2)如果src的長度超過dest,會造成記憶體溢位。

我們現在來重寫strcpy函式,彌補這兩個缺陷,新函式名還是採用strcpy命名,但引數列表不同,宣告如下:

char

*strcpy

(char

*dest,

const

char

*src,size_t destsize)

;

dest和src引數的含義與庫函式strcpy相同,第三個引數destsize是dest占用記憶體的大小。

示例(book201.cpp)

/*

* 程式名:book201.cpp,此程式用於演示c++函式過載,修復strcpy函式的缺陷

*/#include

#include

// 過載strcpy函式,對dest初始化,防止記憶體溢位。

char

*strcpy

(char

*dest,

const

char

*src,size_t destsize)

;int

main()

// 過載strcpy函式,對dest初始化,防止記憶體溢位

char

*strcpy

(char

*dest,

const

char

*src,size_t destsize)

執行效果

c語言提供了一些庫函式,這些庫函式的功能肯定不能滿足實際開發的需求,需要程式設計師重新擴充套件加固,這是優秀程式設計師與普通程式設計師的差別。

1)編寫示例程式,把本章節介紹的知識點全部演示一遍,用程式演示可以加深您的理解和映象。

2)編寫示例程式,測試函式的返回值不同能否作為函式過載的依據。

3)編寫示例程式,測試函式的引數名不同能否作為函式過載的依據。

mysql 函式過載 C 方法過載(函式過載)

在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...

C 函式 函式過載

如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...

C 函式過載

函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...