在實際開發中,有時候咱們須要實現幾個功能相似的函數,例如把變量的值寫入文件,變量的類型多是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),藉助重載,多個功能相近的一系列函數可使用同一函數名。ide
函數的參數列表包括參數的類型、參數的個數和參數的順序,只要有一個不一樣就叫作參數列表不一樣。函數
使用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字符串
重載就是在一個做用範圍內(同一個程序、同一個類、同一個命名空間等)有多個名稱相同但參數列表不一樣的一系列函數。測試
在使用重載函數時,同名函數的功能應當類似,不要用相同名稱的函數名去實現不相干的功能,雖然程序也能運行,但可讀性很差,令人以爲莫名其妙。.net
注意,參數列表不一樣包括參數的個數不一樣、類型不一樣或順序不一樣,僅僅參數名稱不一樣是不能夠的,函數返回值也不能做爲重載的依據。設計
編譯器在編譯C++程序時會根據參數列表對函數進行重命名,例如:3d
bool writetofile(char *filename,int value);
重命名爲code
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函數的缺陷 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include <stdio.h> #include <string.h> // 重載strcpy函數,對dest初始化,防止內存溢出。 char *strcpy(char *dest, const char *src,size_t destsize); int main() { char dest[10]; strcpy(dest,"www.freecplus.net",sizeof(dest)); // 新strcpy printf("=%s=\n",dest); strcpy(dest,"www.freecplus.net"); // 舊strcpy printf("=%s=\n",dest); } // 重載strcpy函數,對dest初始化,防止內存溢出 char *strcpy(char *dest, const char *src,size_t destsize) { memset(dest,0,destsize); // 對dest初始化 // 計算須要複製的字符數,不能超出destsize-1 size_t len=0; if (strlen(src)<=destsize-1) len=strlen(src); else len=destsize-1; strncpy(dest,src,len); // 複製字符串,超出的將扔掉 dest[len]=0; // 強制字符串的結尾標誌 return dest; }
運行效果
C語言提供了一些庫函數,這些庫函數的功能確定不能知足實際開發的需求,須要程序員從新擴展加固,這是優秀程序員與普通程序員的差異。
1)編寫示例程序,把本章節介紹的知識點所有演示一遍,用程序演示能夠加深您的理解和映象。
2)編寫示例程序,測試函數的返回值不一樣可否做爲函數重載的依據。
3)編寫示例程序,測試函數的參數名不一樣可否做爲函數重載的依據。
C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道
若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!