網站首頁 編程語言 正文
函數重載的概念
函數重載:是函數的一種特殊情況,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
相關推薦
- 2022-11-03 通過VS下載的NuGet包修改其下載存放路徑的操作方法_python
- 2022-06-28 C#操作Byte數組和十六進制進行互轉_C#教程
- 2023-10-24 解決Ubuntu下載速度或更新速度緩慢問題
- 2022-07-08 一文教會你用Docker打包Python運行環境_docker
- 2023-01-26 C#實現Word轉換TXT的方法詳解_C#教程
- 2021-12-09 Linux環境下安裝JDK1.8_Linux
- 2022-05-28 python爬蟲框架scrapy下載中間件的編寫方法_python
- 2023-02-14 C++深入分析數據在內存中的存儲形態_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支