浅谈c++引用
浅谈c++
在这里开设 <<浅谈C++>> 系列专题,针对C++重点内容展开探讨与观察底层,同时也是一个面试专栏,所选知识大多为面试常见问题.前期较为基础,难度会逐渐上升哦~
本专栏采用经典的哲学三段论编写:是什么|为什么|怎么做
力图精简,高效.
第一章: 浅谈C++函数重载
传送门
- 浅谈c++
- 什么是引用
- 为什么存在引用
- 我们平常如何使用引用
- 常引用
- 两个重要使用场景
- 做参数
- 做返回值
- 引用与指针的不同点
- 总结
什么是引用
引用不是新定义一个变量,是给已经存在的变量取了一个别名,引用变量不会开辟
新的内存空间,它和它引用的变量共用一块内存空间.
类型& 对象名 = 引用实体;
以上是一些使用特征,有
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
指针在没有const修饰下可以指向其他地址
为什么存在引用
既然C语言通过指针能够很好的进行内存操作,那为什么会在C++新增引用这样的操作.
C++中引用最初是为了解决运算符重载的问题;
关于运算符重载,我们会在本专栏下一章**<<浅谈C++类和对象>>**中进行整理.
另一个特点就是可以引用临时对象;也是类和对象话题.
实践中,使用指针通常会有:
- 空指针
- 野指针
- 人为修改指针变量但不知情
引用则有:
- 引用不允许为空(空指针)
- 定义初始化(野指针)
- 只能指向一个实体(值修改)
我们平常如何使用引用
常引用
C语言中我们可以借助const关键字对指针进行控制,引用和指针这么像,那么const可不可以用于引用呢?
产生如上报错
运行成功
权限的放大
这样呢?
运行成功
权限的缩小
取别名的原则:对原引用变量,权限只能缩小,不能放大,经过const修饰,权限变为只读.
那么,我们可不可以给常量取别名呢?
int a = 10;
int &b = a;
int &c = 20;//?
当然不可以,原理同上,20作为常量权限为只读,直接进行引用属于权限的放大.
const int &c = 20;
权限相同即可
继续观察如下代码
double d = 3.14;
const int& e = d;
已知引用有必须指向相同类型的特性,为什么这样的代码可以运行呢?
C语言存在隐式类型转换,C++以C语言为基础,沿用了这种特性.
数据转换时会产生临时变量,会把转换后的数据取出存放进来,且具有常性质,是只读的.const引用则指向了这块临时变量,是临时变量的别名.
之后临时变量会拷贝到e,e的改变不影响临时变量.
e是临时变量的别名,不再指向d.
从此,临时变量的生命周期就跟着e走啦!!!
涉及到了函数传参问题,当函数的参数为引用时,就要注意参数之间的权限匹配问题啦.只能相等或缩小,不能放大.
//void func(const int& x)就可以啦
void func(int& x)
{}int main()
{int a = 10;const int &b = a;func(a);func(b);//是不可以滴return 0;
}
两个重要使用场景
做参数
void Swap(int &x, int &y)
{int tem = x;x = y;y = tem;
}
void Swap(double &x, double &y)
{double tem = x;x = y;y = tem;
}int main()
{int a = 0;int b = 1;Swap(a, b);double c = 1.2;double d = 3.4;Swap(c, d);
}
不像以前C语言时需要借助指针解引用那么麻烦,传入了变量的别名,指向同一块地址,直接可以进行修改.
也可以做输出型参数(薄纱C)
同时传引用的效率高于传值或者传指针20-30倍.
意义:
- 输出型参数
- 减少拷贝,提高效率
做返回值
静态变量的补充:在同一个作用域只会初始化一次,指向的是同一块地址.
传值返回
int count()
{static int n = 0;n++;return n;
}int main()
{int ret = count();return 0;
}
传值返回过程中,会产生一个临时变量,如果数据较小,将用寄存器代替,如果数据较大,则会在上一层栈帧中开辟预留空间进行拷贝.会先将n传给临时变量,临时变量拷贝到ret;当n没有用static修饰时,在函数栈帧中,出了count的作用域n就会销毁,所以需要临时变量的帮助.
传引用返回
int &count()
{static int n = 0;n++;return n;
}int main()
{cout << count() << endl;cout << count() << endl;cout << count() << endl;return 0;
}
产生一个引用类型的临时变量,相当于临时变量是返回值n的别名,临时变量有传给了count,即把n传回,减少了传值返回临时变量开辟的空间,意味着返回了n的别名.
- 传值返回:会有一个拷贝
- 传引用返回:没有拷贝,返回的就是返回变量的别名.
那count函数的空间归还了,n的别名还在吗?,如果我们取消了static修饰并且用ret接收了返回值,那么以后使用ret会出现问题吗?
这是一个由引用间接引起的野指针问题.
一般的,如果函数返时,出了函数的作用域,如果返回对象还在没有归还系统,则可使用引用返回,如果已经还给系统,必须使用传值返回,否则就可能会出现越界问题
与后续知识强相关,在以后章节中细谈.
引用与指针的不同点
- 引用概念上定义一个变量的别名,指针存储一个变量地址
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化后引用一个实体,就不能引用其他实体,指针可以随时指向同类型实体
- 没有NULL引用,但又NULL指针
- sizeof中,引用为引用类型的大小,指针始终是地址空间所占字节个数
- 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但没有多级引用
- 访问实体方式不同,指针需要显示解引用,引用由编译器处理
- 引用比指针相对安全
语法角度来说,引用是一个别名,没有额外开空间
底层的角度来说,引用与指针的实现方式是一样的
总结
对C++引用的探讨,希望可以帮助到看官
为了做一个全面的复习,作者决定开始同时开辟**<<浅谈C++>>与<<浅谈Linux>>**两个专栏,交错更新,都是对基础知识的较深探讨,对知识起巩固整理的作用.同时也会穿插一些方法类,框架类,算法相关的零散文章.
下一章:<<浅谈C++类和对象>>
码字不易,期待三连~
相关文章:

浅谈c++引用
浅谈c 在这里开设 <<浅谈C>> 系列专题,针对C重点内容展开探讨与观察底层,同时也是一个面试专栏,所选知识大多为面试常见问题.前期较为基础,难度会逐渐上升哦~ 本专栏采用经典的哲学三段论编写:是什么|为什么|怎么做 力图精简,高效. 第一章: 浅谈C函数重载 传送门…...

2023什么是分销商城?怎么搭建分销商城
当实体机构都接连探索线上营销模式的时候,分销也随着社交电商的兴起应运而生。 大家好,我是你们熟悉而又陌生的好朋友梦龙,一个创业期的年轻人 它借助裂变效率高的属性,建立更多用户触点,更好的提升企业运营的势能&am…...

408数据结构考点总结
文章目录第一章 绪论考点 1:时间复杂度与空间复杂度时间复杂度空间复杂度第二章 线性表考点 2:顺序表考点 3:单链表第三章 栈和队列考点 4:栈和队列的基本性质考点5:循环队列考点6:双端队列输出受限的双端队…...

虹科分享 | 网络流量监控 | 你的数据能告诉你什么:解读网络可见性的4种数据类型
要了解网络性能问题的原因,可见性是关键。而这四种数据类型(流、数据包、SNMP和API)都在增强网络可见性方面发挥着重要作用。 流 流是通过网络发送的数据的摘要。流类型不同,可以包括NetFlow, sFlow, jFlow和IPFIX。不同的流类型…...
SpringBoot日志框架使用详解
几种常见的日志级别由低到高分为:TRACE < DEBUG < INFO < WARN < ERROR < FATAL 。如何理解这个日志级别呢?很简单,如果项目中的日志级别设置为INFO ,那么比它更低级别的日志信息 就看不到了,即是TRACE…...

剑指offer-消失的数字、数组中出现的次数
消失的数字 解法一:求和相减 假设nums为[0,1,2,4],消失的数字为3,完整的数组应该是[0,1,2,3,4],则sum101247,sum20123410,我们很容易发现 sum2-sum1 01234 - 0124 3,即为消失的数字。因此,我们可以采用先…...
axios请求配置baseURL选项
在src同级目录创建 (1).env.delelopment : 开发模式时调用 (2).env.production :生产模式时调用 (3).env.testing : 测试模式时调用 # 页面标题 VITE_APP_TITLE 若依管理系统# 生产环境配…...

风储VSG-基于虚拟同步发电机的风储并网系统MATLAB仿真
MATLAB2021b版本仿真模型:风力发电机模块、储能控制模块、功率计算模块、VSG控制模块、电压电流双环控制模块。永磁同步风机输出功率、储能系统输出功率以及逆变器输出功率曲线。直流母线电压波动曲线。逆变器输出电压、电流曲线。完整模型见博主资源!&a…...

vim常用命令
vim常用三种模式 命令模式(Command mode) 插入模式(Insert mode) 末行模式(Last line mode) (一)进入命令模式 vi 或者 vim(二)命令模式 -> 插入模式 &…...
华为OD机试 - 最差产品奖 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...

HR:你会Python数据分析吗?
之前看到一个段子: 以前去面试,HR会问你“精通office吗?” 现在去面试,HR会问你“会Python数据分析吗?” 图片来源:网络 大数据时代,无论是数据分析师、研发,到运营、市场、产品经…...

算法18:LeetCode_链表相关算法题
链表无小事,只要是涉及到链表的算法题,边界值的设定尤为重要,而且及其容易出错误。这就要求我们平时多加练习。但是,我们在面试和笔试的过程中往往会碰到链表相关的题目,所以我们在笔试的时候一般都会借助系统提供的工…...

SpringBoot集成Tomcat服务
文章目录一、Tomcat集成1、依赖层级2、自动化配置二、Tomcat架构三、Tomcat配置1、基础配置2、属性配置类3、配置加载分析四、周期管理方法1、控制类2、核心方法使用的成本越低,内部封装越复杂; 一、Tomcat集成 1、依赖层级 在SpringBoot框架的web依赖…...

【机器学习】决策树-C4.5算法
1.C4.5算法 C4.5算法与ID3相似,在ID3的基础上进行了改进,采用信息增益比来选择属性。ID3选择属性用的是子树的信息增益,ID3使用的是熵(entropy, 熵是一种不纯度度量准则),也就是熵的变化值&…...

actipro-winforms-controls-23.1.0 Crack
actipro-winforms一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件,用于构建 IDE 的高级停靠窗口、MDI、属性网格、树控件和文件夹/文件浏览器,用于常见数据类型、自动完成、屏蔽编辑和代码编辑的强大编辑器,功能区、图表、微型图表、…...

适合打游戏用的蓝牙耳机有哪些?吃鸡无延迟的蓝牙耳机推荐
现在手游的兴起,让游戏市场变得更加火爆,各种可以提高玩家体验的外设也越来越多,除了提升操作的外置按键与手柄外,能带来更出色音质与舒心使用的游戏耳机,整体氛围感更好,让玩家在细节上占据优势࿰…...
1000:入门测试题目[不一样的题解][85种写法]【A+B问题】
题目: 1000:入门测试题目 时间限制: 1000 ms 内存限制: 32768 KB 提交数: 262857 通过数: 158152 【题目描述】 求两个整数的和。 【输入】 一行,两个用空格隔开的整数。 【输出】 两个整数的和。 【输入样例】 2 3 【输出样例】…...

FastReport .NET 2023.1.13 Crack
FastReport .NET 使用来自 ADO .NET 数据源的数据。它可以排序和过滤数据行,使用主从关系和查找数据列。一切都可以通过点击几下鼠标来完成。 直接连接到 ADO、MS SQL 或基于 xml 的数据库。其他连接器可作为插件使用。 能够从 IEnumerable 类型的业务对象中获取数…...
unzip: cannot find zipfile directory in one of
下面是执行flutter doctor 后报错内容 End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last …...
RFC4543: Galois Message Authentication Code (GMAC);CONFIG_CRYPTO_GCM
在2010年这个算法被Linux社区加进来:说明算法还是挺重要,普遍使用。 commit 73c89c15b959adf06366722c4be8d2eddec0a529 Author: Tobias Brunner <tobias@strongswan.org> Date: Sun Jan 17 21:52:11 2010 +1100crypto: gcm - Add RFC4543 wrapper for GCMThis patc…...
caliper config.yaml 文件配置,解释了每个配置项的作用和注意事项
以下是添加了详细备注的 config.yaml 文件配置,解释了每个配置项的作用和注意事项: # Caliper 性能测试主配置文件 # 文档参考: https://hyperledger.github.io/caliper/# 测试轮次配置 - 可以定义多个测试轮次,每个轮次测试不同的合约或场景 rounds:# 第一个测试轮次 - 测试…...
html表格转换为markdown
文章目录 工具功能亮点1.核心实现解析1. 剪贴板交互2. HTML检测与提取3. 转换规则设计 2. 完整代码 在日常工作中,我们经常遇到需要将网页表格快速转换为Markdown格式的场景。无论是文档编写、知识整理还是数据迁移,手动转换既耗时又容易出错。本文将介绍…...

vue+cesium示例:地形开挖(附源码下载)
基于cesium和vue绘制多边形实现地形开挖效果,适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本:推荐v18。 运行工具:vscode或者其他工具。 配置方式&#x…...
C++.OpenGL (5/64)变换(Transformation)
变换(Transformation) 变换矩阵核心概念 #mermaid-svg-OvPP9vqkY9MRAHyd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OvPP9vqkY9MRAHyd .error-icon{fill:#552222;}#mermaid-svg-OvPP9vqkY9MRAHyd .error-tex…...
Github 2025-06-04 C开源项目日报 Top7
根据Github Trendings的统计,今日(2025-06-04统计)共有7个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目7C++项目1Assembly项目1jq:轻量灵活的命令行JSON处理器 创建周期:4207 天开发语言:C协议类型:OtherStar数量:27698 个Fork数量:1538 …...

每日Prompt:每天上班的状态
提示词 一个穿着清朝官服的僵尸脸上贴着符纸,在电脑面前办公,房间阴暗,电脑桌面很乱,烟灰缸里面满是烟头...

2025远离Deno和Fresh
原创作者:庄晓立(LIIGO) 原创时间:2025年6月6日 原创链接:https://blog.csdn.net/liigo/article/details/148479884 版权所有,转载请注明出处! 相识 Deno,是Nodejs原开发者Ryan Da…...
【Go面试陷阱】对未初始化的chan进行读写为何会卡死?
Go面试陷阱:对未初始化的chan进行读写为何会卡死?深入解析nil channel的诡异行为 在Go的世界里,var ch chan int 看似人畜无害,实则暗藏杀机。它不会报错,不会panic,却能让你的程序悄无声息地"卡死&qu…...

《Linux运维总结:宝德服务器RAID开启(方式一)》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 说明:从客户那里退回来的一台宝德服务器,硬盘不见了,现在需要用两个2T的硬盘…...

移动端测试岗位高频面试题及解析
文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别? 解析:网络波动(弱网测试)、设备碎片化(机型适配&…...