c++函数重载
初次听函数重载,感觉这个挺悬乎的,应该很难,其实特简单,只需要一句话就能说明白到底什么是函数重载:所谓函数重载就是,有着相同的函数名,却有着不同的参数列表,来执行不同的函数功能。
函数重载的关键就在于函数的参数列表---也成为函数特征标。在c++中允许定义名称相同的函数,条件是他们的特征标必须不同,即参数列表必须不同。这个不同可以是参数类型,参数数目,参数顺序等。先举几个简单的例子来介绍一下函数重载吧。
void show(const char*str,int n);//$1
void show(double d,int n);//$2
void show(long l,int n);//$3
void show(int k,int n);//$4
void show(const char*str);//$5
上面的函数都是某一个函数的重载函数,在使用show()函数时,编译器会根据相应值得类型去选择相应有着相同类型的特征标的函数。
show("cake",3);//使用$1
show("cake");//使用$5
show(23.0,15);//使用$2
show(23,15);//使用$4
show(23L,15);//使用$3
问题来了,如果函数的参数类型没有与之匹配的函数原型,那怎么办,是停止调用该函数吗?既然我穿成这样,你不认识我,那我就换件衣服咯。在c++中,如果真出现这样的情况,c++将尝试使用标准类型转换强制进行匹配。在上面的例子中,如果只有$2定义存在的话,那下面的例子中就会强行调用$2,使之匹配。
show(23,15);//将int型强行转换为double型,使用$3
在使用函数重载时,需要注意以下几点:
1.类型引用和类型本身是同一种特征标。如下:
double fix(double x);
double dix(double &x);
从表面上来看,这个两函数的特征标是不一样额,应该是重载函数,如果你认为他是重载函数,那你就大错特错了,我们肉眼看,额,确实是不一样啊,但是编译器却不这么认为啊,他认为这是一样的啊,假设有下面这样的代码:
cout<<fix(x);
编译器认为,参数x与double x原型和double &x原型都匹配,我该调用哪个呢。为了避免这种混乱,编译器在检查函数特征标时,会将类型引用和类型本身是同一种特征标。
2.匹配函数时,不区分const和非const变量。看如下例子
//函数定义
void fun1(const char*str);
void func(char*str);
void fun2(const char *str);
void funb(char *str);
//函数调用
const char a[8]="cake";
char b[7]="brand";
fun1(a);
fun1(b);
func(b);
funb(a);//调用出错,由于a为const char*型,而funb()函数特征标为char*,
//将非const变量->const变量合法,反之,非法
fun2(b);
3.函数可以重载,是因为特征标,而不是函数类型。例如下面两个声明是互斥的。
long gank(int x,int y);
int gank(int x,int y);
牢记,在c++中不允许以这种方式重载gank(),返回类型可以不同,但是特征标必须不同。