函数重载

一、为什么C语言不支持函数重载而c++能支持

什么是函数重载?为什么C语言不支持函数重载,而c++能支持函数重载?

解析:

  函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。在c语言里需要写两个不同名称的函数来进行区分。

[cpp]  view plain  copy
  1. <span style="font-size:18px;">int add1(int a, int b)  
  2. {  
  3.     return a+b;  
  4. }</span>  
[cpp]  view plain  copy
  1. <span style="font-size:18px;">float add2(float a, float b)  
  2. {  
  3.     return a+b;  
  4. }</span>  

  上面的代码写的不太好,这两个具备相似操作的函数,却给它们取了两个不同的名字,这样做不便于管理。因此,c++为了方便程序员编写,引入了函数重载的概念。例如下面的代码:

[cpp]  view plain  copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class Test  
  6. {  
  7. public:  
  8.     int add(int x, int y)           //相加,传入参数以及返回值都是int  
  9.     {  
  10.         return x+y;  
  11.     }  
  12.     float add(float x, float y)     //相加,传入参数以及返回值都是float  
  13.     {  
  14.         return x+y;  
  15.     }  
  16. };  
  17.   
  18. int add(int x, int y)               //相加,传入参数以及返回值都是int  
  19. {  
  20.     return x+y;  
  21. }  
  22.   
  23. float add(float x, float y)         //相加,传入参数以及返回值都是float  
  24. {  
  25.     return x+y;  
  26. }  
  27.   
  28. int main()  
  29. {  
  30.     int i = add(1, 2);  
  31.     float f = add(1.1f, 2.2f);  
  32.     Test test;  
  33.     int i1 = test.add(3, 4);  
  34.     float f1 = test.add(3.3f, 4.4f);  
  35.       
  36.     cout<<"i = "<<i<<endl;  
  37.     cout<<"f = "<<f<<endl;  
  38.     cout<<"i1 = "<<i1<<endl;  
  39.     cout<<"f1 = "<<f1<<endl;  
  40.       
  41.     return 0;  
  42. }  
  上面的程序中使用了全局函数和类成员函数的重载,代码30~39行是对它们的调用与测试。可以看到,在c++中可以根据传入参数类型和返回类型来区分不同的重载函数。

  C语言不支持函数重载,c++却支持,为什么呢?这是因为c++的重载函数经过编译器处理之后,两个函数的符号是不相同的。例如代码第18行的add函数,经过处理后变成了_int_add_int_int之类,而后者变成了_float_add_float_float之类。这样的名字包含了函数名、函数参数数量及返回类型信息,c++就是靠这种机制来实现函数重载的。

总结:

  函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。

  函数名经过c++编译器处理后包含了原函数名、函数参数数量及返回类型信息,而C语言不会对函数进行处理。


二、判断题——函数重载的正确声明

[cpp]  view plain  copy
  1. (A) int calc(intint);  
  2.     int cale(const intconst int);  
  3.   
  4. (B) int get();  
  5.     double get();  
  6.       
  7. (C) int *reset(int*);  
  8.     double *reset(double*);  
  9.       
  10. (D) extern "C" int compute(int *, int);  
  11.     extern "C" double compute(double*, double);  
A错误。第二个函数被视为重复声明,第二个声明中的const修饰词会被忽略。

B错误。第二个声明是错误的,因为单就函数的返回值而言,不足以区分两个函数的重载。

C正确。这是合法的声明,reset()函数被重载。

D错误。第二个函数声明是错误的,因为在一组重载函数中,只能有一个函数被指定为extern "C"


三、重载和覆写有什么区别

  重载是指子类改写了父类的方法,覆写是指同一个函数的不同版本之间参数不同。

  重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它具有如下特征:

(1)方法名必须相同。

(2)参数列表必须不相同,与参数列表的顺序无关。

(3)返回值类型可以不相同。

  覆写是派生类重写基类的虚函数,它具有如下如示的特征。

(1)只有虚函数的抽象方法才能被覆写。

(2)相同的函数名

(3)相同的参数列表

(4)相同的返回值类型

  重载是一种语法规则,有编译器在编译阶段完成,不属于面向对象编程;而覆写是由运行阶段决定的,是面向对象编程的重要特征。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值