什么是函数重载

函数重载具有在同一范围内声明的多个函数,同一位置(称为范围 )中存在完全相同的名称,仅在它们的签名中有所不同,这意味着它们接受的参数。

假设你正在编写一系列用于通用打印功能的函数,从 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) 这样的调用是否适用于第一个或第二个函数,所以这将无法编译。