【C++】常量引用(常引用)一些经典问题

news2024/11/20 19:32:12

常量引用

  • 1.常量引用错误的案例
  • 2.常量引用的前提条件
  • 3.分析错误案例
  • 4.总结

常量引用

  • 1.常量引用错误的案例
  • 2.常量引用的前提条件
  • 3.分析错误案例
  • 4.总结

1.常量引用错误的案例

1.常量引用的使用的场景一般是用来修饰函数的形参,防止误操作。
比如:

//在下列函数我只想打印a的值,并不想改变我的参数,
//可以在形参前加一个const
void fun(const int& x)//表示x是一个常量,不可修改
{
	x += 10;//不小心修改了我的参数,会报错
	cout << x;
}
int main()
{
	int a = 20;
	fun(a);
}

在这里插入图片描述

2.或者是某一个函数返回一个值,我们用了引用去接收它时,要加上const
比如以下这段错误代码:

int fun()
{
	int n = 10;
	return n;
}
int main()
{
	int& ret = fun();
}

在这里插入图片描述

我们加上const即可

int fun()
{
	int n = 10;
	return n;
}
int main()
{
	const int& ret = fun();
}

3.使用引用时,类型不一样的情况

//错误代码:
int main()
{
	int i = 10;
	double& a = i;
}

在这里插入图片描述

正确修改:

//这里并不是简单的类型不匹配问题,我们下面会分析
int main()
{
	int i = 10;
	const double& a = i;
}

2.常量引用的前提条件

我们先来看看非常量引用
引用本身需要一个合法的内存空间。
比如栈区,堆区的变量。
如下图,就是错误的使用方式,因为10只是一个字面量,并不是左值。
左值是指可被引用的数据对象,例如,变量,数组元素,结构成员,引用和解除引用的指针都是左值。
在这里插入图片描述

我们的目的是使用常量引用,就是要告诉编译器,a是一个常量,即加上const即可。

正确修改方式:

int main()
{
	const int& a = 10;
	//这里实际上是编译器创建了一个临时变量,再将这个临时变量给a
	//int temp =  10;const int& a = temp;
}

3.分析错误案例

上面的错误案例1好解释,就是const修饰的常引用不可修改。

案例2

//错误代码
int fun()
{
	int n = 10;
	return n;
}
int main()
{
	int& ret = fun();
}

这段代码报错的是:非常量引用的初始值必须为左值。
意思就是该函数的返回值并不是一个左值,而是一个常量
既然是常量就要加上const在这里插入图片描述
这是因为我们这个函数在返回时,并不是返回n,而是创建了一个临时变量返回,而且这个临时变量具有常量性,我们要在引用前加上const,告诉编译器,我们使用的时常量引用。

//正确代码
int fun()
{
	int n = 10;
	return n;
}
int main()
{
	const int& ret = fun();
}

案例3

//错误代码:
int main()
{
	int i = 10;
	double& a = i;
}

在这里插入图片描述

这里并不是类型不匹配问题,而是编译器创建了一个临时变量来接收int类型的i转化为double类型的值,而这个临时变量具有常量性,所以要加上const,告诉编译器我们用的是常引用。

int main()
{
	int i = 10;
	const double& a = i;
}

4.总结

在 C++ 中,引用其实就是一个变量的别名,所以如果我们修改了引用,
其实就是间接修改了变量,
如果我们不希望能够对引用做修改,那么我们可以声明为常引用。

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

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

相关文章

HTB_Find The Easy Pass

文章目录信息收集分析汇编代码信息收集 下载后是一个加密的zip压缩包&#xff0c;里面是一个exe文件 解压密码获取&#xff1a; 使用zip2john暴破&#xff0c;失败 zip2john Find\ The\ Easy\ Pass.zip >hash.txt john -w/usr/share/wordlists/rockyou.txt hash.txt使用…

DAMA数据管理知识体系指南之数据开发

第5章 数据开发 数据开发&#xff08;Data Development)是数据管理框架中的第三个数据管理职能它是第二个与数据治理功能交互并受其影响的数据管理职能。 5.1 简介 数据开发是指分析、设计、实施、部署及维护数据解决方案&#xff0c;以使企业的数据资源价值最大化。数据开发…

pytorch backward使用解析

目录前言backward函数官方文档backward理解Jacobian矩阵vector-Jacobian product的计算vector-Jacobian product的例子理解输入和输出为标量或向量时的计算输入为标量&#xff0c;输出为标量输入为标量&#xff0c;输出为向量输入为向量&#xff0c;输出为标量输入为标量&#…

从零编写linux0.11 - 第十章 文件系统(二)

从零编写linux0.11 - 第十章 文件系统&#xff08;二&#xff09; 编程环境&#xff1a;Ubuntu 20.04、gcc-9.4.0 代码仓库&#xff1a;https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载&#xff08;不能直接编译&#xff0c;需进行修改&#xff09; 本章…

学会这7个常见问题和答案,让你下一次JavaScript面试获得高分

在本文中&#xff0c;我将涵盖您在JavaScript 面试中可能遇到的最常见问题&#xff0c;并提供详细的答案和示例&#xff0c;以帮助您在竞争中脱颖而出。无论您是初学者还是经验丰富的开发人员&#xff0c;本指南都会让您有信心打动面试官并找到工作。1️⃣ 什么是 JavaScript&a…

C++——继承

作为面向对象的语言&#xff0c;c开发了名为继承的机制&#xff0c;它是c中代码复用的重要手段&#xff1b; 允许程序员在保持原有特性的基础&#xff08;基类&#xff09;上进行扩展&#xff0c;并产生新的类&#xff08;派生类&#xff09;&#xff0c;这就是继承。 继承的格…

剑指 Offer 64. 求1+2+…+n

剑指 Offer 64. 求12…nhttps://leetcode.cn/problems/qiu-12n-lcof/ 求 12...n &#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 示例 1&#xff1a; 输入: n 3 输出: 6 示例 2&#xff1a; 输入…

Linux——安装JDK和OpenJDK【多种方法】

目录 一、Linux安装OpenJDK 1、查看系统是否有自带的版本 2、删除OpenJDK 3、本地下载OpenJDK 4、无法本地下载&#xff0c;也可以使用命令下载&#xff08;方法1&#xff09; 4、无法本地下载&#xff0c;也可以使用命令下载&#xff08;方法2&#xff09; 5、拓展 三…

3-3-多线程-TheadLocal内存泄漏

Java TheadLocal内存泄漏 1、引言 组内来了一个实习生&#xff0c;看这小伙子春光满面、精神抖擞、头发微少&#xff0c;我心头一喜&#xff1a;绝对是个潜力股。为了帮助小伙子快速成长&#xff0c;我给他分了一个需求&#xff0c;这不需求刚上线几天就出网上问题了&#x1…

C++ 树进阶系列之线段树和它的延迟更新

1. 前言 线段树和树状数组有相似之处&#xff0c;可以用于解决区间类型的问题。 但两者又各个千秋&#xff0c;树状数组本质是数组&#xff0c;有着树的形&#xff0c;可以借用树的一些概念。线段树是典型的二叉树结构&#xff0c;无论神和形都是树&#xff0c;可以应用树的所…

用 Python 的 tkinter 模块编写一个好看又强大的中国象棋

继上次我的第一版的《中国象棋》程序之后&#xff0c;我又编写了第二版的《中国象棋》程序&#xff0c;关注我的粉丝知道&#xff0c;我在第一篇《中国象棋》的文章末尾说了&#xff0c;我会出第二版的&#xff0c;对第一版感兴趣的朋友们&#xff0c;可以去看看&#xff0c;也…

VueJS 之样式冲突与样式穿透

文章目录参考描述样式冲突现象scoped原理样式穿透深度选择器使用原理顶层元素局限性参考 项目描述搜索引擎Bing哔哩哔哩黑马程序员 描述 项目描述Edge109.0.1518.70 (正式版本) (64 位)操作系统Windows 10 专业版vue/cli5.0.8npm8.19.3VueJS2.6.14 样式冲突 在使用 Vue 进行…

大文件上传/下载

一、前言 大文件上传下载一直以来是前端常用且常考的热门话题。本文将分别介绍大文件上传/下载的思路和前端实现代码。 二、分片上传 整体流程 对文件做切片&#xff0c;选择文件后&#xff0c;对获取到的file对象使用slice方法可以将其按照制定的大小进行切片&#xff0c;…

使用matplotlib,pylab进行python绘图

一提到python绘图&#xff0c;matplotlib是不得不提的python最著名的绘图库&#xff0c;它里面包含了类似matlab的一整套绘图的API。因此&#xff0c;作为想要学习python绘图的童鞋们就得在自己的python环境中安装matplotlib库了&#xff0c;安装方式这里就不多讲&#xff0c;方…

openmmlab学习打卡1

openmmlab学习打卡1通用视觉框架 OpenMMLab通过 conda 安装通用视觉框架 OpenMMLab 基于pytorch实现 其中&#xff1a; 分类算法在 mmclassification 模块下 目标检测在 mmdetection 模块下 分割模型在 mmsegmentation 模块下&#xff08;openmmlab 2.0 版本中加入&#xff09…

洛谷P1885 Moo —— 搜索

This way 题意&#xff1a; 奶牛 Bessie 最近在学习字符串操作&#xff0c;它用如下的规则逐一的构造出新的字符串&#xff1a; S(0)S(0) S(0) moo S(1)S(0)S(1) S(0) S(1)S(0) m ooo S(0) S(0) S(0) moo m ooo moo moomooomoo S(2)S(1)S(2) S(1) S(2)S(1) m oooo S(…

无js实现拖拽边框改变大小的笔记

前言 最近刷抖音看到一款游戏"拣爱",看到这个人手动拖动的很有意思,就想着能不能前端实现,来学习学习,虽然说最终的效果没有gif图片那么好,但是也算实现了,吧… 具体原理 利用resize属性所出现的小拖拽条 再配合::-webkit-scrollbar设置拖拽区域宽度,高度,结合opac…

手动签发证书配置nginx

openssl和ssh基本用法 通过OpenSSL工具生成证书 创建私钥 openssl genrsa -des3 -out server.key 2048 注意&#xff0c;centos版本如果是CentOS Linux release 8.0.1905 (Core)版本&#xff0c;私钥长度不能设置成1024位&#xff0c;必须2048位。不然再最后启动nginx时会出…

java之数组模块

数组定义格式1.1数组概述一次性声明大量的用于存储数据的变量要存储的数据通常都是同类型数据&#xff0c;例如&#xff1a;考试成绩1.2什么是数组数组(array)是一种用于存储多个相同类型数据的存储模型1.3数组的定义格式格式一&#xff1a;数据类型[] 变量名范例&#xff1a; …

h5实现相机

什么是取景器 取景器是什么&#xff1f;取景器是相机的一个专业术语&#xff0c;在前端就是扫描拍照 取景器的实现原理 请求手机的一个媒体类型的视频轨道&#xff0c;利用一个div或者图片作为上层蒙层&#xff0c;然后在利用canvas绘制视频中某一帧的画面绘制为图片。 前期…