oracle 函式 實現過載 C 函式過載

2021-10-16 15:12:19 字數 2978 閱讀 4937

一、函式過載的概念

在實際開發中,有時候我們需要實現幾個功能類似的函式,例如把變數的值寫入檔案,變數的型別可能是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++ 是如何做到函式過載的

編譯器在編譯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()

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 函式 函式過載

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

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

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

Oracle函式過載方法

最近專案搞規則引擎,然後涉及到資料庫的日期比較,而業務鏈比較長,再加上動態表的日期資料存的都是字串,還有的業務表日期存的就是date型別資料,這樣一來無法選用to char 或者 是to date 所以寫了個過載函式,直接返回的資料型別為date 我寫了個oracle函式過載的demo 拿出來分享下...