一、为什么C语言不支持函数重载而c++能支持
什么是函数重载?为什么C语言不支持函数重载,而c++能支持函数重载?
解析:
函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。在C语言里需要写两个不同名称的函数来进行区分。
#include <iostream> using namespace std; class Test { public: int add(int x, int y) //相加,传入参数以及返回值都是int { return x+y; } float add(float x, float y) //相加,传入参数以及返回值都是float { return x+y; } }; int add(int x, int y) //相加,传入参数以及返回值都是int { return x+y; } float add(float x, float y) //相加,传入参数以及返回值都是float { return x+y; } int main() { int i = add(1, 2); float f = add(1.1f, 2.2f); Test test; int i1 = test.add(3, 4); float f1 = test.add(3.3f, 4.4f); cout<<"i = "<<i<<endl; cout<<"f = "<<f<<endl; cout<<"i1 = "<<i1<<endl; cout<<"f1 = "<<f1<<endl; return 0; }
上面的程序中使用了全局函数和类成员函数的重载,代码30~39行是对它们的调用与测试。可以看到,在c++中可以根据传入参数类型和返回类型来区分不同的重载函数。
C语言不支持函数重载,c++却支持,为什么呢?这是因为c++的重载函数经过编译器处理之后,两个函数的符号是不相同的。例如代码第18行的add函数,经过处理后变成了_int_add_int_int之类,而后者变成了_float_add_float_float之类。这样的名字包含了函数名、函数参数数量及返回类型信息,c++就是靠这种机制来实现函数重载的。
总结:
函数重载是用来描述同名函数具有相同或者相似的功能,但数据类型或者是参数不同的函数管理操作。
函数名经过c++编译器处理后包含了原函数名、函数参数数量及返回类型信息,而C语言不会对函数进行处理。
(A) int calc(int, int); int cale(const int, const int); (B) int get(); double get(); (C) int *reset(int*); double *reset(double*); (D) extern "C" int compute(int *, int); extern "C" double compute(double*, double);
A错误。第二个函数被视为重复声明,第二个声明中的const修饰词会被忽略。
B错误。第二个声明是错误的,因为单就函数的返回值而言,不足以区分两个函数的重载。
C正确。这是合法的声明,reset()函数被重载。
D错误。第二个函数声明是错误的,因为在一组重载函数中,只能有一个函数被指定为extern "C"
三、重载和覆写有什么区别
重载是指子类改写了父类的方法,覆写是指同一个函数的不同版本之间参数不同。
重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它具有如下特征:
(1)方法名必须相同。
(2)参数列表必须不相同,与参数列表的顺序无关。
(3)返回值类型可以不相同。
覆写是派生类重写基类的虚函数,它具有如下如示的特征。
(1)只有虚函数的抽象方法才能被覆写。
(2)相同的函数名
(3)相同的参数列表
(4)相同的返回值类型
重载是一种语法规则,有编译器在编译阶段完成,不属于面向对象编程;而覆写是由运行阶段决定的,是面向对象编程的重要特征。