C和C 區別1 函式過載

2021-09-25 10:21:29 字數 1221 閱讀 8966

什麼是過載?

在同乙個作用域中,如果有多個函式的名字相同,但是形參列表不同(引數型別不同或引數個數不同),返回值型別可同也可不同,我們稱之為過載函式。過載的函式是通過形參列表區分的,與返回值型別無關。函式過載其實是"乙個名字,多種用法"的思想,不僅函式可以過載,運算子也可以過載。

(一)c語言和c++語言函式的生成規則

c語言:不支援過載,這是由於c語言生成的函式符號相同。

例如:int

sum(int a, int b)

double

sum(double a, double b)

在c語言中生成的函式符號都是_sum,這就會出現二義性。

c++語言:函式的生成是由返回值、函式名、引數列表(個數,型別、順序)構成。

例如://?sum@@yahhh@z   

int sum(int a, int b)

//?sum@@yanhh@z

double sum(int a, int b)

函式名的生成規則是?函式名@@呼叫約定 返回值型別 引數型別@z(符號的意思見呼叫約定那篇部落格)

(二)過載的三要素

根據函式名的生成規則,可見過載依賴於引數的支援,那麼為什麼不能依賴返回值和函式名的不同?

注意:返回值型別不同,函式名相同引數列表相同不能構成函式過載

不能依賴返回值的原因:因為在編譯期間,遇到函式呼叫語句;首先解析出函式的名字;其次解析出函式呼叫的引數資訊(引數個數和型別);然後開始根據名稱查詢函式定義,查詢的原則是找到同名函式定義後停下,不再向外層查詢,而是在停下的層次中找到所有的同名函式定義,即為候選函式集;再在候選函式集中根據函式呼叫的引數資訊來找出可選函式集,即可以通過直接匹配,型別隱式變換,模板引數特化等方式完成引數匹配的函式,根據過載協議,在可選函式集中找出最優函式;最後進行繫結。

如果僅僅是返回值型別不同,編譯器不知道呼叫哪個函式。例如:

float

max(int a, int b);

int

max(int a, int b);

當呼叫max(1,2);時無法確定呼叫的是哪個,單從這一點上來說,僅返回值型別不同的過載是不應該允許的。

不能依賴函式名的原因:這個原因很簡單,函式名不同,當在編譯的時候就只會去找與之匹配的函式名,這就不符合過載的定義。

(三)函式過載與函式覆蓋的區別

函式過載又稱為重定義,函式覆蓋又稱為重寫 。這點將在虛函式中具體講解。

C和C 區別 函式過載

一 從編譯鏈結的角度考慮函式在c和c 中的區別 1 c語言中函式生成的符號依靠函式名,所以不允許函式名相同,如果兩個函式名相同的函式在同乙個檔案中,那麼在編譯的時候就會生成兩個相同的符號,將這兩個相同的符號儲存在符號表中,那麼我們在鏈結的時候到底使用哪乙個呢?所以不允許函式名相同 2 在c 中,函式...

C和C 的區別 04 函式過載

函式過載 overload 用同一函式名定義不同的函式,當函式名和不同引數搭配時函式的意義不同。也就是說,函式過載就是,名字一樣,引數不同。引數不同有三種 個數不同 型別不同 順序不同。形參的名字和返回值相不相同無所謂。來看看編譯器呼叫過載函式的準則 看不懂或者覺得暈可以不看 函式過載的注意事項 i...

C 函式過載和函式覆蓋的區別

overload 翻譯過來就是 超載,過載,過載,超出標準負荷 override 翻譯過來是 重置,覆蓋,使原來的失去效果。先來說說過載的含義,在日常生活中我們經常要清洗一些東西,比如洗車 洗衣服。儘管我們說話的時候並沒有明確地說用 洗車的方式來洗車,或者用洗衣服的方式來洗一件衣服,但是誰也不會用洗...