在實際開發中,有時候我們需要實現幾個功能類似的函式,例如把變數的值寫入檔案,變數的型別可能是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,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...