C++引用-学习记录

news/2025/1/15 2:05:51 标签: C++, 引用, 常见引用场景

一、引用(reference)定义

        引用(reference),即为对象起了另外一个名字,通过将声明符写成&v的形式来定义引用类型,其中v是声明的变量名。需要说明的是,引用的创建并非对象,而是为一个已经存在的对象所起的另外一个名字引用定义示例如下:

int v = 8;

int &rv = v;

        上述代码中,rv即为变量v的别名。

使用说明:

1.  定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用

2.  一旦引用的初始化完成,引用将和它的初始值对象一直绑定在一起,且无法重新绑定到另外一个对象;

3. 引用必须初始化。除了“对const的引用和“存在继承关系的类的引用情况,其他所有引用的类型都要和与之绑定的对象严格匹配,且只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。

二、特殊的引用情况

(一)常量引用

        把引用绑定到const限定符上,即为对const的引用,简称常量引用。在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可,尤其允许为一个常量引用绑定非常量的对象、字面值,甚至是一个表达式。

使用说明:

1. 常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未做限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值(如新的普通引用等)。

(二)存在继承关系的类的引用

        对于存在继承关系的类,可以将其基类的指针或引用绑定到派生类对象上。该操作有一层极为重要的含义,即当使用基类的引用(或指针)时,实际上我们并不清楚该引用(或指针)所绑定对象的真实类型。

注意事项:

1. 在使用存在继承关系的类型时,必须将一个变量或其他表达式的静态类型(static type)与该表达式表示对象的动态类型(dynamic type)区分开来;

2. 表达式的静态类型在编译时总是已知的,它是变量声明时的类型或表达式生成的类型;

3. 动态类型则是变量或表达式表示的内存中的对象的类型,动态类型直到运行时才可知。

三、常见的引用使用场景

(一)避免对象复制开销——函数参数传递

        当需要在函数内部修改函数外部变量的值时,引用是很好的选择。与值传递不同,值传递会创建参数的副本,而引用传递提供了操作原始变量的途径且避免了创建副本的较大性能开销。

(二)实现函数式编程风格的操作链或操作类成员函数——函数返回值

        在一些高级的C++编程场景中,特别是涉及到一些类似于函数式编程的操作时,可以使用引用让操作更加连贯,如std::cout<<"字符串"<<“字符串”<<endl;

        如果希望函数返回一个左值(可以出现在赋值语句左边的值)时,可以使用引用返回。这种情况通常用于操作类的成员函数,返回对象内部数据成员的引用,以方便对对象内部状态进行修改。

参考资料:

[1] C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译. —北京:电子工业出版社,2013.9.


http://www.niftyadmin.cn/n/5823356.html

相关文章

知识库搭建:2025年飞书文档替代品

一、知识库搭建的必要性 在信息化时代&#xff0c;知识已成为企业最宝贵的资产之一。搭建知识库&#xff0c;能够将企业内部散落的知识碎片系统化、结构化&#xff0c;形成一个完整的知识体系。这不仅有助于新员工快速熟悉业务&#xff0c;缩短培训周期&#xff0c;还能让老员工…

大模型系列——推理能力增强 rStar-Math 论文笔记

我们提出rStart-Math来证明小型语言模型SLM可以与OpenAI O1的数学推理能力相媲美甚至超越&#xff0c;而无需从更高级的模型中蒸馏。rStart-Math通过蒙特卡洛树搜索MCTS来实现深度思考&#xff0c;其中一个数学策略SLM执行测试时搜索&#xff0c;该搜索由基于SLM的过程奖励模型…

当你不小心使用了MySQL的保留字作为字段名而导致你的SQL语法解析错误该怎么办!

问题举例&#xff1a; 你在尝试更新一个名为 desc 的字段时遇到了 SQL 语法错误。原因是 desc 是 MySQL 的保留字&#xff0c;通常用于表示 ORDER BY 子句中的降序&#xff08;DESC&#xff09;&#xff0c;因此直接使用 desc 作为字段名会导致 SQL 解析错误。如下图&#xff…

ros2-6.4.4 两轮差速控制机器人(问题解决)

ros2-6.4.4 两轮差速控制机器人的问题-CSDN博客 上次遇到的问题&#xff0c;经过查看ros2 node list 之后&#xff0c;发现有多个 /robot_state_publisher 这是不正常的&#xff0c;应该是我看视频6.2 的没有及时关闭导致冲突了。 没有修改代码&#xff0c;单纯的重启就解决…

25/1/13 嵌入式笔记 继续学习Esp32

PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器&#xff08;如 Arduino&#xff09;上生成模拟信号。 …

简单组合逻辑

多路选择器 在多路数据传输过程中&#xff0c;能够将任意一路选出来的电路叫做数据选择器&#xff0c;也称多路选择器。对于一个具有2^n个输入和一个输出的多路选择器&#xff0c;有n个选择变量&#xff0c;多路选择器也是FPGA内部的一个基本资源&#xff0c;主要用于内部信号的…

【2】WLC的接口有哪些?

1.简介 在传统的网络中,很多时候接口和端口是混用的概念,在这里,我们的接口和端口则需要区分来对待了,WLC上的端口有其自身的含义,而接口区分了很多的种类。 AireOS WLC的接口有AP管理接口(ap manager interface)、动态接口(dynamic interface)、虚拟接口(virtual …

paddle——站在巨人肩膀上及背刺二三事

飞桨AI Studio - 人工智能学习与实训社区 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 先抛结论&#xff0c;对于想要快速了解某一领域有哪些比较适合落地的算法的从业人员来说&#xff0c;是一个很好的参考系统。从中可以知道从哪些模型里选型、如何轻量化、如何加…