函數重載

函數重載是什麼,在學習C語言中,有時候想給一個函數起一個名字,但是前面已經有一個相同的函數名,這在C語言裏就得改了。但是在C++中卻有效的解決了這個問題。

#include <stdio.h>

int fun(int a,double b)
 {
   return 0;
 }
  
 double fun(int a,short b)
 {
   return 0;
 }
  
 int main()
 {                                                                          
   return 0;
 }

同樣的一個程序,因爲兩個函數名是一樣的,在C語言中卻不會編譯通過,會出現函數名衝突的錯誤,但是在C++中卻不會報錯。
在這裏插入圖片描述
下面我們再來回憶一下C語言時候學到的,一個函數想要運行起來需要經歷的幾個階段
預處理:在預處理階段,編譯器會將程序進行頭文件展開,宏替換,條件編譯,去註釋等等,生成一個 XXX.i文件
編譯:首先要檢查代碼的規範性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後把代碼翻譯成彙編語言,生成一個 XXX.s文件
彙編:彙編階段是把編譯階段生成的“.s”文件轉成目標文件,XXX.o文件
鏈接:生成可以執行的.exe文件

然後,我們用命令行參數來看.c文件和.cpp文件的彙編代碼有什麼不同。

gcc text.c -o textc
g++ text.cpp -o textcpp
objdump -S textc //objdump  一種閱讀二進制文件的格式
objdump -S textcpp

textc:
在這裏插入圖片描述
textcpp:
在這裏插入圖片描述
通過對比二者的彙編代碼,很容易發現,C語言在生成彙編代碼的時候,函數的地址直接使用函數名來代替,而C++底層則是在函數名後在加了一個參數類型的首字母(函數返回值類型不受影響),這樣我們在調用對應的函數,他的函數名看上去相同,實際上在底層確實不同的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章