【C++精华铺】3.C++入门 引用(const)、内联函数
目录
1. 引用
1.1 引用特性
1.2 常引用
1.2.1 权限放大
1.2.2 权限缩小
1.3 使用场景
1.3.1 传参
1.3.2 做返回值
1.4 传值和传引用的效率比较
1.5 引用和指针的区别
2. 内联函数
2.1 inline
2.2 特性
1. 引用
在C++中,引入了一个新的概念引用,与传统的定义变量不同,传统的定义变量是新开一份空间来存储数据,而引用则是给一个已经存在的空间起一个别名,它和引用的变量共用同一份空间。

1.1 引用特性
- 引用必须在定义的时候初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体就不能在引用其他实体
int a = 0;int& b = a;int& c = a;cout << a << ' ' << b << ' ' << c << endl;cout << &a << ' ' << &b << ' ' << &c << endl;
输出:
0 0 0
000000B0DDAFF6A4 000000B0DDAFF6A4 000000B0DDAFF6A4
从上述的输出可以很明显的看出引用是和被引用的实体共用用一块空间。
1.2 常引用
常引用就是const关键字修饰的引用,但是我们在使用常引用是会遇到各种报错,其实就是权限放大缩小的问题,所谓权限就是是否具有读或者写的权力,在C++中引用支持权限缩小但不支持权限放大。
1.2.1 权限放大
首先要说明的是c++是不支持权限放大的,如果出现权限放大就会出现报错。(权限放大就是增加了权限,比如原本变量用const修饰只能读不能修改,你用引用引用它时没有使用const修饰即为可以修改,这就叫做权限放大,这是不被编译器允许的。)
const int a = 0;//错误写法int& ra = a; //变量a有const修饰符,说明a只读不可写入,这里没有用const修饰,造成权限放大。//正确写法const int& rra = a;
还有一种情况特别容易发生错误,而且犯错的人常常觉得自己没有发生权限放大,但是确确实实发生了,并且发生了报错,这就是会发生类型转换的场景。比如下面的场景。

1.2.2 权限缩小
在C++中权限缩小是被允许的,权限缩小就是比如原来的变量可读可写,你用一个const引用引用这个实体是完全可以的,比如:
int a = 0;const int& b = a;
1.3 使用场景
1.3.1 传参
传参的一个特别典型的应用就是swap了,因为引用所引用的实体和本体共用的是一个空间,所以引用发生改变其实也就是本体发生改变。所以swap交换变量值就是一个很典型的应用。
void mySwap(int& a, int& b)
{swap(a, b);
}
int main()
{int a = 0, b = 1;cout << a << b << endl;swap(a, b);cout << a << b << endl;
}
输出:
01
10
1.3.2 做返回值
int& count()
{static int a = 0;a++;//...return a;
}
但是我们在返回引用的时候要特别注意被引用对象的作用域和声明周期,以免导致非凡的访问,比如下面的案例:
//错误案例
int& add(int a, int b)
{int c = a + b;return c;
}
int main()
{cout << add(1, 2) << endl;
}

所以这里纵使编译器返回了正确的结果甚至也没有报错,但它依然是一种错误的使用。
1.4 传值和传引用的效率比较
以值作为参数或者返回类型,在传参和返回的期间,变量不会直接传递实参或返回变量本身,而传递的是实参或者变量的一份临时拷贝,如果需要拷贝的类型特别大的时候,效率是极低的。而传引用是直接传递实参或返回变量的本身,几乎没有什么消耗。 
1.5 引用和指针的区别
在语法概念上引用其实是一个别名没有独立的空间,和其引用的实体共用同一块空间。但是在底层的实现上实际上是有空间的,因为引用是按照指针方式来实现的。我们通过引用和指针的汇编代码就可以很容易的看出来。
引用和指针的不同点:
- 引用在概念上定义一个变量的别名,指针存储一个变量地址。
- 引用在定义的时候必须初始化,指针没有要求。
- 引用只能引用一个实体,不能更改,指针可以在任何时候指向一个任意的同类型的实体。
- 没有NULL引用,有NULL指针。
- sizeof(引用)是引用类型的大小,但指针始终是地址空间所占字节个数。
- 引用自增为所引用的实体自增,指针自增表示向后偏移一个类型的大小。
- 指针需要显式解引用,引用编译器自己处理。
- 引用比指针安全。
2. 内联函数
2.1 inline
以inline关键字修饰的函数叫做内联函数,编译时C++会在调用内联函数的地方展开,没有函数建立栈帧的开销,提升程序运行的效率。C++期望用inline去替代c语言的宏(因为宏不方便调试,会使代码可读性降低,可维护性差,没有类型的安全检查)

2.2 特性
inline是一种空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用将函数体替换函数调用,但会让目标文件变大。
inline对于编译器只是一个建议,不同的编译器关于inline的实现机制有可能不同,一般将函数规模较小的函数不是递归且频繁调用的函数采用inline修饰,否则编译器可能会忽略inline特性。
inline也不支持声明和定义分离分离会导致链接错误,因为inline函数会被展开,没有函数地址,如果声明和定义分开会导致链接阶段找不到函数的地址从而报错。
相关文章:
【C++精华铺】3.C++入门 引用(const)、内联函数
目录 1. 引用 1.1 引用特性 1.2 常引用 1.2.1 权限放大 1.2.2 权限缩小 1.3 使用场景 1.3.1 传参 1.3.2 做返回值 1.4 传值和传引用的效率比较 1.5 引用和指针的区别 2. 内联函数 2.1 inline 2.2 特性 1. 引用 在C中,引入了一个新的概念引用,与…...
生态系统服务(InVEST模型)供给与需求、价值核算技术及人类活动、重大工程项目、自然保护区、碳中和等领域中实际案例分析
对接工作实际项目及论文写作,解决参会者关注的重点及实际项目过程问题,采取逐步延伸的逻辑,不论您是小白亦或是已经能够成功运行InVEST模型生成结果,您可以自由选择课程内容,如果您是小白老师手把手教您,如…...
TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验
八 年 前 ,我们构建了 TiDB,一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式,满足不断增长的可扩展性、灵活性和性能需求。 从那时起,PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…...
PXE-kickstart无人值守安装操作系统
PXE的概念: PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于C/S的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统…...
使用Flask.Request的方法和属性,获取get和post请求参数(二)
1、Flask中的request 在Python发送Post、Get等请求时,我们使用到requests库。Flask中有一个request库,有其特有的一些方法和属性,注意跟requests不是同一个。 2、Post请求:request.get_data() 用于服务端获取客户端请求数据。注…...
解决 idea maven依赖引入失效,无法正常导入依赖问题
解决 idea maven依赖引入失效,无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效,无法正常导入依赖问题 idea是真的好用,不过里面的maven依赖问题有时候还真挺让人头疼,不少小…...
Python之集合(set)基础知识点
文章目录 1. 创建集合2. 获取集合的元素个数3. 向集合中添加元素4. 从集合中移除元素5. 判断元素是否在集合中6. 遍历集合7. 常用的集合操作7.1 并集7.2 交集7.3 差集 在Python中,集合(Set)是一种无序且不重复的数据结构。它是由一组用花括号…...
flutter 没有open android module in Android studio 插件代码爆红
参考 1.结论 其实就是缺少这个文件 2.解决方案有两个 2.1 方案一 手动创建一个,命名规则是项目名字‘_android’‘.iml’ 内容如下: <?xml version"1.0" encoding"UTF-8"?> <module type"JAVA_MODULE" version"4">&l…...
计算机网络实验2:网络嗅探
文章目录 1. 主要教学内容2. Wireshark介绍3. Wireshark下载4. 使用Wireshark捕获包4.1 选择网卡4.2 停止抓包4.3 保存数据 5. Wireshark的过滤规则6. Wireshark实例 1. 主要教学内容 实验内容:安装、学习使用网络包分析工具Wireshark。所需学时:1。重难…...
智慧防灾:数字孪生技术的应用
最近的“杜苏芮”“卡努”有没有对大家产生影响呢? 频繁发生的台风和其他自然灾害引起了人们对于灾害预防和应对的高度关注。在这种背景下,数字孪生作为一项前沿技术,为灾害预防领域提供了全新的解决方案。本文就带大家了解一下数字孪生技术…...
Google 扫码器(仅限 Android)
Google 扫码器(仅限 Android) Google Code Scanner API 提供了全面的扫描解决方案,无需您的应用请求相机权限,同时保护用户隐私。这是通过将扫描代码委托给 Google Play 服务并仅将扫描结果返回给您的应用来完成的(视…...
pandoc word转markdown之后正则修改
问题 用pandoc工具将doc文件转换为markdown文件后,有关图片的处理会变成: (./url路径){width“3.46875in” height“1.0729166666666667in”} 但是我要展示到前端的,前端组件用的v-md-preview,结果展示的时候,后面的宽…...
使用Python和wxPython将图片转换为草图
导语: 将照片转换为艺术风格的草图是一种有趣的方式,可以为您的图像添加独特的效果。在本文中,我们将介绍如何使用Python编程语言和wxPython图形用户界面库来实现这一目标。我们将探讨如何使用OpenCV库将图像转换为草图,并使用wxPython创建一…...
深入浅出对话系统——闲聊对话系统进阶
引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章,这是由OpenAI团队推出的,现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…...
List与Set的区别
List与Set的区别 大家好,在我们平时的代码编写过程中,经常会碰到需要使用到集合类型: List与Set。很多时候,我们可能会将它们视为同一种类型进行使用,但是在实际的编程逻辑中,它们之间是存在很大差别的。接下来我们就…...
MyBatis 实战指南:探索灵活持久化的艺术
文章目录 前言一、初识 MyBatis1.1 什么是 MyBatis1.2 为什么学习 MyBatis 二、MyBatis 在软件开发框架中的定位三、基于 Spring Boot 创建 MyBatis 项目3.1 添加 MyBatis 框架的支持3.2 配置数据库连接信息和映射文件的保存路径(Mapper XML) 四、MyBati…...
高中教师能去美国做访问学者吗?
美国作为世界上高等教育水平较高的国家之一,吸引了众多学者前往交流学习。那么高中教师是否能够成为美国访问学者,这是当然的,高中老师是可以出国访学的,但是出国做访问学者会涉及到多方面的因素。 首先,教师个人的学术…...
93 | Python 设计模式 —— 建造者模式
文章目录 什么是建造者模式?建造者模式的四个角色Python建造者模式示例建造者模式的优点建造者模式的适用场景案例1:股票价格监控案例2:天气预报系统总结当构建复杂对象时,经常会遇到对象的创建过程非常复杂、包含多个步骤、或者有不同的配置选项。这时,使用建造者模式是一…...
nacos升级开启鉴权后,微服务无法连接的解决方案
版本: 软件版本号备注spring boot2.2.5.RELEASEspring-cloudHoxton.SR3spring-cloud-alibaba2.2.1.RELEASEnacos2.0.1从1.4.2版本进行升级。同时作为注册中心和配置中心 一、升级nacos版本,开启鉴权 1.在application.properties配置文件开启鉴权&…...
elementui弹窗页按钮重复提交问题解决
一、BUG场景 ruoyi平台,页面弹出窗有提交按钮,在提交时连续多次点击会发生重复提交。 二、错误方案 给按钮增加 :loading"submitLoading" 属性。 <el-dialog :title"title" :v-if"open" :visible.sync"open&…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
iOS 项目怎么构建稳定性保障机制?一次系统性防错经验分享(含 KeyMob 工具应用)
崩溃、内存飙升、后台任务未释放、页面卡顿、日志丢失——稳定性问题,不一定会立刻崩,但一旦积累,就是“上线后救不回来的代价”。 稳定性保障不是某个工具的功能,而是一套贯穿开发、测试、上线全流程的“观测分析防范”机制。 …...
