C 函式過載,為什麼C不可以?

2021-10-09 18:26:39 字數 1702 閱讀 9207

乙個詞可以有多重含義,我們可以根據上下文判斷該詞真實的含義,即該詞被過載了

比如有句話說的是「能穿多少穿多少」,在冬天和夏天來看這句話的理解是不一樣的。

函式過載是函式的一種特殊情況,c++允許在同乙個作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列表(引數個數或型別或順序)必須不同。

注意:如果兩個函式僅僅是返回值型別不同,不能構成過載

#includeusing namespace std;

int add(int x, int y)

double add(double x, double y)

int main()

函式過載一定是在編譯階段具體來確定應該呼叫那個函式

編譯器在編譯階段,會對函式實參型別進行推演,根據推演的實際結果找型別匹配的函式進行呼叫

如果有型別完全匹配的函式直接呼叫

如果沒有型別完全匹配的函式,則會進行隱式型別轉換,如果隱式型別轉換後有對應的函式則進行呼叫

如果沒有對應的函式,或者說轉換之後有二義性,則報錯

為什麼c++支援過載而c不支援?

在linux下,採用gcc編譯完成後,函式名字的修飾沒有發生改變

如圖所示:

在linux下, 採用g++編譯完成後,函式名字的修飾發生改變,編譯器將函式引數型別資訊新增到修改後的名字中。g++的函式修飾後函式名變為:_z+函式長度+函式名+型別首字母

如圖所示:

在windows下, c語言編譯器將函式名改為:_函式名

在windows下,c++編譯器在編譯函式時,會對函式名字進行修改,將引數型別新增到最終的名字中。

修飾後函式名由"?"開頭,截止是函式名由"@"結尾的函式名,後面跟著由"@"結尾的類名"c"和命名空間"n",再乙個"@"表示函式的命名空間結束,第乙個"a"表示函式呼叫型別為"_cdecl",截止是函式的引數型別及返回值,由"@"結束,最後以"z"結束。

例如:int func(int) 在c++編譯器下,函式名會被修改為:?func@@yahh@z

double  func(double x,double y)在c++編譯器下,函式名會被修改為:?func@@yannn@z

因此,c語言沒有辦法支援過載,因為同名函式無法區分,而c++是通過函式修飾規則來區分,只要引數不同,修飾後的函式名就不一樣,就可以支援過載。

在c++工程中,將某些函式按照c的的風格來編譯,在函式前加extern "c",意思是告訴 編譯器將該函式按照c語言規則來編譯。

程式設計 為什麼不可以簡單??

今天在群裡聽到這樣的話,asp.net太簡單了,微軟過分的封裝,難道程式設計要像word,excel那樣簡單嗎 具體的可能不是這個樣子,反正意思差不多。我想了想,首先有乙個疑問,什麼樣的人需要程式設計,程式設計中最重要的是什麼?誰會程式設計,我覺得每個人都可以,但這個社會從事程式設計的人還是少數,程...

建構函式為什麼不可以為虛函式

1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...

這個讀檔案為什麼不可以呢?

專案中有個讀stream的問題,我用了最原始的辦法,發現當inputstream中是xml可以讀出,當是其他的時候就不可以了。雖然後來有了其他方案解決了,但是還是不知道原因,這裡貼出來,想知道大家的看法,謝謝.try if in null byte cache2 new byte cache.siz...