什麼是函式過載
函式過載具有在同一範圍內宣告的多個函式,同一位置(稱為範圍 )中存在完全相同的名稱,僅在它們的簽名中有所不同,這意味著它們接受的引數。
假設你正在編寫一系列用於通用列印功能的函式,從 std::string
開始:
void print(const std::string &str)
{
std::cout << "This is a string: " << str << std::endl;
}
這樣可以正常工作,但是假設你想要一個也接受 int
的功能並列印它。你可以寫:
void print_int(int num)
{
std::cout << "This is an int: " << num << std::endl;
}
但是因為這兩個函式接受不同的引數,你可以簡單地寫:
void print(int num)
{
std::cout << "This is an int: " << num << std::endl;
}
現在你有 2 個函式,都名為 print
,但具有不同的簽名。一個接受 std::string
,另一個接受 int
。現在你可以呼叫他們而不用擔心不同的名字:
print("Hello world!"); //prints "This is a string: Hello world!"
print(1337); //prints "This is an int: 1337"
代替:
print("Hello world!");
print_int(1337);
當你過載函式時,編譯器會根據你提供的引數推斷要呼叫哪些函式。編寫函式過載時必須小心。例如,使用隱式型別轉換:
void print(int num)
{
std::cout << "This is an int: " << num << std::endl;
}
void print(double num)
{
std::cout << "This is a double: " << num << std::endl;
}
現在還不能立即清楚當你寫的時候呼叫 print
的哪個過載:
print(5);
你可能需要為編譯器提供一些線索,例如:
print(static_cast<double>(5));
print(static_cast<int>(5));
print(5.0);
在編寫接受可選引數的過載時,還需要注意:
// WRONG CODE
void print(int num1, int num2 = 0) //num2 defaults to 0 if not included
{
std::cout << "These are ints: << num1 << " and " << num2 << std::endl;
}
void print(int num)
{
std::cout << "This is an int: " << num << std::endl;
}
因為由於可選的第二個引數,編譯器無法判斷像 print(17)
這樣的呼叫是否適用於第一個或第二個函式,所以這將無法編譯。