在c++中,函式過載一直是乙個常用且重要的東西,但其中也是有很多坑。
實際上,在g++處理函式過載的時候,假設有下面兩個函式
void fun(int a,int b)
void fun(int a,char b)
很明顯這是兩個過載的函式,c++利用一種叫name mangling的技術,經過編譯器處理後,實際上是產生了兩個函式,比如分別是fun_ii(),fun_ic()兩個函式,也就是在實際經過編譯器後,他最終產生的仍然是多個函式,再根據呼叫時傳入的引數列表進行選擇,因此,由於編譯器的這種處理方法,在實際使用過程中就產生了很多坑。
void fun(int a,int b,int c = 100)
void fun(int a,int b)
比如這樣的處理方式就不可取,因為編譯器在分析的時候會產生歧義,因而我們在過載函式的時候不要帶預設引數。
在c++中,函式的返回值是不構成函式過載的條件的,因此返回值不同不可以構成過載,我們在編譯過程中,編譯器就會發現並且報錯
那如果我想對乙個已有的過載函式重定義該怎麼辦呢,那就需要像c一樣,令函式的返回值、函式引數列表(引數的個數、引數的型別、引數的順序)相同,即可作為函式的重定義
我們在上面提到,編譯器對待函式過載是 將其產生多個函式,因此我們在利用函式指標的時候就要注意,函式指標定義時的引數列表不同,是不能夠匹配的
int func(int,int,int);
int func(int,int);
int(*fp)(int,int)=null;
fp = func;//指向int func(int,int)
比如上述的函式指標fp,我們在使用他的過程中,就只能傳入兩個引數,因為在經過編譯器處理後,它實際指向的就是int func(int,int),如果傳入三個引數,就會報錯引數太多,也就是函式指標並不進行匹配,因此在使用函式指標時要注意他指向了那個函式。 c 函式過載與匹配
匹配規則 精確匹配 常量版本匹配 變數提公升 算數 指標轉換 類型別轉換 當我們為函式過載,並呼叫過載後的函式時,編譯器會自動根據引數型別進行匹配與轉換但是此時 容易出現二義性錯誤,函式引數轉換與型別提公升容易混淆,例如當我們同時過載了float double 版本的函式時,傳入乙個int型實參,就...
C 函式過載與函式匹配
c primer 筆記,整理關於函式過載與函式匹配的筆記。void func int a 原函式 void func double a 正確 形參型別不同 void func int a,int b 正確 形參個數不同 int func int a 錯誤 只有返回型別不同 typedef int i...
c 之函式過載 函式匹配
case void f void f int void f int,int void f double,double 3.14 匹配原則 1 其形參數量與本次呼叫提供的實參數量相等 2 每個實參的型別與對應的形參型別相同,或者可以轉換成形參的型別 尋找最佳匹配 1 該函式每個實參的匹配都不劣於其他可...