網站首頁 編程語言 正文
函數重載
函數重載的概念
函數重載是函數的一種特殊情況,C++允許在同一作用域中聲明幾個功能類似的同名函數,這些同名函數的形參列表必須不同。函數重載常用來處理實現功能類似,而數據類型不同的問題。
#include <iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, double y) { return x + y; } int main() { cout << Add(1, 2) << endl;//打印1+2的結果 cout << Add(1.1, 2.2) << endl;//打印1.1+2.2的結果 return 0; }
注意:形參列表不同是指參數個數、參數類型或者參數順序不同,若僅僅是返回類型不同,則不能構成重載。
函數重載的原理(名字修飾)
為什么C++支持函數重載,而C語言不支持函數重載呢?
我們知道,一個C/C++程序要運行起來都需要經歷以下幾個階段:預處理、編譯、匯編、鏈接。
在編譯階段會將程序中的每個源文件的全局范圍的變量符號分別進行匯總。在匯編階段會給每個源文件匯總出來的符號分配一個地址(若符號只是一個聲明,則給其分配一個無意義的地址),然后分別生成一個符號表。最后在鏈接期間會將每個源文件的符號表進行合并,若不同源文件的符號表中出現了相同的符號,則取合法的地址為合并后的地址(重定位)。
在C語言中,匯編階段進行符號匯總時,一個函數匯總后的符號就是其函數名,所以當匯總時發現多個相同的函數符號時,編譯器便會報錯。而C++中進行符號匯總時,對函數的名字修飾做了改動,函數匯總出的符號不再單單是函數的函數名,而是通過其參數的類型和個數以及順序等信息匯總出 一個符號,這樣一來,就算是函數名相同的函數,只要其參數的類型或參數的個數或參數的順序不同,那么匯總出來的符號也就不同了。
注:不同編譯器下,對函數名的修飾不同,但都是一樣的。
總結:
- C語言不能支持重載,是因為同名函數沒辦法區分。而C++是通過函數修飾規則來區分的,只要函數的形參列表不同,修飾出來的名字就不一樣,也就支持了重載。
- 另外我們也理解了,為什么函數重載要求參數不同,和返回值沒關系。
extern “C”
有時候在C++工程中可能需要將某些函數按照C的風格來編譯,在函數前加“extern C”,意思是告訴編譯器,將該函數按照C語言規則來編譯。
注意:在函數前加“extern C”后,該函數便不能支持重載了。
原文鏈接:https://blog.csdn.net/weixin_53306029/article/details/122355126
相關推薦
- 2022-08-21 python格式的Caffe圖片數據均值計算學習_python
- 2022-09-21 Python+pandas編寫命令行腳本操作excel的tips詳情_python
- 2022-05-21 云原生技術持久化存儲PV與PVC_云其它
- 2022-05-19 使用?docker?部署?APISIX的詳細介紹_docker
- 2022-11-07 關于對python中self的深入理解_python
- 2022-06-06 typescript中abstractClass(抽象類)、extends、abstract
- 2022-05-08 ASP.NET?MVC對URL匹配操作_實用技巧
- 2022-06-26 python如何利用matplotlib繪制并列雙柱狀圖并標注數值_python
- 最近更新
-
- 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同步修改后的遠程分支