C++初阶函数重载

news2024/9/22 0:18:41

目录

    • 函数重载
    • 函数名修饰规则

函数重载

C语言不允许同名函数
CPP可以,但是要求构成函数重载
函数名相同,参数不同(参数类型、参数个数、参数类型的顺序),返回值不同不能构成重载

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;
}
void Swap(int* p1, int* p2)
{
	//...
}

void Swap(double* p1, double* p2)
{
	//...
}
int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.1, 2.2) << endl;

	int i = 1, j = 2;
	double k = 1.1, l = 2.2;
	Swap(&i, &j);
	Swap(&k, &l);
	//cout << i;
	//cout << k;

	return 0;
}
cout<<i;
cout<<k;

自动识别类型的原理就是函数重载,这是两个函数调用然后是int就匹配int是double就匹配double

不同域就不存在函数重载的问题了

namespace dz1
{
	void func(int x)
	{}
}

namespace dz2
{
	void func(double x)
	{}
}

因为相同命名空间会自动合并,所以如果两个命名空间都是dz1时,可以构成函数重载

函数重载跟缺省参数没有关系

函数名相同参数不同就构成重载

// 构成函数重载
void func(int a)
{
	cout << "void func(int a)" << endl;
}

void func(int a, int b = 1)
{
	cout << "void func(int a, int b)" << endl;
}

int main()
{
	func(1, 2);

	// 调用存在歧义,不知道调用哪个
	// func(1);


	return 0;
}

是重载没错,但是调用的时候就出问题了
func(1, 2);没有歧义
func(1);调用存在歧义

函数名修饰规则

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

  1. 实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前Test.cpp中调用了b.cpp中定义的func函数时】,编译后链接前,Test.o的目标文件中没有func的函数地址,因为func是在b.cpp中定义的,所以func的地址在b.o中。
  2. 链接阶段就是专门处理这种问题,链接器看到Test.o调用func,但是没有func的地址,就会到b.o的符号表中找func的地址,然后链接到一起
  3. 链接时,面对func函数,链接接器会使用名字去寻找地址

c语言找的时候是用函数名去找的:在这里插入图片描述
c语言用名字找地址的机制是直接用函数名充当在符号表中的名字,在符号表中找函数地址的时候相同名字就分不清了,所以c语言不允许重名

c++把两个函数区分开来的方法和函数名修饰规则有关,不同的编译器有不同的规则,vs的规则比较复杂,Linux下g++的修饰规则比较简单易懂

Windows下vs
只给声明不给定义的时候vs会出现报链接错误,(有声明没有定义无法生成地址,在符号表中拿名字找不到地址,就会报这个错误) 不是c语言那样拿func这个名字去找,而是下图括号中修饰以后的函数名去找。两个修饰后的名字很长,但是有一些细节可以观测,比如H代表int,N代表double,本质是把类型带进名字中了

在这里插入图片描述

linux下g++
在这里插入图片描述

linux下的名字是_Z是前缀,4是函数名的字节数,然后后面的 i d,i是int,d是double

c++找函数地址,函数的地址本质上是第一句指令的地址

在这里插入图片描述

把类型带进名字中
所以类型的个数不同,类型不同,类型的顺序不同,修饰出来的名字都不同,就可以区分出来,找到对应地址。

在函数修饰规则中没有代入返回值。返回值不同不能构成函数重载也可以解释。

如果函数修饰规则中代入返回值,返回值不同能不能构成函数重载?
不能。
在这里插入图片描述

函数修饰规则能解决符号表的问题,但是调用还是不知道调用谁( 除非把调用规则也更改了,调用的时候void func (1.1 , 1)这样调用,这样很难设计 )

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

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

相关文章

【JS交互篇】BOM基础、Window、Location、Navagator、Screen、History对象

一、BOM 概述 在 JavaScript 语言中有三种对象&#xff1a;内置对象、宿主对象、自定义对象。 宿主对象就是执行 JavaScript 脚本的环境所提供的对象。对于网页编程来说&#xff0c;js 是运行在浏览器上的&#xff0c;所以对于网页编程来说&#xff0c;宿主对象就是浏览器对象…

“我要找到你”——主动救助,让乡村重疾儿童看病不再“两眼一抹黑”

走出医院&#xff0c;主动寻找 郑小伟是河北省阜平县妇幼保健院的儿科主任&#xff0c;在这里工作快20年了。从2021年11月开始&#xff0c;她的桌上一直摆着厚厚一叠阜平县重疾儿童住院名单。她对着上面的名字一个个打电话&#xff0c;手机打不通&#xff0c;就换座机再接着打…

高级语言相关理论[编译VS解释,动态VS静态,强类型VS弱类型]

编译型语言 VS 解释型语言 计算机高级语言按程序执行方式分为编译型和解释型 编译型和解释型语言的执行流程 编译型语言 所有源代码一次性通过编译器转换成二进制指令,即生成一个可执行程序(如Windows下的.exe),可执行程序包含的就是机器码;且无需重新编译,实现一次编译,无限…

Grafana集成prometheus(1.Prometheus安装)

下载docker镜像 docker pull prom/prometheus docker pull prom/node-exporter启动 node-exporter 该程序用以采集机器内存等数据 启动脚本 docker run -d -p 9100:9100 prom/node-exporter ss -anptl | grep 9100启动截图 prometheus 启动脚本 # 3b907f5313b7 为镜像i…

工业电子中的安森美推出PWM控制器 NCP1252ADR2G 用于正向和反激应用

NCP1252ADR2G 深力科 控制器提供了构建专用于 ATX 电源和任何正向应用的成本高效且可靠的 AC-DC 开关电源所需的一切内容。由于使用内部固定的计时器&#xff0c;可以在不依赖辅助 Vcc 的情况下检测输出过载。欠压输入针对低输入电压提供保护&#xff0c;提高了转换器安全性。最…

c语言——杨辉三角

//杨辉三角 #include<stdio.h> int main() {int i,j,k,n0,a[10][10];while(n<0||n>13){/*行数不超过13&#xff0c;为了显示规范*/printf("n即输入行数");scanf("%d",&n);}printf("%d行杨辉三角如下&#xff1a;\n",n);for(i1;i…

迁移学习:使用Restnet预训练模型构建高效的水果识别模型

目录 引言 1 迁移学习 1.1 什么是迁移学习 1.2 迁移学习能解决什么问题 1.3 迁移学习面临的三个问题 1.3.1 何时迁移 1.3.2 何处迁移 1.3.3 如何迁移 1.4 迁移学习的分类 1.4.1 按照学习方式的划分 1.4.2 按照使用方法的划分 2 Restnet网络 2.1 Restnet介绍 2.2 Re…

【FAQ】EasyGBS平台通道显示在线,视频无法播放并报错400的排查

EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;它可以支持国标协议的设备接入&#xff0c;在视频能力上能实现直播、录像存储、检索与回放、云台控制、告警上报、语音对讲、平台级联等功能&#xff0c;既能作为业务平台使用&#xff0c;也能作为能力层平台调用。 我…

sentinel组件

目录 定义 4.加SentinelResource,blockHander是超过阈值之后执行的函数 5.设置阈值 6.springboot集成sentinel 定义 1.sentinel知道当前流量大小&#xff0c;在浏览器和后端之间加sentinel控制流量&#xff0c;避免大批量的瞬时请求都达到服务上&#xff0c;将服务压垮 2.…

数学建模-爬虫系统学习

尚硅谷Python爬虫教程小白零基础速通&#xff08;含python基础爬虫案例&#xff09; 内容包括&#xff1a;Python基础、Urllib、解析&#xff08;xpath、jsonpath、beautiful&#xff09;、requests、selenium、Scrapy框架 python基础 进阶&#xff08;字符串 列表 元组 字典…

Ceph入门到精通-远程开发Windows下使用SSH密钥实现免密登陆Linux服务器

工具&#xff1a; win10、WinSCP 服务器生成ssh密钥&#xff1a; 打开终端&#xff0c;使账号密码登录&#xff0c;输入命令 ssh-keygen -t rsa Winscp下载 Downloading WinSCP-6.1.1-Setup.exe :: WinSCP window 生成密钥 打开powershell ssh-keygen -t rsa 注意路径 …

招投标系统简介 企业电子招投标采购系统源码之电子招投标系统 —降低企业采购成本 tbms

​功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

js获取30天前的日期(不含今天)

js获取30天前的日期&#xff08;不含今天&#xff09; 例如&#xff1a;2023-8-4 let currentDate new Date(); // 获取当前日期currentDate.setDate(currentDate.getDate() - 30); // 将当前日期减去30天let year currentDate.getFullYear(); // 获取年份let month current…

行业追踪,2023-08-03

自动复盘 2023-08-03 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Element-plus中tooltip 提示框修改宽度——解决方案

tooltip 提示框修改宽度方法&#xff1a; 在element中&#xff0c;想要设置表格的内容&#xff0c;超出部分隐藏&#xff0c;鼠标悬浮提示 可以在el-table 上添加show-overflow-tooltip属性 同时可以通过tooltip-options配置提示信息 如下图代码 <el-tableshow-overflo…

C语言笔试训练【第二天】

文章目录 第一题 第二题 第三题 第四题 第五题 第六题 第七题 大家好&#xff0c;我是纪宁。 今天是C语言笔试训练的第二天&#xff0c;一起加油&#xff01; 第一题 1、以下程序段的输出结果是&#xff08; &#xff09; #include<stdio.h> int main() {char…

【雕爷学编程】 MicroPython动手做(38)——控制触摸屏

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

Android 9-- 源码角度: Home键的监听和拦截

在做应用层APP需求的过程中&#xff0c;HOME键的监听&#xff0c;Back键的监听&#xff0c;这都是很常见的问题&#xff0c;那你有试过&#xff0c;去拦截HOME键的事件吗&#xff0c;有去了解过如何处理吗&#xff0c;流程如何 首先大家应该先了解一种情况&#xff0c;就是Andr…

Grafana集成prometheus(2.Grafana安装)

查找镜像 docker search grafana下载指定版本 docker pull grafana/grafana:10.0.1启动容器脚本 docker run -d -p 3000:3000 --namegrafana grafana/grafana:10.0.1查看是否启动 docker ps防火墙开启 检查防火墙3000端口是否开启 默认用户及密码 admin/admin 登录 ht…

Mapping温度分布验证选择数据记录仪时需要考虑的13件事

01 什么是温度分布验证&#xff1f; 温度分布验证是通过在规定的研究时间内测量定义区域内的多个点来确定特定温度控制环境或过程&#xff08;如冷冻柜、冰箱、培养箱、稳定室、仓库或高压灭菌器&#xff09;的温度分布的过程。温度分布验证的目标是确定每个测量点之间的差异&…