C++ 什么是函数重载?

示例

函数重载是在同一个作用域中声明多个具有相同名称的函数,它们在同一位置(称为scope)存在,只是它们的签名不同,即它们接受的参数不同。

假设您正在编写一系列用于通用打印功能的函数,其开头为std::string:

void print(const std::string &str)
{
    std::cout << "这是一个字符串: " << str << std::endl;
}

这可以正常工作,但是假设您想要一个也接受int并打印该函数的函数。您可以这样写:

void print_int(int num)
{
    std::cout << "这是一个整数:  " << num << std::endl;
}

但是因为这两个函数接受不同的参数,所以您可以简单地编写:

void print(int num)
{
    std::cout << "这是一个整数: " << num << std::endl;
}

现在,您有2个函数,都命名为print,但签名不同。一个接受std::string,另一个接受int。现在,您可以打电话给他们而不必担心其他名称:

print("你好,世界!"); //prints "这是一个字符串: 你好,世界!"
print(1337);           //prints "这是一个整数: 1337"

代替:

print("你好,世界!");
print_int(1337);

重载函数后,编译器会根据您提供的参数推断要调用的函数。编写函数重载时必须小心。例如,使用隐式类型转换:

void print(int num)
{
    std::cout << "这是一个整数: " << num << std::endl;
}
void print(double num)
{
    std::cout << "这是双重的: " << num << std::endl;
}

现在还不清楚print在编写时会调用哪个重载:

print(5);

您可能需要为编译器提供一些线索,例如:

print(static_cast<double>(5));
print(static_cast<int>(5));
print(5.0);

编写接受可选参数的重载时,还需要注意以下几点:

// 错误代码
void print(int num1, int num2 = 0)    //如果不包括num2,则默认为0
{ 
    std::cout << "These are ints: << num1 << " and " << num2 << std::endl;
}
void print(int num)
{
    std::cout << "这是一个整数: " << num << std::endl;
}

因为由于print(17)可选的第二个参数,编译器无法判断like调用是针对第一个函数还是第二个函数,所以将无法编译。