? ? ? ? 前言:
????????函數重載的意思就是可以有多個同名函數存在,但是這些同名函數的參數列表有著不同情形,以便區分。在C++中,支持在同一作用域下可以聲明、定義多個同名函數,但是這些函數的形參類型,類型順序以及參數個數三者中至少有一個是有區別的。
1、情形一:參數類型不同
? ? ? ? 既同名函數的形參類型不能相同,代碼如下:
#include<iostream>
using namespace std;//定義兩個func同名函數
void func(int x, int y)
{cout << "func(int x, int y)" << endl;//打印函數
}void func(double x, double y)
{cout << "func(double x, double y)" << endl;//打印函數
}int main()
{//調用這兩個函數func(2, 3);//系統會自動調用第一個funcfunc(2.5, 3.5);//系統會自動調用第二個funcreturn 0;
}
? ? ? ? 運行結果:
? ? ? ? 從結果中可以看出,系統會自動識別并調用一個形參類型最為接近的實參類型的函數,盡管有多個和該函數重名的函數,系統也不會報錯。
2、情形二:參數個數不同?
? ? ? ? 既同名函數的形參類型可以相同,但是要在形參的個數上有所區分。代碼如下:
#include<iostream>
using namespace std;void func(int x, int y)
{cout << "func(int x, int y)" << endl;//打印函數
}void func(int x)
{cout << "func(int x)" << endl;//打印函數
}int main()
{func(2);return 0;
}
? ? ? ? 運行結果:
? ? ? ? 從結果中可以看出,編譯器同樣會根據形參個數的不同去調用我們期望調用的函數。
3、情形三:參數類型的順序不同
? ? ? ? 注意這里指的順序不同是指第一個形參類型與第二個形參類型的前后順序,并不是形參名稱順序不同,代碼如下:
#include<iostream>
using namespace std;void func(int x, char y)
{cout << "func(int x, char y)" << endl;//打印函數
}void func(char x, int y)
{cout << "func(char x, int y)" << endl;//打印函數
}int main()
{//調用func(2, 'a');func('b',3);return 0;
}
????????運行結果:
????????從結果中可以看出,即使同名函數的形參個數和形參類型都相同,只要他們形參類型的順序不同編譯器也可以精確調用。
4、函數返回值不同能否構成函數重載
? ? ? ? 上文說到了在三個情形下都能構成函數重載,那么如果函數的返回類型不相同按理來說也可以對同名函數進行區分,但是實際上僅僅通過對返回類型的區分是不能夠判斷是否為函數重載。原因在于編譯器在編譯完成后會對原本的函數名進行修飾,是根據函數形參、實參的邏輯進行分析然后修飾。然而函數調用的代碼是不涉及返回類型的區分,因此修飾的時候不參考函數的返回類型。所以不能通過區分返回類型來構建函數重載。
? ? ? ? 具體示意圖如下:
? ? ? ? 可以從上圖看到,編譯器之所以可以區分同名函數,是根據函數的形參、實參進行分析,從而對函數名進行修飾。如果只看調用函數的代碼,是看不出要調用函數的返回類型,就無法進行調用函數與定義函數的區分,因此返回類型不被作為修飾參考。
結語:
? ? ? ? 以上就是關于函數重載的講解,希望本文可以給你帶來更多的收獲,如果本文對你起到了幫助,希望可以動動小指頭幫忙點贊👍+關注😎+收藏👌!如果有遺漏或者有誤的地方歡迎大家在評論區補充~!!謝謝大家!!