博客园 首页 联系 管理

 函数的重栽主要特点是一个接口,多种调用,即多态性!重栽可以用于构造函数

有时候需要几个函数来处理一些操作,而这些操作是相似的,如果不用重栽就必须写N个不同名称的函数,在VB中就是这样做的,因为VB没有重栽机制。如果在管理一个大项目时,这些函数和其他函数混合在一起,可以让人眩晕。当然,在使用类封装之后,可以使用属性设置来解决,然而,函数重栽可以增加一种灵活的函数定义方式。C++利用函数返回类型或参数的类型和参数的数量来区分具体应该调用哪个函数。

一、重栽样例:

int func(int a);
int func(int  a,int b);

int func(int a )
{
      
return a*a;
}


int func(int a,int b)
{
    
return a*b;
}


void main()
{
int x;
     x
=func(10);//调用int func(int a ),x=100
     x=func(2,30);//调用int func(int a,int b),x=60
}



二、重栽中的二意性

1,C++中自动类型转换
如果两个不同宽度的数据类型进行运算时,编译器会尽可能地在不丢失数据的情况下将它们类型统一,比如float和double运算时,如果不显式地指定为float,C++会自动转换成double进行计算,一个整数类型和一个浮点类型运算时,会先将整数转换成浮点数,而常量不带小数点被认为是整数。

但如果使用重载,编译器按返回类型、参数类型和参数数量区分调用哪个重载函数,但是有时候,数据类型自动转换机制和重载机制会使编译器走入死胡同,看下面例子:

float func(float a);
double func(double a);
调用:
x=func(10.1);//能够调用,重载机制将10.1看作double类型,这样数据比较安全,便调用double类型的重载函数
x=func(10);//不能调用,编译会出错

编译器不知道要将整数转换成float还是double,我觉得这完全可以避免的,只不过做编译器的那些人没有考虑过这个情况,类似的问题在C++中有不少,不过,由于C++的灵活性,你总可以找到方法解决(大不了自己直接写内存,哈哈)。

2,使用默认参数时
int func(int i);
int func(int i,int j=1);

调用:
x=func(1,2);//能够调用
x=func(1);//不能调用,编译器不知道是不是调用单个参数的那个还是调用带默认值的那个.

因此很多编译器不允许带默认参数,使用函数重载可以达到相同效果。

三、获得重栽函数的地址

int func(int a);
int func(int a,int b);

声明并获得重栽函数指针
int (* fp)(int a,int b);

posted on 2007-09-20 09:55  CodeBlove  阅读(703)  评论(1编辑  收藏  举报