什么是函数重载
函数重载具有在同一范围内声明的多个函数,同一位置(称为范围 )中存在完全相同的名称,仅在它们的签名中有所不同,这意味着它们接受的参数。
假设你正在编写一系列用于通用打印功能的函数,从 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)
这样的调用是否适用于第一个或第二个函数,所以这将无法编译。