首页 > 编程语言 >C++ 函数重载:女友说的话到底是什么意思?

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

时间:2023-02-05 12:31:36浏览次数:50  
标签:函数 int C++ C语言 女友 重载 Wait

一、前言

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++表示:如果两个函数函数名和参数是一样的,返回值不同。这样是不构成重载的,因为调用时编译器没办法区分。

在这里插入图片描述

标签:函数,int,C++,C语言,女友,重载,Wait
From: https://blog.51cto.com/zxhy/6038258

相关文章

  • C++学生信息管理系统[2023-02-05]
    C++学生信息管理系统[2023-02-05]25、学生信息管理系统设计要求实现如下功能:1.建立学生信息数据,包括学号、姓名、性别、三科成绩、出生时间、年龄(由出生时间计算得到)......
  • C/C++图书管理系统[2023-02-05]
    C/C++图书管理系统[2023-02-05]选题二十三:图书管理系统【问题描述】设计一个计算机管理系统完成图书管理基本业务。 【任务要求】(1)每种书的登记内容包括书号、书名、......
  • C/C++航班信息的查询系统[2023-02-05]
    C/C++航班信息的查询系统[2023-02-05]选题十七:航班信息的查询系统[问题描述]该设计要求对飞机航班信息进行排序和查找。可按航班的航班号、起点站、到达站、起飞时间以......
  • C++基础编程题
     一、第一种类型题,普遍是简单运算计算球的体积V=4/3πr^3,输入球的半径r,求出体积保留3位小数#include<bits/stdc++.h>usingnamespacestd;intmain(){double......
  • C/C++内存对齐原则
    C/C++内存对齐what&&why当用户自定义类型时(struct或class),编译器会自动计算该类型占用的字节数。C/C++为什么要内存对齐?我道行太浅,摘抄了网上的一个解释。为了方......
  • Effective Modern C++ 第六章 lambda 表达式
    lambda能做到的,手写也能做到,但是lambda实在是太方便了,以至于对C++开发产生了颠覆性的影响:常用场景STL_if算法族的谓词智能指针的自定义析构器线程API的条件......
  • 【C++ 泛型编程01:模板】函数模板与类模板
    【模板】除了OOP外,C++另一种编程思想称为泛型编程,主要利用的技术就是模板C++提供两种模板机制:函数模板和类模板函数模板函数模板作用建立一个通用函数,其函数......
  • C++函数总结
    1、fabs返回浮点数的绝对值,abs返回整数绝对值2、运算符重载之后排序比写一个排序函数排序要快structnode{intx,y,z;booloperator<(constnode&p)const{retur......
  • C++基础语法资料
     一、C++基本语法变量名是由字母、数字和下划线字符组成,并且开头不能是数字。大小写不同的变量是不同的。变量名不能是关键字,如for、if等都是不能作为变量名的C++基本......
  • 【八大数据排序法】快速排序法的图形理解和案例实现 | C++
    第十八章快速排序法:::hljs-center目录第十八章快速排序法●前言●认识排序●一、快速排序法是什么?1.简要介绍2.具体情况3.算法分析●二、案例实现1.......