在C語言中,我們如果需要列印整型,浮點型和字串型資料,需要編寫不同函數名的函數來完成相應的功能,如下所示:
void print_int(int);
void print_float(float);
void print_string(char str[]);
這三個函數分別完成整型,浮點型和字串型資料的輸出操作。在C語言中,對於函數的標識是通過函數名來進行標識的。
但是在C++中,由於這三個函數雖然輸出的資料不一樣,但是,其功能是一樣的,所以並不滿足於用上述方式分別為各種資料分別編寫函數,為瞭解決這種問題,C++提供了重載技術,各種建構函式的實現就是重載技術的典型應用。
那麼在C++中又是對同名函數怎樣實現重載的呢?C++編譯器又是怎麼識別和調用正確的函數的呢?
繼續上面的例子,列印程式可以如下:
void print(int);
void print(float);
void print(string);
編譯器在看到這三個具有相同函數名的函數後,如果不使用參數對函數進行區分,編譯器將這三個函數的名稱重新改變成:
_print_int;
_print_float;
_print_string;
於是編譯器便能夠唯一的標識他們。
對於每一個函數,都是由函數名、函數參數、函數傳回值組成,C++既然可以使用函數名和函數參數結合的方式來唯一的標識函數,那麼為什麼不能使用函數傳回值呢?我想,對於兩個擁有相同函數名和參數的函數,如果傳回值不相同,C++也可以在函數返回時進行強制類型轉換,所以編譯器不能識別到底調用什麼函數。當然除了上面介紹的方法識別函數外,還有通過函數範圍的方法來識別函數。
如下所示:
class A
{
public:
A()
{cout<<”A() is in class A”<<endl;}
}
void A()
{cout<<”A() in main()”<<endl;}
上面兩個同名同參數的函數,一個是類的成員函數,一個是全域函數,雖然名字和參數相同,但是其定義的位置不同,所以實際上他們仍是兩個不同的函數,在使用類成員函數時需要使用範圍操作符“::”。