当前位置: 首页 > news >正文

【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 引用和指针的区别

        在语法概念上引用其实是一个别名没有独立的空间,和其引用的实体共用同一块空间。但是在底层的实现上实际上是有空间的,因为引用是按照指针方式来实现的。我们通过引用和指针的汇编代码就可以很容易的看出来。

        引用和指针的不同点:

  1.  引用在概念上定义一个变量的别名,指针存储一个变量地址。
  2. 引用在定义的时候必须初始化,指针没有要求。
  3. 引用只能引用一个实体,不能更改,指针可以在任何时候指向一个任意的同类型的实体。
  4. 没有NULL引用,有NULL指针。
  5. sizeof(引用)是引用类型的大小,但指针始终是地址空间所占字节个数。
  6. 引用自增为所引用的实体自增,指针自增表示向后偏移一个类型的大小。
  7. 指针需要显式解引用,引用编译器自己处理。
  8. 引用比指针安全。

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中&#xff0c;引入了一个新的概念引用&#xff0c;与…...

生态系统服务(InVEST模型)供给与需求、价值核算技术及人类活动、重大工程项目、自然保护区、碳中和等领域中实际案例分析

对接工作实际项目及论文写作&#xff0c;解决参会者关注的重点及实际项目过程问题&#xff0c;采取逐步延伸的逻辑&#xff0c;不论您是小白亦或是已经能够成功运行InVEST模型生成结果&#xff0c;您可以自由选择课程内容&#xff0c;如果您是小白老师手把手教您&#xff0c;如…...

TiDB Serverless 正式商用,全托管的云服务带来数据管理和应用程序开发的全新体验

八 年 前 &#xff0c;我们构建了 TiDB&#xff0c;一个开源分布式关系型数据库。 我们的目标是重新定义开发者和企业处理数据的方式&#xff0c;满足不断增长的可扩展性、灵活性和性能需求。 从那时起&#xff0c;PingCAP 便致力于为开发者和企业提供快速、灵活和规模化的数据…...

PXE-kickstart无人值守安装操作系统

PXE的概念&#xff1a; PXE&#xff08;Pre-boot Execution Environment&#xff0c;预启动执行环境&#xff09;是由Intel公司开发的最新技术&#xff0c;工作于C/S的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操作系统…...

使用Flask.Request的方法和属性,获取get和post请求参数(二)

1、Flask中的request 在Python发送Post、Get等请求时&#xff0c;我们使用到requests库。Flask中有一个request库&#xff0c;有其特有的一些方法和属性&#xff0c;注意跟requests不是同一个。 2、Post请求&#xff1a;request.get_data() 用于服务端获取客户端请求数据。注…...

解决 idea maven依赖引入失效,无法正常导入依赖问题

解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题_idea无法导入本地maven依赖_普通网友的博客-CSDN博客 解决 idea maven依赖引入失效&#xff0c;无法正常导入依赖问题 idea是真的好用&#xff0c;不过里面的maven依赖问题有时候还真挺让人头疼&#xff0c;不少小…...

Python之集合(set)基础知识点

文章目录 1. 创建集合2. 获取集合的元素个数3. 向集合中添加元素4. 从集合中移除元素5. 判断元素是否在集合中6. 遍历集合7. 常用的集合操作7.1 并集7.2 交集7.3 差集 在Python中&#xff0c;集合&#xff08;Set&#xff09;是一种无序且不重复的数据结构。它是由一组用花括号…...

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. 主要教学内容 实验内容&#xff1a;安装、学习使用网络包分析工具Wireshark。所需学时&#xff1a;1。重难…...

智慧防灾:数字孪生技术的应用

最近的“杜苏芮”“卡努”有没有对大家产生影响呢&#xff1f; 频繁发生的台风和其他自然灾害引起了人们对于灾害预防和应对的高度关注。在这种背景下&#xff0c;数字孪生作为一项前沿技术&#xff0c;为灾害预防领域提供了全新的解决方案。本文就带大家了解一下数字孪生技术…...

Google 扫码器(仅限 Android)

Google 扫码器&#xff08;仅限 Android&#xff09; Google Code Scanner API 提供了全面的扫描解决方案&#xff0c;无需您的应用请求相机权限&#xff0c;同时保护用户隐私。这是通过将扫描代码委托给 Google Play 服务并仅将扫描结果返回给您的应用来完成的&#xff08;视…...

pandoc word转markdown之后正则修改

问题 用pandoc工具将doc文件转换为markdown文件后&#xff0c;有关图片的处理会变成&#xff1a; (./url路径){width“3.46875in” height“1.0729166666666667in”} 但是我要展示到前端的&#xff0c;前端组件用的v-md-preview&#xff0c;结果展示的时候&#xff0c;后面的宽…...

使用Python和wxPython将图片转换为草图

导语: 将照片转换为艺术风格的草图是一种有趣的方式&#xff0c;可以为您的图像添加独特的效果。在本文中&#xff0c;我们将介绍如何使用Python编程语言和wxPython图形用户界面库来实现这一目标。我们将探讨如何使用OpenCV库将图像转换为草图&#xff0c;并使用wxPython创建一…...

深入浅出对话系统——闲聊对话系统进阶

引言 本文主要关注生成式闲聊对话系统的进阶技术。 基于Transformer的对话生成模型 本节主要介绍GPT系列文章&#xff0c;这是由OpenAI团队推出的&#xff0c;现在大火的ChatGPT也是它们推出的。 GPT : Improving Language Understanding by Generative Pre-Traini ng 在自…...

List与Set的区别

List与Set的区别 大家好&#xff0c;在我们平时的代码编写过程中&#xff0c;经常会碰到需要使用到集合类型: List与Set。很多时候&#xff0c;我们可能会将它们视为同一种类型进行使用&#xff0c;但是在实际的编程逻辑中&#xff0c;它们之间是存在很大差别的。接下来我们就…...

MyBatis 实战指南:探索灵活持久化的艺术

文章目录 前言一、初识 MyBatis1.1 什么是 MyBatis1.2 为什么学习 MyBatis 二、MyBatis 在软件开发框架中的定位三、基于 Spring Boot 创建 MyBatis 项目3.1 添加 MyBatis 框架的支持3.2 配置数据库连接信息和映射文件的保存路径&#xff08;Mapper XML&#xff09; 四、MyBati…...

高中教师能去美国做访问学者吗?

美国作为世界上高等教育水平较高的国家之一&#xff0c;吸引了众多学者前往交流学习。那么高中教师是否能够成为美国访问学者&#xff0c;这是当然的&#xff0c;高中老师是可以出国访学的&#xff0c;但是出国做访问学者会涉及到多方面的因素。 首先&#xff0c;教师个人的学术…...

93 | Python 设计模式 —— 建造者模式

文章目录 什么是建造者模式?建造者模式的四个角色Python建造者模式示例建造者模式的优点建造者模式的适用场景案例1:股票价格监控案例2:天气预报系统总结当构建复杂对象时,经常会遇到对象的创建过程非常复杂、包含多个步骤、或者有不同的配置选项。这时,使用建造者模式是一…...

nacos升级开启鉴权后,微服务无法连接的解决方案

版本&#xff1a; 软件版本号备注spring boot2.2.5.RELEASEspring-cloudHoxton.SR3spring-cloud-alibaba2.2.1.RELEASEnacos2.0.1从1.4.2版本进行升级。同时作为注册中心和配置中心 一、升级nacos版本&#xff0c;开启鉴权 1.在application.properties配置文件开启鉴权&…...

elementui弹窗页按钮重复提交问题解决

一、BUG场景 ruoyi平台&#xff0c;页面弹出窗有提交按钮&#xff0c;在提交时连续多次点击会发生重复提交。 二、错误方案 给按钮增加 :loading"submitLoading" 属性。 <el-dialog :title"title" :v-if"open" :visible.sync"open&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...