網(wǎng)站首頁 編程語言 正文
函數(shù)重載的概念
函數(shù)重載:是函數(shù)的一種特殊情況,C++允許在同一作用域中聲明幾個(gè)功能類似的同名函數(shù),這些同名函數(shù)的 形參列表(參數(shù)個(gè)數(shù) 或 類型 或 順序)必須不同,常用來處理實(shí)現(xiàn)功能類似數(shù)據(jù)類型不同的問題。
函數(shù)重載的應(yīng)用
1.比如以下代碼,函數(shù)名一樣,而參數(shù)的類型不同,在調(diào)用的時(shí)候編譯器會根據(jù)傳遞的參數(shù)自動進(jìn)行匹配。
2.在例如以下代碼,我們進(jìn)行編譯,都可以編譯成功。
?3.接下來看一個(gè)有趣的現(xiàn)象,將上述第二個(gè)例子中的第一個(gè)函數(shù)的最后一個(gè)參數(shù)改為缺省參數(shù),此時(shí)調(diào)用f(1,2),編譯器直接報(bào)錯(cuò)。其實(shí)這兩個(gè)函數(shù)在語法上是構(gòu)成重載的,但是當(dāng)調(diào)用時(shí),只給了兩個(gè)參數(shù),我們知道缺省參數(shù)可以不給,那么此時(shí)編譯器就不知道調(diào)用哪個(gè)函數(shù)了,就出現(xiàn)了“調(diào)用不明確”的錯(cuò)誤。
?為什么C++支持函數(shù)重載,而C語言不支持
在 C/C++ 中,一個(gè)程序要運(yùn)行起來,需要經(jīng)歷以下幾個(gè)階段: 預(yù)處理、編譯、匯編、鏈接。 1. 實(shí)際我們的項(xiàng)目通常是由多個(gè)頭文件和多個(gè)源文件構(gòu)成,而通過我們 C 語言階段學(xué)習(xí)的編譯鏈接,我們 可以知道,【當(dāng)前a.cpp 中調(diào)用了 b.cpp 中定義的 Add 函數(shù)時(shí)】,編譯后鏈接前, a.o 的目標(biāo)文件中沒有 Add的函數(shù)地址,因?yàn)?Add 是在 b.cpp 中定義的,所以 Add 的地址在 b.o 中。那么怎么辦呢? 2. 所以鏈接階段就是專門處理這種問題, 鏈接器看到 a.o 調(diào)用 Add ,但是沒有 Add 的地址,就會到 b.o 的符 號表中找 Add 的地址,然后鏈接到一起。 3. 那么鏈接時(shí),面對 Add 函數(shù),連接器會使用哪個(gè)名字去找呢?這里每個(gè)編譯器都有自己的函數(shù)名修飾規(guī) 則。 4. 由于 Windows 下 vs 的修飾規(guī)則過于復(fù)雜,而 Linux 下 gcc 的修飾規(guī)則簡單易懂,下面我們使用了 gcc 演示了這個(gè)修飾后的名字。 5. 通過下面我們可以看出 gcc 的函數(shù)修飾后名字不變。而 g++ 的函數(shù)修飾后變成【 _Z+ 函數(shù)長度 + 函數(shù)名 + 類 型首字母】。
一、在Linux環(huán)境下采用C語言編譯器編譯后:函數(shù)名字的修飾沒有發(fā)生改變。
二、采用C++編譯器編譯后:函數(shù)名字的修飾發(fā)生改變,編譯器將函數(shù)參數(shù)類型信息添加到修改后的名字中。
通過這里就理解了 C 語言沒辦法支持重載,因?yàn)橥瘮?shù)沒辦法區(qū)分。而 C++ 是通過函數(shù)修飾規(guī)則來區(qū) 分,只要參數(shù)不同,修飾出來的名字就不一樣,就支持了重載。
原文鏈接:https://blog.csdn.net/Enthusiastic_boy/article/details/122799855
相關(guān)推薦
- 2022-10-08 Python中集合創(chuàng)建與使用詳解_python
- 2022-09-12 PyQt轉(zhuǎn)換路徑中的斜杠(斜杠(/)與反斜杠(\)轉(zhuǎn)換)_python
- 2023-01-12 C#11新特性之file關(guān)鍵字的用法教程_C#教程
- 2022-05-27 時(shí)序數(shù)據(jù)庫TDengine寫入查詢的問題分析_數(shù)據(jù)庫其它
- 2022-04-30 DataGridView不顯示最下面的新行、判斷新增行、刪除行操作_C#教程
- 2022-03-13 C語言基于graphics.h實(shí)現(xiàn)圣誕樹_C 語言
- 2022-06-14 C#獲取指定目錄下指定文件的方法_C#教程
- 2022-09-23 Python線程threading(Thread類)_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支