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

ops/2025/2/4 0:45:20/

        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.ppmy.cn/ops/155428.html

相关文章

100.3 AI量化面试题:解释配对交易(Pairs Trading)的原理,并说明如何选择配对股票以及设计交易信号

目录 0. 承前1. 配对交易基本原理1.1 什么是配对交易1.2 基本假设 2. 配对选择方法2.1 相关性分析2.2 协整性检验 3. 价差计算方法3.1 简单价格比率3.2 回归系数法 4. 交易信号设计4.1 标准差方法4.2 动态阈值方法 5. 风险管理5.1 止损设计5.2 仓位管理 6. 策略评估6.1 回测框架…

第12章:基于TransUnet和SwinUnet网络实现的医学图像语义分割:腹部13器官分割(网页推理)

目录 1. 前言 2. TransUnet 和 SwinUnet 3. 腹部多器官分割 4. 训练 5. 推理 6. 项目下载 1. 前言 TransUNet 是一种用于医学图像分割的混合架构&#xff0c;结合了 Transformer 和 U-Net 的优势。它利用 Transformer 的全局上下文建模能力和 U-Net 的精确定位特性&…

Kafka常见问题之 java.io.IOException: Disk error when trying to write to log

文章目录 Kafka常见问题之 java.io.IOException: Disk error when trying to write to log1. 问题概述2. 问题排查方向&#xff08;1&#xff09;磁盘空间不足&#xff08;2&#xff09;磁盘 I/O 故障&#xff08;3&#xff09;Kafka 日志文件损坏&#xff08;4&#xff09;Kaf…

本地部署DeepSeek教程(Mac版本)

第一步、下载 Ollama 官网地址&#xff1a;Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包&#xff0c;双击解压之后移到应用程序&#xff1a; 打开后会提示你到命令行中运行一下命令&#xff0c;附上截图&#xff1a; 若遇…

我的Go+语言初体验——环境搭建并用命令行和 VScode 输出 “Hello World”_gop windows helloworld

fmt.Println(“Hello, World!”) } test.go 运行成功&#xff0c;截图如下&#xff1a; ![在这里插入图片描述](https://img-blog.csdnimg.cn/82daf2752d2e40c7afac6dc4a156429d.png)#### 3.安装GO&#xff08;1&#xff09;下载Go安装包官方 GitHub 地址&#xff1a;<http…

JVM篇:对象的深度剖析

前8个字节是markword&#xff0c;它的值是&#xff1a;00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000。其中01是锁标志位&#xff0c;前面的0表示是否是偏向锁&#xff0c;我们这个对象是没有加锁的&#xff0c;所以这个地方是0。后4个字节是类型指…

音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现

一、引言 FFmpeg源码中通过ff_sdp_parse函数解析SDP。该函数定义在libavformat/rtsp.c中&#xff1a; int ff_sdp_parse(AVFormatContext *s, const char *content) {const char *p;int letter, i;char buf[SDP_MAX_SIZE], *q;SDPParseState sdp_parse_state { { 0 } }, *s1…

【C++语言】卡码网语言基础课系列----13. 链表的基础操作I

文章目录 背景知识链表1、虚拟头节点(dummyNode)2、定义链表节点3、链表的插入 练习题目链表的基础操作I具体代码实现 小白寄语诗词共勉 背景知识 链表 与数组不同&#xff0c;链表的元素存储可以是连续的&#xff0c;也可以是不连续的&#xff0c;每个数据除了存储本身的信息…