日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++中函數重載詳解_C 語言

作者:Enthusiastic_boy ? 更新時間: 2022-04-11 編程語言

函數重載的概念

函數重載:是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的 形參列表(參數個數 或 類型 或 順序)必須不同,常用來處理實現功能類似數據類型不同的問題。

函數重載的應用

1.比如以下代碼,函數名一樣,而參數的類型不同,在調用的時候編譯器會根據傳遞的參數自動進行匹配。

2.在例如以下代碼,我們進行編譯,都可以編譯成功。

?3.接下來看一個有趣的現象,將上述第二個例子中的第一個函數的最后一個參數改為缺省參數,此時調用f(1,2),編譯器直接報錯。其實這兩個函數在語法上是構成重載的,但是當調用時,只給了兩個參數,我們知道缺省參數可以不給,那么此時編譯器就不知道調用哪個函數了,就出現了“調用不明確”的錯誤。

?為什么C++支持函數重載,而C語言不支持

在 C/C++ 中,一個程序要運行起來,需要經歷以下幾個階段: 預處理、編譯、匯編、鏈接。 1. 實際我們的項目通常是由多個頭文件和多個源文件構成,而通過我們 C 語言階段學習的編譯鏈接,我們 可以知道,【當前a.cpp 中調用了 b.cpp 中定義的 Add 函數時】,編譯后鏈接前, a.o 的目標文件中沒有 Add的函數地址,因為 Add 是在 b.cpp 中定義的,所以 Add 的地址在 b.o 中。那么怎么辦呢? 2. 所以鏈接階段就是專門處理這種問題, 鏈接器看到 a.o 調用 Add ,但是沒有 Add 的地址,就會到 b.o 的符 號表中找 Add 的地址,然后鏈接到一起。 3. 那么鏈接時,面對 Add 函數,連接器會使用哪個名字去找呢?這里每個編譯器都有自己的函數名修飾規 則。 4. 由于 Windows 下 vs 的修飾規則過于復雜,而 Linux 下 gcc 的修飾規則簡單易懂,下面我們使用了 gcc 演示了這個修飾后的名字。 5. 通過下面我們可以看出 gcc 的函數修飾后名字不變。而 g++ 的函數修飾后變成【 _Z+ 函數長度 + 函數名 + 型首字母】。

一、在Linux環境下采用C語言編譯器編譯后:函數名字的修飾沒有發生改變。

二、采用C++編譯器編譯后:函數名字的修飾發生改變,編譯器將函數參數類型信息添加到修改后的名字中。

通過這里就理解了 C 語言沒辦法支持重載,因為同名函數沒辦法區分。而 C++ 是通過函數修飾規則來區 分,只要參數不同,修飾出來的名字就不一樣,就支持了重載。

原文鏈接:https://blog.csdn.net/Enthusiastic_boy/article/details/122799855

欄目分類
最近更新