UE学习日志#19 C++笔记#5 基础复习5 引用1

news2025/2/3 19:56:05

        C++中的引用(reference)是另一个变量的别名。对引用的所有修改都会更改其引用的变量的值。可以将引用视为隐式指针,它省去了获取变量地址和解引用指针的麻烦。另外,可以将引用视为原始变量的另一个名称。可以创建独立的引用变量,在类中使用引用数据成员,接受引用作为函数和方法的参数,并从函数和方法返回引用。

1 引用变量

1.1 引用变量必须总是在创建时被初始化

        引用变量必须在创建时被初始化,例如:

int x {3};
int& xRef {x};

        给类型附加一个&,则指示相应的变量是一个引用。它仍然像正常变量一样被使用,但是在幕后,它实际上是指向原始变量的指针。变量x 和引用变量xRef指向同一个值,也就是说,xRef只是x 的另一个名称。如果通过其中一个更改值,则也可在另一个中看到更改。例如,以下代码通过 xRef 将x 设置为10:

xRef = 10;

        不允许在类定义之外声明一个引用而不对其进行初始化。

int& emptyRef: // DOES NOT COMPILE!

        引用变量必须总是在创建时被初始化。


1.2 修改引用
        

        引用始终指向它初始化时的那个变量,引用一旦创建便无法更改。如果在声明引用时将变量赋值给引用,则引用指向该变量。但是,如果之后将变量赋值给引用,则引用所指向的变量会更改为赋值的变量的值。原来的引用不会改为指向新的变量。示例:

int x{3},y{4};
int& xRef{x};
xRef=y;//Change value of x to 4.Doesn't make xRef refer to y.

        可以尝试使用y的地址对 xRef赋值来规避此限制。

xRef = &y; // DOES NOT COMPILE!

        这句代码会编译失败。y的地址是一个指针,但是xRef 被声明为一个对 int 的引用,而不是对指针的引用。

int x{3},z{5};
int& xRef{x};
int& zRef{z};
zRef=xRef;

        这个示例的最后一行会把z的值设为3,而不会改变引用。

1.3 const引用

        应用于引用的 const 通常比应用于指针的 const容易,这有两个原因。首先,引用默认是 const,因为你不能更改它们的指向。因此,不需要显式标记它们为const。其次。你无法创建对引用的引用,因此通常只有一个间接引用级别。获得多个间接级别的唯一方法是创建对指针的引用。
        因此,当C++程序员提起const 引用时,他们的意思是这样的:

int z; 
const int& zRef {z};
zRef = 4; // DOES NOT COMPILE

        通过将 const 应用于 int&,可以阻止对 zRef 的赋值,如上所示。类似于指针,const int& zRef等价于 int const& zRef。但是要注意,将zRef 标记为 const 对z无效。仍然可以通过直接更改z的值而不是通过引用来更改z的值。
        不能创建对未命名值的引用,例如整数字面量,除非该引用是 const 值。在下面的示例中,unnamedRefl会编译失败,因为它是对非 const 的引用,却指向了一个常量。那意味着你可以更改常数5的值,这没有任何意义。unnamedRef2 之所以有效,是因为它是 const 引用,因此不能编写例如unnamedRef2 =7这样的代码。

int& unnamedRef1{ 5 };// DOES NOT COMPILE
const int& unnamedRef2 { 5 };// Works as expected

        临时对象也是如此。不能为临时对象创建对非 const的引用,但是 const 引用是可以的。例如,假设具有以下返回 std:string 对象的函数:

string getString() ( return "Hello world!"; }

        可以为 getString()的结果创建一个 const 引用,该引用将使临时 std::string 对象保持生命周期,直到该引用超出作用域。

string& stringl { getString() } ;// DOES NOT COMPILE
const string& string2 { getString() };// Works as expected

1.4 指针的引用和引用的指针

        可以创建对任何类型的引用,包括指针类型。这是对指向 int的指针的引用的示例:

int* intP {nullptr};
int*& ptrRef {intP};
ptrRef=new int;
*ptrRef=5;

        取一个引用的地址与取该引用所指向的变量的地址得到的结果是相同的。

        不能声明对引用的引用或对引用的指针。

1.5 结构化绑定和引用

auto& [theString,theInt]{myPair};
const auto& [theString,theInt]{myPair};

2 引用数据成员

        类的数据成员可以是引用。但是不能在类的构造函数的函数体内部进行初始化,必须在所谓的构造函数初始化器中进行初始化。例如:

class MyClass{
    public:
        MyClass(int& ref):m_ref{ref}{<body>}
    private:
        int& m_ref;
}

3 引用作为函数参数

        默认是值传递,加上&后是引用传递。

(未完待续)

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

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

相关文章

2025年02月02日Github流行趋势

项目名称&#xff1a;oumi 项目地址url&#xff1a;https://github.com/oumi-ai/oumi 项目语言&#xff1a;Python 历史star数&#xff1a;1416 今日star数&#xff1a;205 项目维护者&#xff1a;xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介&#xff1a;构建最…

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…

实验六 项目二 简易信号发生器的设计与实现 (HEU)

声明&#xff1a;代码部分使用了AI工具 实验六 综合考核 Quartus 18.0 FPGA 5CSXFC6D6F31C6N 1. 实验项目 要求利用硬件描述语言Verilog&#xff08;或VHDL&#xff09;、图形描述方式、IP核&#xff0c;结合数字系统设计方法&#xff0c;在Quartus开发环境下&#xff…

java SSM框架 商城系统源码(含数据库脚本)

商城购物功能&#xff0c;项目代码&#xff0c;mysql脚本&#xff0c;html等静态资源在压缩包里面 注册界面 登陆界面 商城首页 文件列表 shop/.classpath , 1768 shop/.project , 1440 shop/.settings/.jsdtscope , 639 shop/.settings/org.eclipse.core.resources.prefs , …

Unet 改进:在encoder和decoder间加入TransformerBlock

目录 1. TransformerBlock 2. Unet 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transformer模型架构的基本组件,广泛应用于机器翻译、文本摘要和情感分析等自然语言处理任务…

【Linux系统】信号:认识信号 与 信号的产生

信号快速认识 1、生活角度的信号 异步&#xff1a;你是老师正在上课&#xff0c;突然有个电话过来资料到了&#xff0c;你安排小明过去取资料&#xff0c;然后继续上课&#xff0c;则小明取资料这个过程就是异步的 同步&#xff1a;小明取快递&#xff0c;你停下等待小明回来再…

一、html笔记

(一)前端概述 1、定义 前端是Web应用程序的前台部分,运行在PC端、移动端等浏览器上,展现给用户浏览的网页。通过HTML、CSS、JavaScript等技术实现,是用户能够直接看到和操作的界面部分。上网就是下载html文档,浏览器是一个解释器,运行从服务器下载的html文件,解析html、…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…

洛谷 P8724 [蓝桥杯 2020 省 AB3] 限高杆

洛谷题目传送门 题目描述 某市有 n 个路口&#xff0c;有 m 段道路连接这些路口&#xff0c;组成了该市的公路系统。其中一段道路两端一定连接两个不同的路口。道路中间不会穿过路口。 由于各种原因&#xff0c;在一部分道路的中间设置了一些限高杆&#xff0c;有限高杆的路…

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

JavaWeb入门-请求响应(Day3)

(一)请求响应概述 请求(HttpServletRequest):获取请求数据 响应(HttpServletResponse):设置响应数据 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器就可访问,应用程序的逻辑和数据都存储在服务端(维护方便,响应速度一般) CS架构:Client/ser…

【Rust】18.2. 可辩驳性:模式是否会无法匹配

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 18.2.1. 模式的两种形式 模式有两种形式&#xff1a; 可辩驳的&#xff08;可失败的&…

【SLAM】于AutoDL云上GPU运行GCNv2_SLAM的记录

配置GCNv2_SLAM所需环境并实现AutoDL云端运行项目的全过程记录。 1. 引子 前几天写了一篇在本地虚拟机里面CPU运行GCNv2_SLAM项目的博客&#xff1a;链接&#xff0c;关于GCNv2_SLAM项目相关的介绍请移步此文章&#xff0c;本文不再重复说明。 GCNv2: Efficient Corresponde…

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…

41【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达&#xff0c;需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据&#xff0c;并进行 实时 3D 点云可视化。数据通过 串口 传输&#xff0c;并经过解析后转换为 三维坐标点&#xff0c;最终使用 pcplayer 进…

沙皮狗为什么禁养?

各位铲屎官们&#xff0c;今天咱们来聊聊一个比较敏感的话题&#xff1a;沙皮狗为什么会被禁养&#xff1f;很多人对沙皮狗情有独钟&#xff0c;但有些地方却明确禁止饲养这种犬种&#xff0c;这背后到底是什么原因呢&#xff1f;别急&#xff0c;今天就来给大家好好揭秘&#…

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚…

DeepSeek-R1模型1.5b、7b、8b、14b、32b、70b和671b有啥区别?

deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别&#xff1f;码笔记mabiji.com分享&#xff1a;1.5B、7B、8B、14B、32B、70B是蒸馏后的小模型&#xff0c;671B是基础大模型&#xff0c;它们的区别主要体现在参数规模、模型容量、性能表现、准确性、训练成本、推理成本…

#define,源文件与头文件,赋值表达式

1.#define 1.1定义 #define 是一个预处理指令&#xff0c;用于定义宏 宏&#xff0c;是预处理阶段&#xff08;在编译之前&#xff09;由预处理器处理的代码片段 1.2使用 1.2.1 #define 可以定义常量 #define PI 3.14159 1.2.2 #define 可以定义宏函数 #define SQUARE(x) ((…