函式過載:是函式的一種特殊情況,c++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的
形參列表(引數個數 或 型別 或 順序)必須不同,常用來處理實現功能類似資料型別不同的問題
下面兩個函式屬於函式過載麼?int add(int left, int right)
double add(double left, double right)
long add(long left, long right)
int main()
答案是不屬於,因為函式過載看的知識引數型別,而並不關注函式的返回型別。short add(short left, short right
int add(short left, short right)
接下來,我們一起來**一下,名字修飾這件事。
name mangling是一種在編譯過程中,將函式、變數的名稱重新改編的機制,簡單來說就是編譯器為了區分
各個函式,將函式通過某種演算法,重新修飾為乙個全域性唯一的名稱。
c語言的名字修飾規則非常簡單,只是在函式名字前面新增了下劃線。比如,對於以下**,在最後鏈結時就
會出錯:
int add(int left, int right);
int main()
在vs下,對上述**進行編譯鏈結,最後編譯器報錯:int add(int left, int right);
double add(double left, double right);
int main()
error lnk2019: 無法解析的外部符號 "double cdecl add(double,double)" (?add@@yannn@z)
error lnk2019: 無法解析的外部符號 "int __cdecl add(int,int)" (?add@@yahhh@z)
通過上述錯誤可以看出,編譯器實際在底層使用的不是add名字,而是被重新修飾過的乙個比較複雜的名
字,被重新修飾後的名字中包含了:函式的名字以及引數型別。這就是為什麼函式過載中幾個同名函式要求
其引數列表不同的原因。只要引數列表不同,編譯器在編譯時通過對函式名字進行重新修飾,將引數型別包
含在最終的名字中,就可保證名字在底層的全域性唯一性。
最後我們再來談談extern"c"
有時候在c++工程中可能需要將某些函式按照c的風格來編譯,在函式前加extern "c",意思是告訴編譯器,
將該函式按照c語言規則來編譯。
最後的最後,有幾個問題,回答一下:extern "c" int add(int left, int right);
int main()
void testfunc(int a = 10)
{ cout<
答:c語言不能函式過載與函式編譯後函式名有關。 c語言編譯後的**名稱為」_函式名」
編譯後函式名變化只是在原來的函式名前加了乙個下劃線,所以當同名的函式引數不同時,編譯器無法解析到他們的不同,因為它們編譯後的名稱都相同,所以c語言不能函式過載。
答:底層的重新命名機制將add函式根據引數的個數,引數的型別,返回值的型別都做了重新命名。那麼借助函式過載,乙個函式就有多種命名機制。
在c++呼叫約定(_cdecl 呼叫約定)中add函式在底層被解析為:
"int __cdecl add(int,int)" (?add@@yahhh@z)
"double __cdecl add(double,double)" (?add@@yannn@z)
"long __cdecl add(long,long)" (?add@@yajjj@z)
答:加乙個 extern "c"就可以實現了。
以上,歡迎指正~
mysql 函式過載 C 方法過載(函式過載)
在講解 c 構造方法 時提到定義構造方法時提到可以定義帶 0 到多個引數的構造方法,但構造方法的名稱必須是類名。實際上,這就是乙個典型的方法過載,即方法名稱相同 引數列表不同。引數列表不同主要體現在引數個數或引數的資料型別不同。在呼叫過載的方法時系統是根據所傳 遞引數的不同判斷呼叫的是哪個方法。例項...
C 函式 函式過載
如果同一作用域內的幾個函式名字相同但形參列表不同,我們稱之為過載函式。void print const char cp void print const int beg,const int end void print const int ia,size t size 這些函式接受的形參型別不一樣,...
C 函式過載
函式過載 overloaded function 在相同的作用域中的兩個函式,如果有相同的名字而形參表不同 注意 如果僅僅函式的返回值不同是不能實現函式過載 void func int int func int error,僅僅返回值不同是不能作為函式過載,這屬於函式重定義 形參表包括 引數的型別 ...