重载函数

来源:互联网 发布:淘宝网原珍向天果官网 编辑:程序博客网 时间:2024/06/08 16:55

C++重载函数的详细分析

今天我使用函数时使用了重载函数,那么我们就来说说重载函数。.


问题:什么是重载函数?

答:重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。

函数定义为:

1.函数名相同

2.参数不同

a.参数个数不同。//这个大家都理解就不要解释了

b.参数类型不同。//如:inta(charc)和inta(int c)就是指参数不同,但是这也是重载函数。

c.参数顺序不同。//如:inta(int a,char b)和inta(char a,int b)就是顺序不同但是却是重载函数,从数学角度说就是组合相同(他们都是int,char组成),但是排列不同的参数能实现函数重载。


问题:满足上述两个条件就是重载函数?那么函数的返回类型不同函数可以重载吗?

答:对,满足上述条件就是重载函数,返回类型不同也可以重载。

如图:


函数能运行,不报错能够重载。


问题:重载函数返回值不同,参数相同能重载吗?

答:不能,因为不能满足重载函数基本条件,如果定义再编译时系统会提示 error:‘long int A::aa(int)’ cannot be overloaded 表示:“longint A::(int)'不能超载|,同时再第一个函数定义的地方提示函数错误。



问题:重载函数的参数有符号类型,和无符号类型能够重载吗?

答:能,如图:


无符号与有符号是有区别的,所以,虽然都是int但是取值范围不一样,同时定义的的方法不同,根据定义变量时的数据类型可以区分传送的参数的数据类型是否是有符号,还是无符号。从而实现重载。所以有符号,无符号可以重载。



问题:当定义重载时,定义通过但是传的参数是一个满足多个参数的数字,编译器会怎样运行?

答:如图:


输出结果是:


系统会默认选择参数是intc对应的函数进行运行。当把intc参数对应的函数注释掉时系统会提示以下

错误:/home/dc123/桌面/Test/main.cpp|22|error:call of overloaded ‘aa(int)’ is ambiguous|

翻译为:重载的调用(int)”是模糊的!

当然,如果满足条件的参数对应的函数只用一个,那么系统会执行满足条件的对应函数。

经上所诉总结如下:当传送的参数是满足多个参数类型的数时,系统会根据系统默认参数类型进行选择对应函数,如果没用对应的默认系统类型的函数,系统将无法找到对应函数(注:默认的数值数据类型为int)。


问题:能不能写函数体完全相同,参数排列不同的的重载函数?

答:能写函数体完全相同参数组合相同排列不同的重载函数,编译器通过不会报错同时也能正常运行,但是函数声明不同,函数体相同的函数实现的功能相同,重载函数就是为了通过不同的参数实现不同的功能。所以可以写,但是完全没必要,反而会造成程序代码的冗余,不是不能,而是完全没必要。


问题:写不同的函数也能实现重载能实现的功能,为什么还要用重载?

答:不同的函数确实能完成重载函数能实现的功能,但是不同的函数调用时需要判定何时调用该调用的函数,同时不能确保索吊有的函数不出错。但是如果使用重载,那么系统会根据你传送不同的参数去自动查找对应参数的函数。这样不但可以节省判断语句的汇编指令,同时可避免自己失误造成的耗时等问题。


问题:重载与多态的比较?

答:一句话概括,'重载是编译时的多态,多态是运行时的重载”。因为查重载是在编译时确定函数,多态是再运行时确定调用的函数。一个是编译时状态,一个是运行时状态。多态是通过父类的对象指针指向子类的虚表,通过子类所在的虚表找到对应的函数。重载是通过参数的不同找到对应函数实现不同的功能。

为什么说重载是编译时的多态,因为重载再编译时,系统会根据参数的不同而 找到对应当的函数进行编译,编译后所有调用重载函数的地方都会根据参数的不同找到对应的重载函数

为什么说多态是运行时的重载,因为多态是在运行时通过类实例化对象时,通过本类的对象指针找到虚表的地址,通过虚表地址中存的函数地址找到对应的函数的。

当然,为了更好的面向对象编程我们应该尽量的把编译时选择,改成运行时选择,这样会更大的提高变成效率。就像我们写编码时应该把,运行时错误写成编译时错误,这样可一节约出错时查找出错原因的时间。如:



如图:这样编写代码就是把运行时错误,改为编译时错误。如果你少写一个等号,那么编译器就会报错,但是你把条件写成a=1那么系统不会报错,但是你却没有达到要判定的目的,同时自己查找原因也会浪费大量的时间。


问题:重载与模板的比较?

答:模板函数是参数个数相同,函数体处理流程相同,参数类型不同的函数,且模板是重载的一个特殊形式。

相同点:为什么说模板是重载的特殊形式,因为他满足上述的重载条件。都是函数名相同,函数参数不同的函数。

不同点:重载函数:比模板更灵活,因为函数体不同,能实现的功能更加的多,重载能更加灵活。

模板:只有函数的参数不同,函数体的汇编代码不同。能更好的实现流程相同参数不同的函数代码,提高编程效率。

1 0
原创粉丝点击