在同一作用域類,一組函式的函式名相同,引數列表不同(引數個數不同或者引數型別不同),返回值可同可不同。
過載函式通常用來在同乙個作用域內,用同乙個函式名命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。
(1)多型:用同乙個東西表示不同的形態。
(2)多型分為:
靜態多型:編譯時的多型
動態多型:執行時的多型
(3)函式過載是一種靜多型。
編譯器在編譯.cpp檔案中當前使用的作用域裡的同名函式時,根據函式形參的型別和順序會對函式進行重新命名(不同的編譯器在編譯時對函式的重新命名標準不一樣)但是總的來說,他們都把檔案中的同乙個函式名進行了重新命名;
在vs編譯器中: 具體命名方式見5.
根據返回值型別(不起決定性作用)+形參型別和順序(起決定性作用)的規則重新命名並記錄在map檔案中。
在linux g++ 編譯器中:
根據函式名字的字元數+形參型別和順序的規則重新命名記錄在符號表中;從而產生不同的函式名,當外面的函式被呼叫時,便是根據這個記錄的結果去尋找符合要求的函式名,進行呼叫;
答:命名方式不同,c的太簡單,所以不能實現函式過載。編譯器在編譯.c檔案時,只會給函式進行簡單的重新命名;具體的方法是給函式名之前加上」_」;所以加入兩個函式名相同的函式在編譯之後的函式名也照樣相同;呼叫者會因為不知道到底呼叫那個而出錯。
通過這個我們可以得出,c程式中的add()函式在符號表中的重新命名就是函式名前邊加個下劃線。所以如果乙個c程式**現了同名函式,他們在符號表中的命名一樣,這樣呼叫時就出現了衝突。
改為.cpp檔案,編譯之後在map中檢視兩個add()函式的名字:
我們可以看出,在.cpp檔案中,雖然兩個函式的函式名一樣,但是他們在符號表中生成的名稱不一樣。
由於在.cpp檔案中,兩個函式生成的符號表中的名稱不一樣,所以是可以編譯通過的。
答: c++語言支援函式過載,c語言不支援函式過載,c++語言為了支援過載,對編譯時函式的重新命名規則進行更改, 使用extern 「c」 的方式在c++程式中宣告c語言檔案中的函式,可以在編譯時,告訴編譯器使用c語言的規則對該函式的的函式名的進行重新命名,這樣在鏈結的時候,就可以順利在.c檔案中找到該函式。
使用extern "c" int add(int,int); 外部函式—正確,在.cpp檔案中**如下:、
#includeusing namespace std;
extern "c" int add(int,int);
int main()
{ cout結合多型和虛函式,會更容易學懂,可檢視我的其他部落格喲~
4 過載和重寫
內容提要 結合 觀察覆蓋,過載和方法重複 從物件導向角度,分析覆蓋時需要注意的兩大準則 子類方法覆蓋 override 父類方法 方法的過載 overload 過載 方法同名,不同參 方法同名,同參,不同引數名,是重複方法 方法同名,同參,不同返回值,是重複方法 子方法覆蓋時的限制 子類方法不能縮小...
C 入門(6)過載
過載 using system class vector 獲取向量的長度 public double getlength 過載運算子 public static bool operator vector a,vector b 過載運算子 public static bool operator vec...
P4 過載與模板
這一章主要講得就是過載和模板。其中過載又分為了函式名過載,運算子過載和輸入 輸出插入符過載。一 函式名過載 c 允許乙個函式名對應多個函式體,形成函式名的多型性。在c 中,編譯器主要是靠過載函式的引數形式的不同來與函式體繫結,而不是靠返回值的型別。因此 要實現函式名過載,就是說函式名必須相同,引數形...