C++ 函数重载:女友说的话到底是什么意思?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在这里插入图片描述


目录


一、前言

C语言小朋友最近谈了个女朋友但是他很苦恼。因为他经常不能理解自己女朋友说话的意思。小C第一次和女友约会时自己先到了对方却还没出门电话询问女友表示“你给我等着”,于是听话的小C就站在原地等待女友的到来。第二次约会自己没到女友却先到了接到电话女友表示“你给我等着”于是小C马上向上次一样站在原地等待但是这次却没有等到女友的到来。

小C对这一现象表示十分的不理解。明明是一句话为什么女友执行的却是不同的操作

对于这个问题小C找到了自己恋爱经验丰富的舔狗大哥C++想从他那找到答案。
在这里插入图片描述

二、函数重载

1、函数重载概念

在自然语言中一个词可以有多重含义人们可以通过上下文和语气来判断该词真实的含义即该词被重载了。前言中女友对小C说的“你给我等着”就是一个具有多重含义的词。在不的情况下表达的意思不同。

在C语言中当两个函数的函数名称一模一样的时候我们的程序也会无法识别到底使用那个函数。于是C语言的大哥C++在C语言的基础上扩充了函数重载。

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

举个C语言被惨拒的例子

int Wait(int a)
{
	printf("宝贝你真懂我\n");
	return a;
}
double Wait(double a)
{
	printf("分手吧你根本不懂我\n");
	return a;
}
int main()
{
	Wait(1);
	Wait(1.1);
	return 0;
}

在这里插入图片描述

2、函数重载的分类

Ⅰ、参数类型不同

为了解决C语言的情感问题C++传授给C语言的第一招就是看女友函数说话定义时的脸色参数类型

C++现场拨通了女神的电话向C语言进行了展示

int Wait(int a)
{
	printf("宝贝你真懂我\n");
	return a;
}
double Wait(double a)
{
	printf("分手吧你根本不懂我\n");
	return a;
}
int main()
{
	Wait(1);
	Wait(1.1);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

看着C语言目瞪口呆的样子C++知道这招C语言是学不会了。于是他准备教小C第二招。

Ⅱ、参数个数不同

C++传授给C语言的第二招就是看女友函数说话定义时的情绪参数个数

C++现场拨通了第二个女神的电话并再次向C语言进行了展示

void Wait()
{
	printf("宝贝你真懂我\n");
}
void Wait(double a)
{
	printf("分手吧你根本不懂我\n");
}
int main()
{
	Wait();
	Wait(1.1);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
C++没有说话看着C他决定把自己压箱底的东西教给他。

Ⅲ、参数类型顺序不同

C++传授给C语言的第三招就是看女友函数说话定义时的动作参数类型顺序

C++现场拨通了第三个女神的电话并再次向C语言进行了展示

void Wait(int a , double b)
{
	printf("宝贝你真懂我\n");
}
void Wait(double a, int b)
{
	printf("分手吧你根本不懂我\n");
}
int main()
{
	Wait(1,2.2);
	Wait(2.2,1);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3、函数重载的原理

C++明白自己的老弟C语言永远不可能学会这一技能了。但是他还是把原理向C语言解释了。
C/C++中一个程序要运行起来需要经历以下几个阶段预处理、编译、汇编、链接
在这里插入图片描述
在这里插入图片描述

实际项目通常是由多个头文件和多个源文件构成当前a.cpp中调用了b.cpp中定义的Add函数时编译后链接前a.o的目标文件中没有Add的函数地址因为Add是在b.cpp中定义的所以Add的地址在b.o中。所以链接阶段就是专门处理这种问题链接器看到a.o调用Add但是没有Add的地址就会到b.o的符号表中找Add的地址然后链接到一起。面对Add函数链接接器会使用哪个名字去找呢这里每个编译器都有自己的函数名修饰规则。

Ⅰ、在Linux下

在这里插入图片描述
在这里插入图片描述
在linux下采用gcc编译完成后函数名字的修饰没有发生改变。而采用g++编译完成后函数名字的修饰发生改变编译器将函数参数类型信息添加到修改后的名字中。

通过上面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

Ⅱ、在Windows下

Windows下名字修饰规则
在这里插入图片描述
对比Linux会发现windows下vs编译器对函数名字修饰规则相对复杂难懂但道理都是类似的。

Ⅲ、原理总结

在这里插入图片描述

C语言没办法支持重载就因为同名函数没办法区分。而C++是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。
在这里插入图片描述
C++表示如果两个函数函数名和参数是一样的返回值不同。这样是不构成重载的因为调用时编译器没办法区分。

在这里插入图片描述

📢📢📢📢📢📢
💗 你正在阅读【子夜的星】 的博客
👍 阅读完毕可以点点小手赞一下
🌻 发现错误直接评论区中指正吧
👑如果对你有用记得点个关注哦

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++