c++返回const引用值

embedded/2025/2/26 15:36:42/

c++在通过=赋值的时候,其实是重载了operator=操作符,然后在里面完成了大量操作,把旧变量里的内容一点点复制到新变量里,才完成赋值的。如果旧变量还销毁了,那就浪费更多的计算负荷。

如果返回引用值,则新的变量在内存中其实就是原来旧变量的位置,这样就不需要通过=赋值也可以在访问新变量时直接访问到旧变量的数据,节省了大量的复制操作。即使旧变量销毁了,都可以通过新变量访问旧变量的数据。

但是如果旧变量不销毁呢?通过新变量修改那块内存里的数据其实就是在修改旧变量的数据。为此,c++中有这样一种机制:返回const引用值。这样新变量就不能修改那块内存里的数据,或者说通过新变量访问数据其实是只读的。

https://stackoverflow.com/questions/422774/c-how-can-i-get-a-return-a-reference-and-save-the-refence-as-a-local-variable

介绍了返回const引用值和读取const引用值的方法

定义返回const引用值的函数是这样的

// 第一个const代表返回的值是const的,而返回的是引用值,所以返回的是const引用值
// 第二个const代表这个函数不会修改所属的类
std::vector<uint8> const& getBuffer() const
{return m_myBuffer;
}

读取时是这样读取的

// const代表返回的这个myFileBuffer是只读的
std::vector<uint8> const& myFileBuffer = myFile.getBuffer();

一般来讲,返回const引用值不需要过多的计算,大部分情况下都是直接返回一个变量的引用。也就是说如此简单的内容其实写在.h文件里就可以了。但是如果代码规范一定要求写在.cpp文件里怎么办呢?

.h文件

class myFileBuffer{
public:
// 第一个const代表返回的值是const的,而返回的是引用值,所以返回的是const引用值
// 第二个const代表这个函数不会修改所属的类
std::vector<uint8> const& getBuffer() const;
}

.cpp文件

// 注意第一个const的位置变了,和.h文件中的位置不一样
const std::vector<uint8> &myFileBuffer::getBuffer() const
{return m_myBuffer;
}

因为返回的这个引用值是const的,所以在使用其他函数调用这个值时,函数对应形参必须是const的,也就是说函数不会对这个形参所对应的实参(也就是调用的这个const引用值)产生任何变化。否则在编译期就会因为语法问题而无法编译。


http://www.ppmy.cn/embedded/167288.html

相关文章

OmniParser V2 与 OmniTool:解锁计算机自动化操控的新境界

在人工智能蓬勃发展的时代,各类自动化工具如雨后春笋般涌现,为人们的工作和生活带来了前所未有的便利。其中,OmniParser V2 与 OmniTool 的组合,凭借其强大的功能和创新的设计,成为了计算机自动化操控领域的焦点。 OmniParser V2 是微软开源的一款极具实力的屏幕解析模型,…

【Python爬虫(50)】从0到1:打造分布式爬虫项目全攻略

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

React加TypeScript最新部署完整版

React TypeScript 全流程部署指南 一、环境准备与项目初始化 关于node.js及npm的安装请参见我的文章。 1.1 创建项目&#xff08;React TypeScript&#xff09; # 使用官方推荐脚手架&#xff08;Vite 5.x&#xff09; npx create-vitelatest my-app --template react-ts …

SpringBoot+Vue+微信小程序的猫咖小程序平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当下这个高速发展的时代&#xff0c;网络科技正以令人惊叹的速度不断迭代更新。从 5G …

【Ambari】Ranger KMS

目录 一、Ranger KMS介绍 二、KMS基于Ranger插件安装 一、Ranger KMS介绍 Ranger KMS是把数据存储入后台数据库中。通过Ranger Admin可以集中化管理KMS服务。 Ranger KMS有三个优点 l Key management Ranger admin 提供了创建&#xff0c;更新&#xff0c;删除密钥的Web UI…

在LangFlow中集成OpenAI Compatible API类型的大语言模型

一、背景与核心价值 从Dify换到这个langflow真的时各种的不适应啊。 就比如这个OpenAI Compatible API,这不应该是基本操作嘛? 算了,服了,习惯了就好了。咱闲言少叙,正片开始: LangFlow作为LangChain的可视化开发工具,其最大优势在于无需编写代码即可构建复杂的大模型…

【SQLI】sqlmap Tamper 脚本分类总结

sqlmap Tamper 脚本分类总结 1. 编码与转义2. 空白符混淆3. 关键字混淆与变形4. 特定数据库绕过5. 时间延迟绕过6. 字符串拼接与分割7. 注释干扰8. 特殊符号替换9. 特定协议/头操作10. 组合绕过技术11. 特定框架/WAF 绕过12. 非常规绕过使用场景示例完整 Tamper 列表命令 sqlma…

4*A100 部署 deepseek-r1-671B

部署deepseek-r1-671B 使用 4*A100 部署 deepseek-r1-671b-1.58bit 大模型。 环境 ubuntu22.04LTScuda 12.2.0 要求 内存&#xff1a; 256GB及以上显存&#xff1a; 256GB及以上&#xff08;160G可以跑起来&#xff0c;但对于长上下文容易oom&#xff09;&#xff0c;这里…