C和C++的區別(1)——函數重載

C和C++的區別

在C++中,函數重載就是在同一作用域下,函數名相同,而參數列表不同的一組函數;而在C語言中不支持函數重載;

這是因爲C++編譯後在庫中的名字與C語言的不同;假設某個函數的原型爲void fun(int x,int y)。該函數被C編譯器編譯後的庫中的名字爲_fun;而被C++編譯器則會產生像_fun_int_int這樣的名字。

 

函數重載

(1)函數重載指的是同一作用域中,函數名相同、參數列表不同的一組重載的函數;不能僅通過返回值不同來進行判斷,跟返回值沒關係;

比如:

#include<iostream>
using namespace std;
bool compare(int a,int b)
{
    cout << "compare(a,b)" << endl;
    return a > b;
}
bool compare(double a,double b)
{
    cout << "compare(a,b)" << endl;
    return a > b;
}
bool compare(char *a,char *b)
{
    cout << "compare(char *,char *)" << endl;
    return strcmp(a,b) > 0 ? true : false;
}

 這段代碼在C中就不能通過編譯,在C中這三個函數編譯時都生成函數符號_compare,會發生重定義的錯誤,在C++中就可以通過編譯。

 

(2)靜多態和動多態的區別:

靜多態:在編譯階段時將符號表加載到內存中;函數的重載和模板。
動多態:在運行階段時將符號表加載到內存中;繼承裏的動態。

函數重載發生的是靜多態。

 

(3)重載必須在同一作用域下的原因:

在主函數中加入聲明會有如下的錯誤:

這是因爲C、C++中都可以在局部和全局聲明變量,但是局部使用優先,在局部找不到的情況下,再在全局中找。

 

(4)重載中的二義性:

將重載函數中的double改成float;還有以下的錯誤:

 

顯示對重載函數的調用不明確。原因是在調用點的compare(4.5,5.5),形參是double類型,而重載函數中沒有該類型的重載函數,則需要進行相應的類型轉換,就是在類型轉換時出了問題;double即可以轉換成int,也可以轉換成float;這就使系統產生二義性,系統也不知道調用哪個函數,只能報錯處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章