函數重載是什麼,在學習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++底層則是在函數名後在加了一個參數類型的首字母(函數返回值類型不受影響),這樣我們在調用對應的函數,他的函數名看上去相同,實際上在底層確實不同的。