函数重载是在同一个作用域中声明多个具有相同名称的函数,它们在同一位置(称为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调用是针对第一个函数还是第二个函数,所以将无法编译。