函数重载的概念
函数重载允许使用相同的函数名定义多个函数,条件是这些函数的形参列表各不相同。
所有函数都有签名,函数的签名由函数名称和形参列表确定。
程序中所有函数都必须有唯一的签名,否则不能编译程序。
#include <iostream>
#include <iomanip>
int add(int, int);
double add(int, double);
double add(double, int);
double add(double, double);
int main()
{
std::cout << add(3, 4) << std::endl;
std::cout << add(3.0, 4) << std::endl;
std::cout << add(3, 4.0) << std::endl;
std::cout << add(3.0, 4.0) << std::endl;
}
int add(int a, int b)
{
return a + b;
}
double add(int a, double b)
{
return a + b;
}
double add(double a, int b)
{
return a + b;
}
double add(double a, double b)
{
return a + b;
}
引用类型和重载选择
重载函数中的形参可以使用引用类型,必须确保编译器能够选择一种合适的重载形式。
一般来说不能重载给定类型type与此类型lvalue引用type&。编译器不能编译以下代码:
void f(int n);
void f(int& n);
当用类型为int的实参调用f(),编译器无法确定应该调用哪个函数,因为这两个函数都使用。
编译器能够区分以下原型的重载函数
void f(int& n); //lvalue引用参数
void f(int&& n); //rvalue引用参数
当实参为lvalue时,编译器将始终选择f(int& n)函数。
当实参为rvalue时,编译器将始终选择f(int&& n)函数。
rvalue引用类型形参主要用来处理特定问题,类的定义时,会遇到这些特定问题。
何时重载函数
函数重载的意图:允许使用单个函数名,以不同的操作数执行相同的操作。