什麼是函式過載

函式過載具有在同一範圍內宣告的多個函式,同一位置(稱為範圍 )中存在完全相同的名稱,僅在它們的簽名中有所不同,這意味著它們接受的引數。

假設你正在編寫一系列用於通用列印功能的函式,從 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) 這樣的呼叫是否適用於第一個或第二個函式,所以這將無法編譯。