IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 想知道c++中为什么支持函数重载,函数重载的底层原理是什么?为什么c++支持而c不支持?不妨进来看看。 -> 正文阅读

[C++知识库]想知道c++中为什么支持函数重载,函数重载的底层原理是什么?为什么c++支持而c不支持?不妨进来看看。

<一>函数重载

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

int Add(int x1, int x2){
	return x1 + x2;
}

//参数数量不同
int Add(int x1, int x2, int x3){
	return x1 + x2 + x3;
}

//参数类型不同
double Add(double x1, double x2){
	return x1 + x2;
}


//参数顺序不同
void fun(int x, char y){
	printf("fun(int x, char y)");
}
void fun(char x, char y){
	printf("fun(char x, char y)");
}


int main(){
	printf("%d", Add(2, 3));
	printf("%d", Add(2, 3, 4));
	printf("%lf", Add(2.0, 3.0));
	fun(1, 'a');
	fun('a', 1);
	return 0;
}

注意:

  • 函数重载可以给缺省值。但是要注意 fun(全缺省) 和 fun(无参) 这种虽然也叫函数重载但是无参调用的时候会造成二义性的问题。建议不要这样写。
  • 在c++中的输入(cin)输出(cout)能够自动识别类型 ,其实底层运用的函数重载的问题。

<二>函数重载的原理

我们有时候会想为什么c++支持函数重载,而c语言却不支持函数重载(在C语言中函数名不可以是相同的)。

这里先给大家拓展一下一个程序要运行起来需要经理的阶段。一般需要四个阶段:预处理,编译,汇编,链接。

没个阶段主要做什么我就不详细讲解了 ,建议自己去查一下,网上有很多的文章。

这里不一样c和c++不一样的一点就是函数名的修饰规则(name mangling)不一样。

在c语言中函数的修饰规则就是函数名,用函数名来唯一决定确定一个函数

在c++中会把参数也修饰进函数的修饰规则,

这里我们一g++和gcc为例,vs下函数的修饰规则太复杂了 。

在g++中

?在gcc中

?可以看到c++,在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

而c语言不会只有函数名没有参数的相关信息。自然不能支持函数重载。

  • 注意:
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分
  • 返回值不同是函数重载的原因是:调用的地方可以指定函数的参数,但是却无法指定函数的返回值。不支持重载的原因是调用的时候存在二义性,无法区分。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:13:43  更:2022-10-17 12:14:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 7:32:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码