C++函数返回引用

2023-11-09

首先需要明白:C++函数为什么要返回引用?

答:这样就不用返回结果的副本。因为返回副本需要做赋值拷贝函数,浪费时间。这时候,实际上,返回是结果的副本,而不是结果本身。如果要返回本身,就返回引用就OK了。

例1:

const string manip2(const string& s){
	string ret = s;
	return ret;
}
此时,返回的不是ret本身,而是ret的副本。这个副本调用复制构造函数,与ret一摸一样。无法区别它和ret,带来的性能的损失。

记住,C++函数返回引用,一定不能返回指向本地的变量的引用。否则,函数运行完毕,本地变量销毁,那这个引用是谁的别名呢?who knows,程序只有崩溃了。

C++函数如果返回引用,就要返回在这个函数之前就存在的变量的引用才行。

例2C++函数返回本地变量的引用

const string& manip1(const string& s){
	string ret = s;
	return ret;               //never do this
}

可以看出,例子1和例子2的区别是很微妙的,只有返回值类型不一样:string和string&。如果申明了string&,那么函数就直接返回了ret而不是ret的副本。当函数结束的时候,ret变量被销毁,如果主函数用到了这次函数的调用,程序立即崩溃。我刚才试了试,确实崩溃了。


哈哈,谁都不想看到上面的那个图吧。而且,在编译的时候,编译器也给出了警告:..\test.cpp:4:9: warning: reference to local variable 'ret' returned

这里是测试代码:

# include <iostream>
using namespace std;
const string& manip1(const string& s){
	string ret = s;
	return ret;
}
const string manip2(const string& s){
	string ret = s;
	return ret;
}
int main(){
	string test("hello,world");
	string result1 = manip1(test);
	string result2 = manip2(test);
	cout << result1 << endl;
	cout << result2 << endl;
}

我前面自己写两个complex的复数类实现点击查看

在重载+运算符号的时候,我就是返回的引用:

my_complex& my_complex::operator +(const my_complex& rhs) {  
    real = rhs.real + real;  
    imag = rhs.imag + imag;  
    return *this;  
}  
由于我返回的引用在此次调用函数之前就已经存在(*this),那么,我返回的引用是合适的。而我看了看不少网上其它人的实现,这里返回的都是my_complex,不是一个引用。也许还有其它考虑。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++函数返回引用 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 如何在 Swift 2.0 中使用 stringByAddingPercentEncodingWithAllowedCharacters() 作为 URL

    我在 Swift 1 2 中使用过这个 let urlwithPercentEscapes myurlstring stringByAddingPercentEscapesUsingEncoding NSUTF8StringEncoding
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐

  • Vue3+TypeScript+Router+Vuex+Ant-Design-Vue项目(一)—— 使用 vue-cli 搭建项目

    为了更好地掌握 vue3 和 TypeScript 准备搭建一个后台管理系统来学习一下 技术栈 Vue3 Typescript Vue router Vuex Ant Design Vue 1 初始化项目 vue create
  • 【Flutter】篇9:相机

    挑选系统的相册 调用相机的功能 需要用到官网插件image picker 官网代码 运行报错 ERROR D8 Cannot fit requested classes in a single dex file methods 68998
  • 虚拟机硬盘直通挽救黑群晖数据

    之前用一台一体机做了一个黑群晖 放了一些1080P和4K的高清影片进去 数据并没有特别重要 但是由于多次意外停电 我又把黑群晖设置为来电自动重启 估计是硬盘受了一些影响 导致黑群晖无法被群晖助手搜索到 黑群晖变砖 我这个黑群晖是1个U盘作为
  • Thymeleaf 基本用法

    hymeleaf 是一款用于渲染 XML XHTML HTML5 内容的模板引擎 类似 JSP Velocity FreeMaker 等 它也可以轻易的与 Spring MVC 等 Web 框架进行集成作为 Web 应用的模板引擎 与其它模
  • 巧用千寻位置GNSS软件

    线路施工放样主要是解决线路工程和水利工程施工中 线路及渠道中线和边坡施工放样编辑的专用程序 千寻位置GNSS软件中完成线路施工放样可按照下述步骤操作 点击 测量 gt 线路施工放样 选择一条线路放样 如图 5 6 1所示 图 5 6 1 图
  • keras转onnx

    1 先将keras模型保存为tf model path pnet h5 模型文件 model tf keras models load model model path model save pnet save format tf 2 将保
  • 飞浆AI studio人工智能课程学习(4)-优质Prompt分享

    文章目录 最具商业价值Prompt分享与颁奖 02最具商业价值Prompt分享与颁奖 Top1 02最具商业价值Prompt分享与颁奖 Top2 02最具商业价值Prompt分享与颁奖 Top3 02最具商业价值Prompt分享与颁奖 To
  • sqli-labs (less-5)

    sqli labs less 5 第五关和前面的四关就不一样了 当我们输入id 1时 页面不会再返回用户名和密码 而是返回了 You are in 输入 http 127 0 0 1 sql1 Less 5 id 1 这里报错 根据错误信息
  • 上门服务预约小程序系统开发功能 有哪些行业适合预约小程序

    疫情爆发以来 实体企业越来越难做 特别是服务行业更是收到了很大的影响 都在不断的谋求新的出路 很多企业开始发展线上业务 打造预约上门便捷服务 希望借助互联网打通一条新出路 干洗店洗衣店洗鞋店开发线上预约上门服务就是其中之一 那么预约小程序都
  • learning、trying、teaching

    在工作中学习和提升 学以致用 学习的效果是最好的 工作后学习不需要大段时间 而是要挤出时间 利用时间碎片来学习 1 Learning 这是第一阶段 看书 google 看视频 看别人的博客 但要是 系统化 特别是一些基础性的东西 2 Try
  • vue elementUI 之 this.$confirm 用法

    this confirm 您确定退出当前账号吗 提示 confirmButtonText 确定 cancelButtonText 取消 type warning then gt 确定操作 this loading true
  • 【踩坑】parallel并发流导致数据异常

    踩坑 parallel并发流导致数据异常 1 场景 2 代码 3 原因 4 总结 1 场景 今天生产反馈有异常 看看日志是CollectionUtils sort空指针异常 这一眼看就是list中的排序有空元素 首先想到的是sql查出来的字
  • 我的tesseract-orc3.01样本训练记录

    官网样本训练网址 https code google com p tesseract ocr wiki TrainingTesseract3 一步一步来按照官网的步骤来做 由于我用的tesseractORC3 01版本 官网最新的版本是3
  • 耗时的同步请求自动转异步请求

    耗时的同步请求自动转异步请求 问题描述 问题处理 代码实现 问题描述 现在在项目中碰到一个情况 导出数据到excel 在数据量比较下的时候直接下载 在数据量比较大时保存到服务的文件列表 后续再供用户下载 也就是需要避免前端因后端处理时间过长
  • windows下激活conda环境

    windows activate env name linux source root autodl tmp environment bgmv30222 bin activate
  • (2003, "Can't connect to MySQL server on 'IP' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)")

    2003 Can t connect to MySQL server on IP WinError 10061 与MySql 只能访问localhost 和 127 0 0 1访问 不能通过其他IP访问 问题描述 项目中跨域请求数据 在远程
  • 华为od机试 Python【游戏最高分】

    题目 小明正在和他的朋友们玩一个跳格子的游戏 这个游戏有一个行列 共包含n个格子 每个格子里都有一定的分数 游戏的规则如下 小明可以选择任意一个格子作为起点 从起点开始 小明可以选择跳到任意非相邻的格子 也就是说 如果小明当前在第i个格子
  • java中的resultset类详解

    一 JDBC sun 提供了一套通用性的接口 可以连接任何的数据库 连接数据库的具体得到实例 具体的数据库厂商实现的 连接数据的步骤 别忘了复制jar包 1 注册驱动 Class forName DriverManager 2 获得链接对象
  • CMD中提升帐户到管理员权限

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 提升用户权限 从打开的 命令提示符 窗口中 输入命令 net localgroup administrators 用户名 add 并按回车 即可给当前 用户名 提升为 管理
  • C++函数返回引用

    首先需要明白 C 函数为什么要返回引用 答 这样就不用返回结果的副本 因为返回副本需要做赋值拷贝函数 浪费时间 这时候 实际上 返回是结果的副本 而不是结果本身 如果要返回本身 就返回引用就OK了 例1 const string manip