【C++】函数重载+引用
大家好,我是苏貝,本篇博客带大家了解C++的函数重载和引用,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 一. 预处理、编译、汇编、链接
- 二. 函数重载
- 1 概念
- 2 C++支持函数重载的原理—名字修饰
- 三. 引用
- 1 概念
- 2 引用特性
- 3 常引用(权限的缩小/放大)
- 4 使用场景
- 5 引用和指针的区别
一. 预处理、编译、汇编、链接
在C/C++中,一个程序要运行起来,需要经历以下4个阶段:预处理、编译、汇编、链接
- 预处理:头文件展开,宏替换,条件编译,去掉注释
- 编译:检查语法,形成汇编代码。如果函数的声明和定义分离,那么main函数所在文件中有函数声明就可以编译成功
- 汇编:把汇编代码转成二进制机器码
- 链接:将同一项目文件经过汇编后形成的文件合并到一起,符号表的合并和符号表的重定位。
如果函数的声明和定义分离,那么此时编译器就会通过函数名到符号表(符号表可用于确定变量或函数在内存中的位置)里查找函数的地址(地址通过函数的定义确定),所以如果没有函数定义,编译器会报错
下面用Linux的文件经过上述4个步骤后形成的文件举例
因为预处理阶段会展开头文件,因此以.cpp为后缀的文件中就将头文件的内容拷贝了,所以预处理结束后,Stack.h文件不会再形成.i文件
二. 函数重载
1 概念
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
参数个数不同
参数的类型不同
参数的顺序不同
2 C++支持函数重载的原理—名字修饰
为什么C语言不支持函数重载,而C++支持呢?因为名字修饰
在C/C++中,一个程序要运行起来,需要经历预处理、编译、汇编和链接。链接时,面对调用的函数(如Add函数),链接器会使用哪个名字去找呢?这里每个编译器都有自己的 函数名修饰规则。由于Linux的函数名修饰规则简单,vs的较为复杂,因此我们下面用Linux来演示
用gcc编译器
写出test.c的代码
用gcc编译写出可执行程序,再使用objdump -S a.out来查看函数名修饰
我们发现,C语言的函数名修饰规则就是用自己的函数名,所以不能存在同名函数,否则编译器区分不开
采用g++编译器
将上面的test.c的内容拷贝到test1.cpp中,用g++编译形成可执行程序a.out,再执行命令objdump -S a.out查看函数名修饰
我们发现,C++的函数名修饰规则就不是用自己的函数名了。在Linux中,函数名修饰以_Z为前缀,后接函数名的字符个数,再接函数名,最后是函数形参的类型缩写(按顺序)。所以如果还有函数void f(int a),那么经过修饰,结果为_Z1fi
通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。另外如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
三. 引用
1 概念
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间
比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。铁牛和黑旋风就是李逵的别名
类型& 引用变量名(对象名) = 引用实体;
注意:引用类型必须和引用实体是同种类型的
第一个&表示引用,之后的两个&是对变量取地址。由结果知,引用变量b和它引用的变量a公用一块内存空间
根据上面的了解,看看下面代码的结果是什么?
答案是12,因为引用变量b和它引用的变量a公用一块内存空间
2 引用特性
- 引用在定义时必须初始化
- 引用定义后,不能改变指向
- 一个变量可以有多个引用
3 常引用(权限的缩小/放大)
权限可以缩小,但不能放大
1.它是我们常见的引用;
2.引用c被const修饰,表示不能通过修改c而修改a,由a的可读可写变为c的只读,这是权限的缩小。
3.10是只读的,但d是可读可写的,权限不能放大,报错
4.10是只读的,e也是只读的,权限不变,不会报错
5.x是只读的,但y是可读可写的,权限不能放大,报错
1err,2ok
表达式的返回值以临时变量的形式存储,临时变量具有常性,不能修改,即只读,因此引用的话要加const。
权限不能放大,func参数的形参:a+b的返回值和10都是只读的,实参:int& a是可读可写的,权限放大了,报错
发生类型转换时,中间会产生临时变量。
- 由double变为int,会发生强制类型转换,产生临时变量。相当于(int)d后, 得到了一个没有名字的变量,它的类型为int,值为1,我们把这个临时变量(1)拷贝给变量a,在执行完该语句后临时变量会被释放
- 由double变为类型为int的引用,会发生类型转换,产生临时变量,临时变量具有常性,因此要在引用前加const
4 使用场景
- 做参数
我们对swap函数已经很熟悉了,之前函数的形参都是指针,现在我们用引用来当形参
注意:引用做形参时,引用变量名可以和实参名一样,但不建议
- 做返回值
查看下面代码,它的结果是什么?
结果是10,毫无疑问。那么,函数func1返回的是a吗?不是,a出了func1的函数作用域就被销毁,所以返回的是a的拷贝。
那下面代码的结果呢?
随机值。因为func1函数运行结束后,该函数对应的栈空间就被回收了,所以变量a的空间被回收,然而函数的返回值是变量a的别名,它是野引用,因此用ret接受函数返回值时也就是访问了已被回收的a的空间,故结果是随机值
如果我们仔细一点的话,我们还能看到编译器会报警告。至于为什么警告是说返回的是地址而非引用,我们下面会讲到
通过上面的了解,我们知道,如果函数的返回值出了该函数的作用域就被销毁(如局部变量),那就不能用引用返回。因此,能用引用返回的,是全局变量/静态变量/堆上变量等
5 引用和指针的区别
从语法上:
- 引用是别名,不开空间,指针要开空间
- 引用必须初始化,指针可以不初始化。所以引用更安全,因为没有空引用,但有空指针。容易出现野指针,但不容易出现野引用
- 引用不能改变指向,指针可以
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节,64位平台下占8个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
从底层上:
在汇编层面上,没有引用,都是指针,引用编译后也转成指针了。因此,引用在底层上也要开空间,但我们一般都说引用不开空间(语法层面)
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️
相关文章:

【C++】函数重载+引用
大家好,我是苏貝,本篇博客带大家了解C的函数重载和引用,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 预处理、编译、汇编、链接二. 函数重载1 概念2 C支持函数重载的原理—名字修饰…...
华为S5735交换机console密码重置和恢复出厂设置
比较简单,简单说就是进入bootload清除密码,然后进入default mode下重置密码。 1.开机按CtrlB,进入启动加载菜单(BootLoad menu) 拨电源重启交换机,大约开机10多秒的时候会出现提示按CtrlB可以进入BootLoa…...

Spring Security无脑使用
步骤1:添加Spring Security依赖 在你的Spring Boot项目的pom.xml文件中,添加Spring Security的依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</art…...

学习 PostgreSQL + Spring Boot 3 +mybatisplus整合过程中的报错记录
今天计划学习 PostgreSQL,并顺便尝试使用 Spring Boot 3.x 框架,打算整合 Spring Boot 3、PostgreSQL 和 MyBatis-Plus。整合后一直出现以下报错: 去AI上面搜了讲的是sqlSessionFactory 或 sqlSessionTemplate 没有正确配置 初始分析&#…...

立仪光谱共焦传感器在玻璃测量技术上的突破
近年来,随着科技的不断发展,光谱共焦传感器逐渐成为了工业检测领域的重要工具。尤其是在玻璃这种透明材质的厚度测量中,光谱共焦传感器展现出了其独特的优势。立仪科技小编将围绕光谱共焦传感器在玻璃行业中的应用,从问题、分析到…...

Llama系列上新多模态!3.2版本开源超闭源,还和Arm联手搞了手机优化版,Meta首款多模态Llama 3.2开源!1B羊驼宝宝,跑在手机上了
Llama系列上新多模态!3.2版本开源超闭源,还和Arm联手搞了手机优化版,Meta首款多模态Llama 3.2开源!1B羊驼宝宝,跑在手机上了! 在多模态领域,开源模型也超闭源了! 就在刚刚结束的Met…...

系统缺失mfc140.dll的修复方法,有效修复错误mfc140.dll详细步骤
mfc140.dll丢失原因分析 1 系统文件损坏或病毒感染 系统文件损坏或被病毒感染是导致mfc140.dll丢失的常见原因之一。根据用户反馈和安全研究报告,大约有30%的mfc140.dll丢失案例与系统文件损坏或病毒感染有关。病毒、木马或其他恶意软件可能会破坏或删除系统中的m…...

移动app的UI和接口自动化测试怎么进行?
标题:从0到1:移动App的UI和接口自动化测试 导语:移动App的快速发展使得UI和接口自动化测试成为了确保应用质量的重要环节。本文将从零开始介绍移动App的UI和接口自动化测试的基本概念以及如何进行测试。 第一部分:了解移动App自动…...

Unity实现自定义图集(二)
以下内容是根据Unity 2020.1.0f1版本进行编写的 实现一个自定义图集,该怎么入手呢。首先简单思考一下unity是怎么实现图集的。 因为unity的ui部分是开源的,所以我们可以看到UGUI的源代码,另外,Unity的内置Shader也是开源的,可以直接在官网下载(在下载的网页选择Built…...
智能码二维码zhinengma.cn的动态数据更新是如何实现的?
智能码二维码的动态数据更新功能是通过其背后的技术原理实现的,主要依赖于服务器和二维码的链接结构。以下是具体介绍: 动态数据更新的实现原理 链接嵌入:动态二维码中嵌入了一个链接,该链接指向服务器上的数据源。数据请求与更…...
uniapp view怎么按长度排列一行最多四个元素,并且换行后,每一行之间都有间隔
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

Android列表组件api
目录 1.ListView控件 1)android:divider 2)android:dividerHeight 3)android:entries 4)android:footerDividersEnabled 5)android:headerDividersEnabled 6)android:listSelector 7)android:sc…...
ToB项目身份认证AD集成(完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法介绍
在前面的两篇文章中,我详细的介绍了使用ldap与window AD服务集成,实现ToB项目中的身份认证集成方案,包括技术方案介绍、环境配置: ToB项目身份认证AD集成(一):基于目录的用户管理、LDAP和Active…...
SpringBoot+SeetaFace6搭建人脸识别平台
前言 最近多个项目需要接入人脸识别功能,之前的方案是使用百度云api集成,但是后续部分项目是内网部署及使用,考虑到接入复杂程度及收费等多种因素,决定参考开源方案自己搭建,保证服务的稳定性与可靠性 项目地址&…...

MySQL-06.DDL-表结构操作-创建
一.DDL(表操作) create database db01;use db01;create table tb_user(id int comment ID,唯一标识,username varchar(20) comment 用户名,name varchar(10) comment 姓名,age int comment 年龄,gender char(1) comment 性别 ) comment 用户表; 此时并没有限制ID为…...

在Visual Studio中使用CMakeLists.txt集成EasyX库的详细指南
EasyX库是一款专为Windows平台设计的轻量级C图形库,适合初学者和教育领域使用。结合Visual Studio和CMake工具链,用户可以轻松创建C项目,并集成EasyX库,实现丰富的图形编程效果。本文将详细介绍如何在Visual Studio中通过CMakeLis…...

CRC码计算原理
CRC8这里先以CRC8来说明CRC的计算过程1、CRC8在线计算器通过CRC在线计算器可以看见CRC8的特征多项式:x8+x2+x+1,初始值为0000’0000。CRC计算的核心是:反转+异或+移位(此处的CRC8没有涉及反转,见后面CRC16)。2、CRC8计算过程(1)、取值从高到低依次取需校验数据的位,这里…...

对高危漏洞“Docker Engine API is accessible without authentication”的修复
一.背景 之前文章maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网_1panel 构建镜像-CSDN博客将1Panel软件的Doocker端口给到了局域网,安全组兄弟扫描认为是高危漏洞,可能导致攻击者获取对Docker主机的完全控制权。 二.修复的建…...

两种方式创建Vue项目
文章目录 引言利用Vue命令创建Vue项目准备工作安装Vue CLI创建Vue项目方法一:使用vue init命令方法二:使用vue create命令启动Vue项目 利用Vite工具创建Vue项目概述利用Vite创建项目启动项目 结语 引言 大家好,今天我将向大家展示如何使用不…...

深入理解 C/C++ 指针
深入理解 C 指针:指针、解引用与指针变量的详细解析 前言 在 C 编程语言中,指针 是一个非常强大且重要的概念。对于初学者来说,指针往往会让人感到困惑不解。本文将通过形象的比喻,帮助大家深入理解指针、解引用与指针变量的概念…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...