C++函數重載介紹與原理詳解

函數重載

函數重載的概念

函數重載是函數的一種特殊情況,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”後,該函數便不能支持重載瞭。

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: