在传统的C语言中,函数名必须是唯一的,也就是说在同一作用域中,不允许出现同名的函数。
例如: 要求编写求整数、浮点数和双精度数的平方数的函数。
在传统的C语言中:
Isquare(int i); //求整数的平方数
Fsquare(float f); //求浮点数的平方数
Dsquare(double d);//求双精度数的平方数
在C++中,允许两个或者两个以上的函数共用一个函数名。
例如: square(int i); //求整数的平方数
square(float f); //求浮点数的平方数
square(double d);//求双精度数的平方数
函数重载:当两个或者两个以上的函数共用一个函数名时,称为函数重载。
被重载的函数称为重载函数。
重载函数应在参数个数或参数类型上有所不同,或者二者兼而有之
举例:
#include<iostream>
using namespace std;
int square(int i) { return i * i; }
float square(float f) { return f * f; }
double square(double d) { return d * d; }
int main()
{
int i = 12;
float f = 3.4;
double d = 5.67;
cout << i << "*" << i << "=" << square(i) << endl;
cout << f << "*" << f << "=" << square(f) << endl;
cout << d << "*" << d << "=" << square(d) << endl;
return 0;
}
运行结果:
12*12=144
3.4*3.4=11.56
5.67*5.67=32.1489
#include<iostream>
using namespace std;//参数个数不同的函数重载
int add(int x, int y) { return x + y; }
int add(int x, int y, int z) { return x + y + z; }
int main()
{
int a = 3, b = 4, c = 5;
cout << a << "+" << b << "=" << add(a, b) << endl;
cout << a << "+" << b <<"+"<<c<< "=" << add(a, b,c) << endl;
return 0;
}
运行结果:
3+4=7
3+4+5=12
说明:
(1)若两个函数的参数个数和类型都相同,而只有返回值类型不同,则不允许重载。
例如: int mul(int x,int y); double mul(int x,int y);
虽然这两个函数的返回值类型不同,但是参数个数和类型完全相同,编译程序将无法区分这两个函数。
overloaded function differs only by return type from 'int __cdecl mul(int,int)'
(2) 函数的重载与带默认值的函数一起使用时,有可能引起二义性,例如:
void Drawcircle(int r=0, int x=0, int y=0);
void Drawcircle(int r);
当执行以下的函数调用时: Drawcircle(20); 时,编译无法确定使用哪一个函数。
‘Drawcircle’ : ambiguous call to overloaded function
void Drawcircle(int r, int x, int y)//不带默认值
{ cin>>r>>x>>y;cout<<r<<x<<y;}
void Drawcircle(int r)
{ cout<<r;}
(3) 在函数调用时,如果给出的实参和形参类型不相符,C++的编译器会自动地做类型转换工作。如果转换成功,则程序继续执行。
但是,在这种情况下,有可能产生不可识别的错误。
例如,有两个函数的原型如下:
void f_a(int x);
void f_a(long x);
如果我们用下面的数据去调用,就会出现不可识别的错误:
int c=f_a(5.56);
编译器无法确定将5.56转换成int还是long类型
更多内容欢迎关注微信订阅号:phpstory