函数重载指的是可以有多个同名的函数,因此对名称进行了重载。
如:
void print(const char *str, int width); //#1
void print(double d, int width); //#2
void print(long l, int width); //#3
void print(int i, int width); //#4
void print(const char *str); //#5
------------------------------------------------
print("Pancakes", 15); //use #1
print("Syrup"); //use #5
print(1999.0, 10); //use #2
print(1999, 12); //use #4
print(1999L, 15); //use #3
void print(double d, int width); //#2
void print(long l, int width); //#3
void print(int i, int width); //#4
void print(const char *str); //#5
------------------------------------------------
print("Pancakes", 15); //use #1
print("Syrup"); //use #5
print(1999.0, 10); //use #2
print(1999, 12); //use #4
print(1999L, 15); //use #3
使用被重载的函数时,需要在函数调用中使用正确的参数类型。对于下面的语句:
unsigned int year = 3210;
print(year, 6);
print(year, 6);
它不与任何原型匹配!如果 #2 原型是 print() 的唯一原型,则函数调用 print(year, 6) 将把 year 转换为 double 类型。但在上面的代码中,有3个将数字作为第一个参数的原型,因此有3种转换 year 的方式。在这种情况下,C++将拒绝这种函数调用,并将其视为错误。
一些看起来彼此不同的特征标是不能共存的。例如:
double cube(double x);
double cube(double &x);
double cube(double &x);
读者可能认为可以在此处使用函数 重载,因为它们的特征标看起来不同。但是,从编译器的角度来看,假设有下面这样的代码:
cout << cube(x);
参数 x 与 double x 原型和 double &x 原型都匹配,因此编译器无法确定究竟使用哪个原型。为避免这种混乱,编译器在检查函数特征标时,将把类型引用和类型本身视为同一个特征标。
谨记,是特征标,而不是函数类型使得可以对函数进行重载。例如,下面的两个生命是互斥的:
long gronk(int n, float m);
double gronk(int n, float m);
double gronk(int n, float m);
因此,C++不允许这种重载 gronk()。返回类型可以不同,但特征标也必须不同,如:
long gronk(int n, float m);
double gronk(float n, float m);
double gronk(float n, float m);