AP计算机科学A(APcomputer science A)复习备考攻略视频教程
42829 人在学
重载函数作为C++语言中同样使用得比较多的函数而被程序员们所熟知,作为初学者的我们第一次看到这个函数名称的时候按照字面意思一般都会理解为通过不断重新载入数据的函数。那么实际上重载函数的意思是不是这样理解的呢?为此本次的讲解笔者主要给大家简单介绍重载函数的基本概念和作用。
在实际的程序编写开发中有时我们要实现的是同一类的功能,比如从3个数中找出其中的最大者,而每次求最大数时数据的类型会有不同的情况(可能是3个整数、3个双精度数或3个长整数)。如果我们利用C语言进行编写,往往需要分别设计出3个不同名的函数,其函数原型与下面代码比较相似:
int max1(inta,intb,intc);//求3个整数中的最大者
double max2(double a,double b,double c);//求3个双精度数中最大者
long max3(long a,long b,long c);//求3个长整数中的最大者
大家看了上面的代码式是不是觉得很复杂呢?其实换成用C++来进行编写的话就简单多了。由于C++允许多个函数拥有相同的名字,因此只要它们的参数列表不同就可以了,这就是本次讲解所提到的函数的重载(FunctionOverloading)。重载函数是函数的一种特殊情况,为方便使用C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。重载函数常用来实现功能类似而所处理的数据类型不同的问题。参数列表又叫参数签名,包括参数的类型、参数的个数和参数的顺序,只要有一个不同就叫做参数列表不同。
下面是利用C++重载函数求三个数的最大值的代码例子:
#include<iOStream>
usingnamespacestd;
//函数声明
intmax(int,int,int);
doublemax(double,double,double);
longmax(long,long,long);
intmain()
{
//求三个整数的最大值
inti1,i2,i3,i_max;
cin>>i1>>i2>>i3;
i_max=max(i1,i2,i3);
cout<<"i_max="<<i_max<<endl;
//求三个浮点数的最大值
doubled1,d2,d3,d_max;
cin>>d1>>d2>>d3;
d_max=max(d1,d2,d3);
cout<<"d_max="<<d_max<<endl;
//求三个长整型数的最大值
longg1,g2,g3,g_max;
cin>>g1>>g2>>g3;
g_max=max(g1,g2,g3);
cout<<"g_max="<<g_max<<endl;
}
//求三个整数的最大值
intmax(inta,intb,intc)
{
if(b>a)a=b;
if(c>a)a=c;
returna;
}
//求三个浮点数的最大值
doublemax(doublea,doubleb,doublec)
{
if(b>a)a=b;
if(c>a)a=c;
returna;
}
//求三个长整型数的最大值
longmax(longa,longb,longc)
{
if(b>a)a=b;
if(c>a)a=c;
returna;
}
输出结果:
1234100↙
i_max=100
73.23490.2878.23↙
d_max=878.23
3449001000↙
g_max=1000
大家通过观察上面代码例子可以发现,重载就是在一个作用范围内(同一个类、同一个命名空间等)有多个名称相同但参数不同的函数,重载的结果可以让一个程序段尽量减少代码和方法的种类。在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行但可读性不好。另外参数列表不同包括个数不同、类型不同和顺序不同,仅仅参数变量名称不同是不可以的。
◎函数的重载的规则
①函数名称必须相同。
②参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
③函数的返回类型可以相同也可以不相同。
④仅仅返回类型不同不足以成为函数的重载。
◎函数重载的实现
C++代码在编译时会根据参数列表对函数进行重命名,比如intmax(int,int,int)会被重命名为_max_int_int_int,doublemax(double,double,double)会被重命名为_max_double_double_double,所以在本质上来说它们还是不同的函数。不同的编译器有不同的重命名方式,当发生函数调用时,编译器会根据参数列表去逐个匹配以选择对应的函数,如果匹配失败则编译器报错,通常这被称为重载分辨。
本次C++基础之函数重载的讲解到此就暂告一段落,如果以后有什么相关的内容进行补充或者修改的话,笔者会继续在此进行相关的内容的补充或者修改的工作,同时也欢迎大家对本次的讲解提出自己的建议和补充。最后笔者希望本次的讲解对大家学习C++能够起到一定的帮助作用!