【C++】函数重载+引用

news2024/11/23 19:37:02

大家好,我是苏貝,本篇博客带大家了解C++的函数重载和引用,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 预处理、编译、汇编、链接
  • 二. 函数重载
    • 1 概念
    • 2 C++支持函数重载的原理—名字修饰
  • 三. 引用
    • 1 概念
    • 2 引用特性
    • 3 常引用
    • 4 使用场景
    • 5 引用和指针的区别

一. 预处理、编译、汇编、链接

在C/C++中,一个程序要运行起来,需要经历以下4个阶段:预处理、编译、汇编、链接

  1. 预处理:头文件展开,宏替换,条件编译,去掉注释
  2. 编译:检查语法,形成汇编代码。如果函数的声明和定义分离,那么main函数所在文件中有函数声明就可以编译成功
  3. 汇编:把汇编代码转成二进制机器码
  4. 链接:将同一项目文件经过汇编后形成的文件合并到一起,符号表的合并和符号表的重定位。
    如果函数的声明和定义分离,那么此时编译器就会通过函数名到符号表(符号表可用于确定变量或函数在内存中的位置)里查找函数的地址(地址通过函数的定义确定),所以如果没有函数定义,编译器会报错

下面用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 引用特性

  1. 引用在定义时必须初始化

在这里插入图片描述

  1. 引用定义后,不能改变指向

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

  1. 一个变量可以有多个引用

在这里插入图片描述

3 常引用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4 使用场景

  1. 做参数
    我们对swap函数已经很熟悉了,之前函数的形参都是指针,现在我们用引用来当形参
    在这里插入图片描述

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

注意:引用做形参时,引用变量名可以和实参名一样,但不建议

  1. 做返回值
    查看下面代码,它的结果是什么?
    在这里插入图片描述

结果是10,毫无疑问。那么,函数func1返回的是a吗?不是,a出了func1的函数作用域就被销毁,所以返回的是a的拷贝。

那下面代码的结果呢?
在这里插入图片描述

随机值。因为func1函数运行结束后,该函数对应的栈空间就被回收了,所以变量a的空间被回收,然而函数的返回值是变量a的别名,它是野引用,因此用ret接受函数返回值时也就是访问了已被回收的a的空间,故结果是随机值

如果我们仔细一点的话,我们还能看到编译器会报警告。至于为什么警告是说返回的是地址而非引用,我们下面会讲到

在这里插入图片描述

通过上面的了解,我们知道,如果函数的返回值出了该函数的作用域就被销毁(如局部变量),那就不能用引用返回。因此,能用引用返回的,是全局变量/静态变量/堆上变量等

5 引用和指针的区别

从语法上:

  1. 引用是别名,不开空间,指针要开空间
  2. 引用必须初始化,指针可以不初始化。所以引用更安全,因为没有空引用,但有空指针。容易出现野指针,但不容易出现野引用
  3. 引用不能改变指向,指针可以
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占4个字节,64位平台下占8个字节)
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  6. 有多级指针,但没有多级引用
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

从底层上:
在汇编层面上,没有引用,都是指针,引用编译后也转成指针了。因此,引用在底层上也要开空间,但我们一般都说引用不开空间(语法层面)


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

『网络游戏』制作加载进度UI【04】

将上一章的提示界面隐藏 创建空节点重命名为LoadingWnd 设置父物体为伸展 创建一个image背景重命名为bg 将以下资源放进Art文件夹 设为精灵模式后拖拽 将下面资源图片放进Art文件夹 创建Image作为进度条重命名为loadingbg 复制一份重命名为loadingfg 将loadingfg设置为水平填充…

Stable Diffusion绘画 | AI 图片智能扩充

来到「文生图」页面,输入固定的起手式提示词。 第1步,开启 ControlNet,将需要扩充的图片加载进来: 控制类型选择「Inpaint」,预处理器选择「inpaint_onlylama」,缩放模式选择「缩放后填充空白」&#xff1…

OpenStack Yoga版安装笔记(十六)Openstack网络理解

0、前言 本文将以Openstack在Linux Bridge环境下的应用为例进行阐述。 1、Openstack抽象网络 OpenStack的抽象网络主要包括网络(network)、子网(subnet)、端口(port),路由器(rout…

Android15车载音频之Virtualbox中QACT实时调试(八十八)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

Python--暂停一秒输出

在编程实践中,我们经常需要让程序在执行特定操作后暂停一段时间。Python中的time模块提供了一个简单而强大的sleep()函数,允许程序暂停指定的时间。本文将通过一个具体的例子,展示如何使用sleep()函数来实现每隔一秒输出一次当前时间的最后两…

爱心曲线公式大全

local r a*((math.sin(angle) * math.sqrt(math.abs(math.cos(angle)))) / (math.sin(angle) 1.4142) - 2 * math.sin(angle) 2) local x r * math.cos(angle) -- 计算对应的x值 local z r * math.sin(angle) 1.5*a - --曲线公式绘画 local function generateParabola()…

Golang | Leetcode Golang题解之第463题岛屿的周长

题目: 题解: type pair struct{ x, y int } var dir4 []pair{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}func islandPerimeter(grid [][]int) (ans int) {n, m : len(grid), len(grid[0])for i, row : range grid {for j, v : range row {if v 1 {for _, d :…

深度学习---------------------------------自注意力和位置编码

目录 自注意力跟CNN、RNN对比位置编码位置编码矩阵 绝对位置信息相对位置信息总结自注意力和位置编码自注意力该部分总代码 位置编码该部分总代码 二进制表示在编码维度上降低频率该部分总代码 自注意力 给定一个由词元组成的输入序列 x 1 x_1 x1​,…, x n x_n xn​&#xff…

基于web的网上摄影工作室的开发与实现源码+论文

项目简介 基于springboot实现的,主要功能如下: 技术栈 后端框框:springboot/mybatis 前端框架:html/JavaScript/Css/vue/elementui 运行环境:JDK1.8/MySQL5.7/idea(可选)/Maven3&#xff08…

基于ssm实现的建筑装修图纸管理平台(源码+文档)

项目简介 基于ssm实现的建筑装修图纸管理平台,主要功能如下: 技术栈 后端框框:spring/springmvc/mybatis 前端框架:html/JavaScript/Css/vue/elementui 运行环境:JDK1.8/MySQL5.7/idea(可选&#xff09…

农业政策与市场分析:解读当前政策导向下的农业发展趋势

在快速变化的全球经济格局中,农业作为国家稳定发展的基石,其政策走向与市场动态备受瞩目。本文将深入剖析当前的农业政策背景,探讨其对设计的导向作用,以及市场趋势的反馈与影响,为农业可持续发展提供洞见。 1. 政策背…

SAP学习笔记 - 豆知识11 - 如何查询某个字段/DataElement/Domain在哪个表里使用?

大家知道SAP的表有10几万个(也有说30多万个的,总之很多就是了),而且不断增多,那么当想知道一个字段在哪个表里使用的时候该怎么办呢? 思路就是SAP的表其实也是存在表里的:)&#xf…

k8s 中的 PV 的动态供给

目录 1 存储类 Storageclass 介绍 1.1 StorageClass 说明 1.2 StorageClass 的属性 2 存储分配器 NFS Client Provisioner 2.1 官网存储分配器的部署介绍 2.2 实现动态创建 PV 模版清单文件的介绍 2.2.1 Storageclass 存储类的模版 2.2.2 创建 Provisioner 制备器的模版 2.2.3…

数据结构与算法——动态规划算法简析

1.初步了解动态规划 由于本篇博客属于动态规划的初阶学习,所以大多都是简单的表示,更深层次的学术用语会在之后深度学习动态规划之后出现,本文主要是带各位了解一下动态规划的大致框架 1.1状态表示 通常的我们会开辟一个dp数组来存储需要表示…

centos7 yum仓库无法使用的问题

1、问题 如下 2、按照csdn等网页说的做了没有用!CentOS-yum源不可用报错:Could not retrieve mirrorlist 问题解决_yum could not retrieve mirrorlist-CSDN博客 3、使用b站博主的方法解决! LinuxMirrors: GNU/Linux 一键更换系统软件源脚本…

切片辅助超推理-sahi库-slice_image使用

代码地址:https://github.com/obss/sahi slice_image是sahi库中一个函数,理解这个函数是理解切片的入口。 一、官方函数使用示例 from sahi.slicing import slice_imageimage_pathrsmall-vehicles1.jpeg output_dirrashi_result output_file_name1-#手…

LeetCode 3311. 构造符合图结构的二维矩阵

LeetCode 3311. 构造符合图结构的二维矩阵 给你一个二维整数数组 edges ,它表示一棵 n 个节点的 无向 图,其中 edges[i] [ui, vi] 表示节点 ui 和 vi 之间有一条边。 请你构造一个二维矩阵,满足以下条件: 矩阵中每个格子 一一对应…

力扣之1336.每次访问的交易次数

题目: sql建表语句: Create table If Not Exists Visits (user_id int, visit_date date); Create table If Not Exists Transactions (user_id int, transaction_date date, amount int); Truncate table Visits; insert into Visits (user_id,…

如何让客户主动成为你的品牌大使

在销售领域,转介绍被公认为一把无坚不摧的利器,它不仅铸就了高成交率的辉煌,更以惊人的速度缩短了成交周期。一位精通转介绍艺术的销售员,其业绩自然熠熠生辉,工作之路亦显得游刃有余。 然而,面对这一宝藏…

Bianchi模型、python计算及ns3验证_关于2~10 STA验证的补充

首先就是预设修改, NS3中bitrate是OfdmRate54Mbps,STA数目我设置了2-10,ack长度是14bytes,数据长36,头36(trace中只有1536和14两个长度,也就是数据长度1500,头36,ack14),SIFS和SLOT是16us和9us(在phy的定义中,11a的时候,sifs是16,slot是9),difs是34us(在bia…