函数重载是一个特例。c允许在同一个作用域中声明几个同名的相似函数。这些同名的函数必然有不同的参数表(参数的个数、类型和顺序),常用于处理函数相似的数据类型不同的问题。本文主要介绍C基础学习函数重载的相关信息,有需要的朋友可以参考一下。
前言
我们在编写代码时通常会用到几个函数,但它们的实现功能是一样的,只是一些细节不同。例如,交换两个数的值,包括类型(int、float、char、double)。在C语言中,我们用不同的函数名来区分它们。
void Swap1(int* a,int * b);
void Swap2(float* a,float * b);
void Swap3(char* a,char * b);
void Swap4(双* a,双* b);
我们可以看到这段代码并不美观,给程带来了很多不便。于是在C中,人们提出了用一个函数名定义多个函数的思想,称为函数重载。
函数重载意味着一个作用域中的几个函数名称相同,但参数列表不同。这些函数执行相似的操作,但是接受不同类型的参数。编译器将根据传递的参数类型选择相应的函数调用。本文将简要介绍c语言中的函数重载。
定义重载函数
假设有一个函数可以计算一个图的面积。它可以是三角形、圆形或正方形的面积。这些函数的名称都是相同的,但是根据输入图形的类型选择不同的函数来计算面积。程序列表如下:
#包括iostream
使用命名空间std
typefstructtriangle//定义三角形结构
{
双高;//高
双基线;//底部长度
}三角形;
typefstructcircle//定义一个循环结构。
{
双倍半径;//半径
}圈;
typefstruct square//定义正方形结构。
{
双面透镜;//边长
}方形;
//函数1。计算三角形的面积
双calcArea(常数三角形)
{
cout '计算三角形面积' endl
}
//函数2。计算圆的面积
双calcArea(常数圆)
{
cout 'calcute circle area 'endl
返回0;
}
//函数3,计算三角形面积
双calcArea(常数正方形)
{
cout 'calcute square area 'endl
}
int main(void)
{
三角形三角形;
圈圈;
方方正正;
calcArea(三角形);//调用函数1
calcArea(圆形);//调用函数2
calcArea(正方形);//调用函数3
返回0;
}
可以看到,三个定义的函数名calcArea都是一样的,只是参数类型不同。当传入三角形、圆形和正方形类型时,会调用相应的函数。
运行结果如下:
计算三角形面积
计算圆面积
计算平方面积
如你所见,当三角形、圆形和正方形类型被传入时,相应的函数被调用。
为什么要重载
函数重载可以减少在某个程序上命名程序员的负担。最常见的例子是构造函数的重载。
分类试验
{
公共:
测试(无效);//没有参数构造函数
test(int a);//构造函数
Test(int a,int b);//两个整数参数的构造函数
};
正如您所看到的,类Test的所有三个构造函数都被命名为Test。如果没有重载,可能需要三个不同的构造函数名来实现三个构造函数,这会增加类的用户的负担。当用户需要传入不同的参数来构造对象时,就需要使用不同的构造函数名。函数重载后,该类的用户可以使用同一个函数名传入不同的参数。
当然,单纯为了减轻命名的负担而使用函数重载是不明智的选择,这使得函数失去了原有的信息。我们可以重载那些操作非常相似的函数。
不能重载的情况
以下情况,不能超载,也不能违法。
main函数不能重载
这在C 11标准中有规定:
程序应包含一个名为main的全局函数,它是程序的指定开始.
此函数不应过载。
试想一下,如果主函数,也就是用户程序的入口函数重载了,加载的时候应该用哪个作为入口?
只有返回值不同
例如,下面两个声明只有不同的返回值,而函数名和参数是相同的:
双calcArea(常数方块);
int calcArea(const Square);//非法,只是返回值不同,不能重载。
/*当上述语句同时出现时,将会报错*/
想象一下,当你传入方形类型参数而不是使用返回值时,应该调用上面的哪个函数?
形参表看似不同,其实是一样的。
例如,使用typedef给三角形一个“别名”:
typedef三角形MyTri
双calcArea(常数三角形);
双calcArea(const MyTri);
/*当上述语句同时出现时,将会报错*/
以上情况看似外表不同,但本质上并无不同。
形参名不同
例如:
双calcArea(const Circle圆);//参数名为circle
双calcArea(常数圆cir);//参数名是cir
双calcArea(常数圆);//省略形参名
/*当上述语句同时出现时,将会报错*/
这里形参的名字只是作为解释或者记忆,所以对于上面三条语句,它们的形参名字可以随意命名,但不会影响形参表的内容。
仅有顶层const的差异
例如:
双calcArea(常数圆);//函数1
双calcArea(圆形);//函数1被重复声明
/*当上述语句同时出现时,将会报错*/
double calcArea(Circle * const);//函数2
双calcArea(圆圈*);//函数2被重复声明
/*当上述语句同时出现时,将会报错*/
但是需要注意的是,如果参数是指针或者引用,那么通过区分指针是常量对象还是非常量对象,就可以实现函数重载。例如,函数重载可以在下列情况下实现:
双calcArea(常数圆);//作用于常量引用
双calcArea(圆形);//
/*当上述语句同时出现时,不会报告错误*/
双calcArea(常数圆*);//作用于常量指针
双calcArea(圆圈*);
/*当上述语句同时出现时,不会报告错误*/
总结
在定义了重载函数之后,我们需要用合理的参数调用它。大多数情况下,通过传入的对应参数,很容易判断出需要调用哪个函数,但有时候就没那么容易了。我们将在后面的文章中看到如何执行函数匹配。
我们对前面的内容做一个总结:
函数重载可以减轻程序员的命名负担,但不应该以牺牲可读性为代价。
main函数不能重载。
重载函数的参数在数量或类型上应该不同。
不能将返回值作为函数重载功能。
c没有函数重载。
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。