栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

157-C++基础(函数重载)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

157-C++基础(函数重载)

函数重载

什么叫函数重载?

  • 1、一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称作:函数重载。
  • 2、一组函数要称得上重载,一定先是处在同一个作用域当中的。
  • 3、const或者volatile的时候,是怎么影响形参类型的。
  • 4、一组函数,函数名相同,参数列表也相同,仅仅是返回值不同?不叫重载

C++为什么支持函数重载,C语言不支持函数重载?

  • C++代码在产生函数符号的时候,是由函数名+参数列表类型组成的!
  • C代码在产生函数符号的时候,是由函数名来决定!
1、一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称作-函数重载。

我们看下面代码,提供了3组函数,函数名都是相同的,但是它们的参数列表不同。

这是一个典型的函数重载的调用。
重载函数名字一样,在编译器编译过程中,根据函数调用的时候传入的实参类型来选择合适的重载版本。
一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称作-函数重载。

2、一组函数要称得上重载,一定先是处在同一个作用域当中的。

在C/C++中,函数里面是不能再定义一个函数的,但是在一个函数里面声明一个函数是可以的。


编译看看:

这个是什么原因?为什么第二个compare不会去调用double,double的函数重载?为什么要调用带int,int的函数重载?

  • 而且我们看第二个编译结果,显示的是错误。也就是说,第三个compare调用也不是去调用带char*,char*的函数重载,而是也去调用了int,int的函数重载?

为什么都是一股脑地去调用这个函数呢?

  • 因为在我们的C/C++,都是分作用域的;
  • 比如说,我们在全局作用域定义一个全局变量,在函数的局部作用域里面定义一个局部变量,这2个变量的名字是可以相同的,不会产生冲突。
  • 当我们在函数的局部作用域去使用这个变量时,是优先调用当前最近的作用域定义的那个变量。
  • 如果在局部作用域里面要调用全局作用域的相同名字的变量,可以这样写:

我们回到刚才讨论的代码compare上:

  • 在全局有3个函数的定义,现在呢,我们在main函数局部进行了一个函数的声明;
  • 因为调用的话,有函数声明就足够了,main函数的3个compare函数在调用的时候,编译器就在最近的作用域,也就main函数局部作用域看到一个函数的声明,就是参数为int的compare函数,所以大家都去调用这个参数为int的compare函数了。
#include 
using namespace std;


bool compare(int a, int b)//compare_int_int
{
	cout << "compare_int_int" << endl;
	return a > b;
}
bool compare(double a, double b)//compare_double_double
{
	cout << "compare_double_double" << endl;
	return a > b;
}
bool compare(const char* a, const char* b)//compare_const char*_const char*
{
	cout << "compare_char*_char*" << endl;
	return strcmp(a, b) > 0;
}
int main()
{
	bool compare(int a, int b);
	compare(10, 20);//call compare_int_int
	compare(10.0, 20.0);//double -> int
	compare("aaa", "bbb");//const char* => int

	return 0;
}
3、const或者volatile的时候,是怎么影响形参类型的?


这2个func函数的作用域相同,函数名也相同,看它们的参数列表,是相同还是不相同呢?

对于编译器来说,它看这2个func函数是一样的。

我们去查看一下:

  • 包含这个typeinfo头文件;



    对于编译器来说,它们的类型都是整型int,所以2个func函数的符号也是一模一样的,形参类型都是int

我们加个指针看看效果,好像就运行可以了:



  • 又报错了。
  • const或者volatile的时候,是怎么影响形参类型的?(下一篇博客叙述)
4、一组函数,函数名相同,参数列表也相同,仅仅是返回值不同,是重载吗?
  • 不叫重载
  • 因为返回值和函数重载没有关系!
  • 虽然函数名 相同,但是最终生成的符号是不相同的,符号是 函数名+形参列表,生成符号的时候,是** **。

静态(编译时期)的多态:(包含函数重载 )

  • 函数重载(在编译时期,在生成指令的时候就要确定好调用哪个函数重载了,因为函数的调用要进行时实参的入栈,call指令调用函数。)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/862176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号