文章目录

  • 函数重载
    • 函数重载概念
    • 面试题:为什么C++支持函数重载,而C语言不支持函数重载呢?
      • 验证:C语言不支持函数重载
      • 为什么C++支持重载呢
      • g++的修饰函数名规则
      • Windows下名字修饰规则
    • 函数重载的作用
    • 函数重载是一种静态多态:

函数重载

函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数
形参列表(参数个数类型或顺序)必须不同,常用来处理实现功能类似数据类型不同的问题

 在C++中不仅函数可以重载,运算符也可以重载,例如:运算符<<,>>,既可以做移位运算符,也可以做输出,输入运算符,

*注意:重载函数的参数个数,参数类型或参数顺序三者中必须有一个不同*

  • 参数个数 类型 形参的顺序

函数重载例子

void func(int a, char c)  //1
{cout << "func(int a, char c)" << endl;
}void func(char c,int a)     //2
{cout << "func(char c,int a)" << endl;
}void func(int a)            //3
{cout << "func(int a)" << endl;
}
void func(double b,int a ,char c)  //4
{cout << "func(double b,int a ,char c)" << endl;
}
// 1 2 3 4 都是重载函数
int main()
{//我们在调用该函数时,函数会根据参数情况进行选择相应的函数.func(1, 'a');func('b', 1);func(1);func(3.14, 1, 'a');return 0;
}


  • 返回值不同,但是形参相同 -> 不能构成重载函数 ->调用的时候不能进行区分
void func(int a)
{}int func(int a)
{}


  • 缺省值不同,不能构成重载
void func(int b = 2)
{}void func(int a = 3)
{}

重载和参数的名字无关

和参数个数 类型 形参的顺序有关


  • 形参是:无参和有参能构成重载,但空调用会产生歧义

void func()
{cout << "func()" << endl;
}
void func(int a = 0)
{cout << "fuc(int a = 0)" << endl;
}
int main()
{//func();  产生歧义func(1);return 0;
}


总结:

  • 函数名称必须相同,
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等),
  • 函数的返回类型可以相同也可以不相同,
  • 仅仅返回类型不同不足以成为函数的重载,

面试题:为什么C++支持函数重载,而C语言不支持函数重载呢?

程序编译过程



验证:C语言不支持函数重载

->结果

gcc 编译就是C语言 g++就是C++


屏蔽掉一个函数之后:


若不屏蔽:使用C++编译:


为什么C++支持重载呢

回顾程序执行的过程

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接,

我们使用linux的gcc编译器对如下程序进行编译,以编译程序test.c为例:
gcc -E——预处理,生成的文件test.i
gcc -S——编译生成汇编代码,生成的文件为test.S
gcc -c——汇编生成机器码,生成的文件test.o

gcc——执行链接,生成默认名为a.out的可执行文件



有了函数声明,编译阶段就让过了,编译器会认为函数定义在其他地方,后续在链接时候,再去找它的定义

C++支持和C语言不支持重载,就是链接这个位置出的问题


C语言不支持函数重载,因为编译的时候,两个重载函数,函数名相同,在.o文件的符号表中存在歧义和冲突,其次在链接的时候也存在歧义和冲突,因为C语言查找函数是直接使用函数名取标识和查找,而重载函数,函数名相同

  • 语言查找函数是直接使用函数名取标识和查找

在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变


若采用C++编译器g++编译后结果

在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中,


g++的修饰函数名规则
_Z + 函数名长度 + 函数名 + 参数首字母

例如

void func(int a,int* p)
{}

_Z + 函数名长度 + 函数名 + 参数首字母

_Z 4 func i pi (指针加前缀p)


而C语言对函数名的处理

直接使用函数名取标识和查找

所以重载函数的函数名相同就不能通过了

C编译器直接用函数名关联,函数名相同时,它无法区别


C语言没办法支持重载,因为同名函数没办法区分,

而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载, 另外我们也可以看出,为什么函数重载要求参数(类型/顺序/个数)不同!而跟返回值没关系,

函数名相同,只要参数不同,修饰出来的名字就不同,就能区分了,就支持重载



Windows下名字修饰规则

函数重载的作用

重载函数通常用来在同一个作用域内 用同一个函数名 命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处,


函数重载是一种静态多态:

(1)多态:用同一个东西表示不同的形态;
(2)多态分为:
静态多态(编译时的多态);
动态多态(运行时的多态);
(3)函数重载是一种静态多态;

【C++入门篇】深入理解函数重载相关推荐

  1. 〖Python零基础入门篇㉟〗- 私有函数、私有变量及封装

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  2. .NetCore 入门篇:理解

    (良心转载)原文地址:https://ken.io/note/dotnet-core-qucikstart-preface 一..NET Core的诞生 聊 .NET Core,就不得不说他的爸爸 . ...

  3. 【C/C++语言入门篇】-- 文件操作

    [C/C++语言入门篇]-- 文件操作 收藏 此文于2010-03-09被推荐到CSDN首页 如何被推荐? 最近实在是太忙了,这篇整整就推迟了1个月了,实在是对不起.之前本打算这个模块就结束了,文件操 ...

  4. C++ C++基础语法入门总结(一)命名空间-输入输出-缺省参数-函数重载

    C++基础语法入门总结 C++ 命名空间 如何定义和使用命名空间 C++ 输入与输出 C++ 缺省参数 C++函数重载 名字修饰 extern "c" 推荐阅读 C++ 命名空间 ...

  5. 从C快速入门C++ (命名空间、引用、函数重载)

    从C快速入门C++ (命名空间.引用.函数重载) C++关键字 const const 的存储位置 结论: 命名空间 C++预处理器 和 iostream 文件 头文件名 命名空间使用 函数重载 默认 ...

  6. MySQL零基础从入门到精通(函数篇)

    MySQL零基础从入门到精通(函数篇) 在MySQL中,为了提高代码重用性和隐藏实现细节,MySQL提供了很多函数.函数可以理解为别人封装好的模板代码. 分类 聚合函数 数学函数 字符串函数 日期函数 ...

  7. MySQL数据库,从入门到精通:第七篇——MySQL单行函数应用

    MySQL数据库,从入门到精通:第七篇--MySQL单行函数应用 第七篇_单行函数 1. 函数的理解 1.1 什么是函数 1.2 不同DBMS函数的差异 2. 数值函数 2.1 基本函数 2.3 三角 ...

  8. Python入门篇-匿名函数

    Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...

  9. 深入理解C++重载函数

    深入理解C++重载函数 1.定义:C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,即函数的参数列表不同,也就是说用同一个运算符完成不 ...

最新文章

  1. jq处理 php数组,jQuery数组处理方法汇总_jquery
  2. python连接elasticsearch查询数据
  3. 计算机网络中各层的协议图表(TCP/IP)
  4. Nginx 代理转发阿里云OSS上传的实现代码
  5. mysql查询每个表的描述_MS SQL SERVER 读取数据库中每个表的描述/注释以及表中字段/列的字段名,字段类型,字段描述/注释/说明等信息...
  6. 2020年后台开发程序员应该学习的8大技术
  7. Action重定向总结
  8. permission denied是什么鬼?
  9. WebClient上传文件至服务器和下载服务器文件至客户端
  10. 名词解释——元数据和数据字典
  11. VPP buffer不足
  12. python汇率换算注释_【菜鸟学Python】案例一:汇率换算
  13. error: conflicting types for 错误原因及解决办法
  14. 杨辉三角 SDUT
  15. 计算机无法进bios,电脑进入不了bios界面怎么办_win7无法进入bios界面如何解决-系统城...
  16. PDF文件如何设置密码保护?
  17. linux下并行运行脚本与让程序可靠运行
  18. 易友八字合婚系统发布(支持同性基友拉拉兼容)1.01发布
  19. php读取pdf文件乱码_PHP读取文件,解决中文乱码UTF-8的方法分析
  20. fiddler接口基础

热门文章

  1. 如何使用Ajax进行与服务器交互
  2. uniapp实现点击播放mp3音频文件
  3. 编程中的逻辑实现,三种逻辑结构(顺序、循环、分支)、跳转、函数以及错误处理
  4. 关于likely()与unlikely函数
  5. Docker的平行空间通信
  6. QGIS基础教程 (入门级)——下载安装、新建工程、加载数据
  7. 关于优化公式的小白理解
  8. 【机器学习】——梯度下降法的收敛性证明(详解)
  9. uni-app手机调试equest:fail abort
  10. Request header field x-xsrf-token is not allowed by Access-Control-Allow-Headers in preflight respon