C++ 重载函数,函数重载c语言,C++基础学习之函数重载的简单介绍

C++ 重载函数,函数重载c语言,C++基础学习之函数重载的简单介绍

函数重载是一个特例。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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: