【C++】C++入门 函数重载

news2025/1/16 21:58:52

前言

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。

函数重载

  • 一、函数重载定义
  • 二、函数重载的条件
    • 1. 参数类型不同
    • 2. 参数个数不同
    • 3. 参数类型顺序不同
  • 三、函数重载的原理--名字修饰(name Mangling)
  • 四、补充与总结


一、函数重载定义

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

#include<iostream>
using namespace std;

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
int main()
{
	int a = Add(1, 2);
	double b = Add(1.1, 2.2);
	cout << a << endl;
	cout << b << endl;

	return 0;
}

在这里插入图片描述
我们可以看到定义了一个Add函数来求两个不同类型数的和,在调用过程中系统会自动根据其实参的类型不同来实现准确调用。

在C++中不仅函数可以重载,运算符也可以重载。例如:

运算符<<,>>。既可以做移位运算符,也可以做输出,输入运算符。

二、函数重载的条件

1. 参数类型不同

int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

2. 参数个数不同

void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
    cout << "f(int a)" << endl;
}

3. 参数类型顺序不同

void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

注意:函数重载的返回类型可以相同也可以不相同,仅仅返回类型不同不足以成为函数的重载。因为调用函数不一定就需要去接收返回值

三、函数重载的原理–名字修饰(name Mangling)

为什么C++支持函数重载,而C语言不支持函数重载呢?
在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。
在这里插入图片描述
在编译阶段,编译器会对函数名进行修饰

  • C语言中
    在这里插入图片描述
    由于C语言只会给函数进行简单的重命名,具体的方法是给函数名之前加上”_”;所以加入两个函数名相同的函数在编译之后的函数名也照样相同,调用时会因为不知道到底调用那个而出错,所以C语言中不支持函数重载。
  • C++中
    在编译阶段,虽然两个函数的函数名一样,但是编译器会根据形成函数重载的条件对它们的函数名进行修饰,让他们在符号表中生成的名称不一样。
    由于在.cpp文件中,两个函数生成的符号表中的名称不一样,所以是可以编译通过的。

C++在不同的平台下修饰规则不太一样,Windows下vs的修饰规则有些复杂,而Linux下g++的修饰规则简单易懂

  • 在windows 下
    在这里插入图片描述
    ?Add@@YAHHH@Z
    ?代表开始
    Add代表原本的函数名
    @@YA代表参数的开始
    第一个H代表返回值类型int
    后面的H代表int参数,M代表float参数
    @Z表示名称结束。

  • 在Linux下

在这里插入图片描述
_Z3Addii
_Z代表开始
3代表原本函数名的长度
Add代表原本的函数名
第一个i代表第一个参数是int
第二个i代表第二个参数是int

可以看出在Linux下g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。

四、补充与总结

多态:用同一个东西表示不同的形态;多态分为:

  • 静态多态(编译时的多态);
  • 动态多态(运行时的多态);

函数重载就是一种静态多态;

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/198023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么把网页变成灰色?怎么让头像或某一部分不变灰色?filter/backdrop-filter/mix-blend-mode/svg/grayscale(1)

在国家公祭日&#xff0c;我们哀悼沉思&#xff0c;势要勿忘国耻振兴中华&#xff1b;在国家重要人物逝世后&#xff0c;举国哀悼&#xff1b;这些时段很多网站都会积极呼应&#xff0c;给与自己的网页设置成灰色&#xff1b;那给网页设置成灰色是经过怎样的设置来实现的呢&…

利用pandas_udf加速机器学习任务

note pandas udf和python udf区别&#xff1a;前者向量化是在不同partition上处理pandas_udf使用panda API来处理分布式数据集&#xff0c;而toPandas()将分布式数据集转换为本地数据&#xff0c;然后使用pandas进行处理&#xff0c;如果Pyspark的dataframe非常大&#xff0c;…

快速排序和归并排序哪个快?

两个排序的基本思想都是分治&#xff08;分而治之&#xff09;,实现一般都使用递归实现。1.快速排序双边指针&#xff08;交换法&#xff09;&#xff1a;记录分界值 &#xff0c;创建左右指针&#xff08;记录下标&#xff09;。以第一个元素为分界值&#xff0c;先从右向左找…

C语言指针变量作为函数参数

在C语言中&#xff0c;函数的参数不仅可以是整数、小数、字符等具体的数据&#xff0c;还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部&#xff0c;使得在函数内部可以操作函数外部的数据&#xff0c;并且这些数据不会随着函数的结束而被销毁…

ocelot的单节点解决方案

ocelot的问题前面我们解决了consul的单节点的集群扩建。这里讨论如果在多客户端访问时&#xff0c;单网关也会有瓶颈。如果单台挂掉&#xff0c;那么也会麻烦&#xff0c;所以根据项目需要解决问题。ocelot多节点部署最简单的粗暴解决&#xff0c;多部署几台网关。但是我们需要…

mac环境和windows环境下GeoServer如何安装部署

geoserver是从事GIS行业都应当了解的一个gis服务器。 所以说学会geoserver是一个非常必要的事情。那么这篇文章呢我就带着大家来一起学习如何在Mac机器上和windows机器上安装并部署Geoserver。 首先不管是哪个环境我们都需要去官网上先下载安装包。 第一步我们要去geoserver的…

【计算机组成原理】y = a * b + c 的执行具体流程

文章目录1.2.2 认识各个硬件部件1. 主存储器的基本组成2. 运算器的基本组成3. 控制器的基本组成4. 计算机的工作流程1.2.2 认识各个硬件部件 1. 主存储器的基本组成 存储体&#xff1a;存放数据和指令地址寄存器&#xff1a;用来存放读取存储体数据时存放的具体位置数据寄存器…

12、字符(串)输入、输出

目录 一、字符数据输入&#xff0f;输出 1. 字符数据输入 2. 字符数据输出 二、字符串输入&#xff0f;输出 1. 字符串输入函数 2. 字符串输出函数 一、字符数据输入&#xff0f;输出 1. 字符数据输入 字符数据输入使用的是getchar函数&#xff0c;其作用是从终端&…

前端遇到的问题

inputs-outputs https://angular.cn/guide/inputs-outputs 用于父组件与子组件间的值传递 在项目中引入核心组件 父组件在其html界面绑定属性 在子组件里通过Input传递值 具体里: 使用默认规则数组绑定固定值(比如id)的错误 这里两个ts文件之间传值,采用了一个get函数,…

微信小程序 view组件的基本使用

1.view基本理论 能看图就尽量减少文字提示&#xff0c;从图书可以看出ABC是纵向排列的。 为什么会纵向排列而不是横向排列&#xff0c;那是因为view是块元素&#xff0c;能占满整一行。 怎么让view块元素横向并排呢&#xff1f; 向上图一样横向排列&#xff0c;接下来教学从0…

Kerberos协议与认证数据包分析

Kerberos协议 Kerberos是一种在开放的非安全网络中认证并识别用户身份信息的方法, 它旨使用密钥加密技术为客户端/服务端应用程序提供强身份认证。 目前主流的Kerberos版本是2005年的RFC4120标准的Kerberos v5, Windows、Linux和MacOs均支持Kerberos协议。Kerberos基础 Kerbe…

Quartz入门看这一篇文章就够了

第一章 Quartz简介 第一节 Quartz是什么? 1Quartz [kwɔːts]是一个完全由Java编写的开源的作业调度框架第二节 Quartz可以用来做什么? 比如说买火车票下单之30分钟之后,查看是否付款付款完成之后,在乘车日期的时候是否乘车或者每个月1号扣房贷每个月20号自动还信用卡想定时…

为什么要使用采购管理软件 采购管理软件推荐

在企业发展道路上&#xff0c;采购部门是一个非常重要的组织&#xff0c;它会直接影响到企业的经济效益。企业在采购活动中&#xff0c;如果还是采用传统线下的采购方式&#xff0c;那么很容易导致采购信息不集中&#xff0c;效率低&#xff0c;出错率高&#xff0c;最终损害企…

爱情呼叫转移-深度广度遍历合集

1.这件事是特殊的&#xff0c;还是普遍的&#xff1f; 工作中常常会遇到各种各样的问题&#xff0c;不管黑猫白猫&#xff0c;抓到老鼠就是好猫。哪只猫好&#xff0c;往往需要对比分析。 如何做数据对比&#xff0c;需要加入哪些数据来分析&#xff0c;在哪里进行数据对比&am…

查找 二分查找 (终极巩固)

二分条件&#xff1a; 1) 序列有序 2&#xff09;支持随机访问 二分思想&#xff1a; 大体思想是二分之后如果目标值在左侧&#xff0c;则中间包括右边区间所有pass掉 right mid - 1; 目标在右侧&#xff0c;则中间包括左边所有pass left mid 1; 注意点 left < rig…

Python Fiddler抓包工具教学,获取公众号(pc客户端)数据

前言 今天来教大家如何使用Fiddler抓包工具&#xff0c;获取公众号&#xff08;PC客户端&#xff09;的数据。 Fiddler是位于客户端和服务器端的HTTP代理&#xff0c;是目前最常用的http抓包工具之一。 开发环境 python 3.8 运行代码pycharm 2021.2 辅助敲代码requests 第三方…

VS2022 开发Qt之修改软件图标

开发环境本次实验使用的开发环境是win10 64位系统 IDE使用VS2022,Qt版本是Qt5,15.写博客背景最近再练习使用VS开发Qt,到修改软件图标的事情.在网上搜索了一番大部分修改图标的都是基于Qt自带的编译器,由于本人使用的VS的IDE和自带的编译器设置方法有所不同,在一番查找实验后还整…

【论文学习】YOLOv1-YOLOv4

文章目录You Only Look Once,Unified ,Real-Time Object DetectionAbstractIntroductionUnified DetectionNetwork DesignTrainingInferenceLimitations of YOLOComparison to Other Detection SystemsYOLO9000:Better,Faster,StrongerAbstractIntroductionBetterBatch Normali…

【C++之类和对象】日期类的实现

目录前言一、日期类的基本样式二、构造函数三、拷贝构造函数四、赋值运算符重载五、日期比较1. 判断一个日期是否小于另一个日期2. 判断一个日期和另一个日期是否相等3. 判断一个日期是否小于等于另一个日期4. 判断一个日期是否大于另一个日期5. 判断一个日期是否大于等于另一个…

独孤九剑xss通关教程

独孤九剑xss通关教程 独孤九剑第一式&#xff1a; 这里过滤了 () 构造payload&#xff1a; ?data"><svg><script>%26%23x65%3B%26%23x76%3B%26%23x61%3B%26%23x6c%3B%26%23x28%3B%26%23x6c%3B%26%23x6f%3B%26%23x63%3B%26%23x61%3B%26%23x74%3B%26%23…