C++ 返回值为引用

C++引用参数与引用返回值细节处理提升代码效率 在C++中,引用参数(reference parameters)允许我们传递变量的引用而不是变量的副本。这意味着函数操作的是原始变量而非其副本,从而避免了不必要的拷贝操作。引用返回值(reference return values)允许函数返回一个变量的引用,而不是变量的值。这在需要返回大对象或希望直接修改调用者提供的对象时非常有用。如果使用引用接收引用返回值,则返回的引用必须具有较长的生存期,不可以引用局部变量。如果使用引用接收值返回值,则引用了一个临时对象,该对象的生存期将延长到和这个引用相同。 阅读详情

函数返回值和返回引用是不同的

函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:

 

1,引用函数的参数,当然该参数也是一个引用

 

     const string &shorterString(const string &s1,const string &s2)
      {
             return s1.size()<s2.size()?s1:s2;
      }

      以上函数的返回值是引用类型。无论返回s1或是s2,调用函数和返回结果时,都没有复制这些string对象。简单的说,返回的引用是函数的参数s1或s2,同样s1和s2也是引用,而不是在函数体内产生的。函数体内局部对象是不能被因哟个的,因为函数调用完局部对象会被释放。

 

2,千万不要返回局部对象的引用


      const string &mainip(const string &s)
      {
             string ret=s;
             return ret;
      }
      
      当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

 

3,在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象,典型的例子是string类的赋值函数。

 

[cpp]  view plain copy
  1. String& String::operator =(const String &str)  //注意与“+”比较,函数为什么要用引用呢?a=b=c,可以做为左值  
  2. {  
  3.     if (this == &str)  
  4.     {  
  5.         return *this;    
  6.     }  
  7.     delete [] m_string;  
  8.     int len = strlen(str.m_string);  
  9.     m_string = new char[len+1];  
  10.     strcpy(m_string,str.m_string);  
  11.     return *this;  
  12. }  
 

这与sting类中的“+”运算符重载不一样。“+”运算符的重载不能返回引用,因为它返回的是在函数内定义的类对象,附上代码。

[cpp]  view plain copy
  1. String String::operator +(const String &str)      
  2. {  
  3.     String newstring;  
  4.     if (!str.m_string)  
  5.     {  
  6.         newstring = *this;  
  7.     }  
  8.     else if (!m_string)  
  9.     {  
  10.         newstring = str;  
  11.     }  
  12.     else  
  13.     {  
  14.         int len = strlen(m_string)+strlen(str.m_string);  
  15.         newstring.m_string = new char[len+1];  
  16.         strcpy(newstring.m_string,m_string);  
  17.         strcat(newstring.m_string,str.m_string);  
  18.     }  
  19.     return newstring;  
  20. }  
 

 

4,引用返回左值(上例的=赋值也是如此,即a=b=c是可以的)

      char &get_val(string &str,string::size_type ix)
      {
             return str[ix];
      }

      使用语句调用:
       string s("123456");
       cout<<s<<endl;
       get_val(s,0)='a';
       cout<<s<<endl;

 

最后转上一段code作为总结。

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3. string make_plural(size_t,const string&,const string&);  
  4. const string &shorterString(const string &,const string &);  
  5. const string &mainip(const string&);  
  6. char &get_val(string &,string::size_type);  
  7. int main(void)  
  8. {  
  9.     cout<<make_plural(1,"dog","s")<<endl;  
  10.     cout<<make_plural(2,"dog","s")<<endl;  
  11.       
  12.     string string1="1234";  
  13.     string string2="abc";  
  14.     cout<<shorterString(string1,string2)<<endl;  
  15.       
  16.     cout<<mainip("jiajia")<<endl;  
  17.       
  18.       
  19.     string s("123456");  
  20.     cout<<s<<endl;  
  21.     get_val(s,0)='a';  
  22.       
  23.     cout<<s<<endl;  
  24.       
  25.     getchar();  
  26.     return 0;  
  27. }  
  28. //返回非引用   
  29. string make_plural(size_t i,const string &word,const string &ending)  
  30. {  
  31.     return (i==1)?word:word+ending;  
  32. }  
  33. //返回引用   
  34. const string &shorterString(const string &s1,const string &s2)  
  35. {  
  36.     return s1.size()<s2.size()?s1:s2;  
  37. }  
  38. //禁止返回局部对象的引用(我的dev c++ 没有报错,比较可怕)   
  39. const string &mainip(const string &s)  
  40. {  
  41.     string ret=s;  
  42.     return ret;  
  43. }  
  44. //引用返回左值  
  45. char &get_val(string &str,string::size_type ix)  
  46. {  
  47.     return str[ix];  
  48. }  

C++引用作为函数返回值 目录代码返回值 代码 //返回局部变量引用 int& test01() { int a = 10; //局部变量 return a; } //返回静态变量引用 int& test02() { static int a = 20; return a; } int main() { //不能返回局部变量的引用 int& ref = test01(); cout << "ref = " << ref << endl; cout &l 阅读详情

相关推荐

c++函数返回值是一个引用

函数返回值是一个引用的情况: 1.值是如何被返回的: 返回的值用于初始化调用点的一个临时量,该临时量就是函数调用的结果。 如果函数返回引用,则该引用仅是它所引对象的一个别名。 2.不能返回局部对象的引用或指针: 函数完成后,他所占的内存空间将被释放,函数的终止意味着局部变量的引用将指向不再有效的内存区域。 const string &mainip(){ string ret; ...

及时总结 2788

c++函数返回引用

细细研究研究函数返回引用的情况。

keyouan2008的专栏 4万+

海外跨境电商商城源码-进出口电商平台网站-多语言多商户平台

我们的海外跨境电商系统源码还包括各种功能模块,如用户管理、商品管理、订单管理等。支付管理:与主流支付平台(如Stripe、PayPal等)的集成,支持多种支付方式;订单管理:创建订单、支付订单、取消订单等操作,以及订单状态查询和历史记录;购物车管理:添加商品到购物车、查看购物车、修改购物车中的商品数量等操作;商品管理:商品信息录入、编辑、删除等操作,以及商品分类和搜索功能。客服管理:在线咨询、投诉处理等功能,提供更好的用户服务。用户管理:注册、登录、忘记密码、个人资料。# 检查电子邮件地址是否有效。

柏诣科技的博客 2660

int &在函数前的作用

在成员函数中,int &表示返回一个整型的引用。引用是一种别名,它允许我们使用一个变量的多个名称来访问同一个内存位置。返回一个引用可以让我们在函数外部修改函数内部的变量值,而不需要使用指针或者复制变量的值。这样就可以将num的值修改为10。输入任何一个x都输出x。

m0_74315028的博客 664

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 472

STM32H7多通道ADC数据采集实战:CubeMX配置ADC1/2/3+DMA/BDMA+Cache避坑全记录

本文详细解析了STM32H7多通道ADC数据采集的实战配置,涵盖CubeMX中ADC1/2/3与DMA/BDMA的协同设置及Cache一致性处理。通过硬件架构分析、DMA优化技巧和Cache避坑指南,帮助开发者实现高精度数据采集,适用于电机控制、环境监测等嵌入式系统。

weixin_28744613的博客 292

关于返回类型为引用

在c++中,函数经常返回类型为引用。 这里呢,我主要说的一点是,当返回类型为引用时,我们可以用引用来接受,也可以用普通变量来接受。 #include "pch.h" #include <iostream> using namespace std; int a = 19; int& lyy() { return a; } int main() { int b = lyy...

zhizuxinchangle123的博客 5747

本地部署ComfyUI:开源AI生图与视频生成完整实战指南

在生成式AI应用快速普及的今天,云端工具常受制于排队、积分和素材管理等问题,而本地化部署正成为开发者与创作者的高效替代方案。其核心思路是基于开源工作流引擎,将图像生成、视频生成与后期处理整合到同一套可离线运行的系统中。ComfyUI作为当前最受关注的节点式工作流平台,凭借灵活的模块组合和强大的自定义能力,降低了从图像模型调用到视频扩展的工程门槛。本文从环境配置与依赖安装入手,系统讲解如何部署ComfyUI、加载Checkpoint模型、跑通文生图基础流程,再通过自定义节点接入视频生成能力,同时介绍API批量

weixin_30985047的博客 577

引用作为函数返回值

如果函数的参数实质就是形参,不过这个形参的作用域只是在函数体内部,也就是说实参和形参是两个不同的东西,要想形参代替实参,肯定有一个值的传递。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由 new 分配)就无法释放,造成 memory leak。关于第二点,可以结合第一点分析,p1 和 p2 是实参的引用,不用经过值的传递机制,已经有了实参值的信息。float fn1 (float r) // 定义函数 fn1,它以返回值的方法返回函数值。

ucliaohh的专栏 2349

VisionPro开发实战:CogRecordDisplay控件显示与保存图片的完整流程(附C#代码示例)

本文详细解析了VisionPro开发中CogRecordDisplay控件的图像处理全流程,包括图像加载、显示优化、动态清屏及结果保存等关键操作。通过C#代码示例,展示了如何高效使用该控件进行工业视觉应用开发,特别适合自动化检测系统的开发者参考。

weixin_42523792的博客 276

c++中引用作为返回值

引用的意义: 1. 引用可以看作某个变量的“别名”,作为某个变量的别名而存在,因此在一些场合可以代替指针。 2. 引用相对于指针来说具有更好的可读性和实用性,能起到指针的部分作用,但是比指针安全。 3. 引用在c++里面可以说是一把利器,引用用的好的话可以写出非常精妙的程序。 引用的本质: 1. 引用在C++中的内部实现是一个常指针。 Type& name <--> Type* const name 2. C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占

Linux Daily的博客 3282

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

随着现代化经济的快速发展,物质条件富足的人开始追求精神富足,越来越多的人通过饲养观赏鱼来充实生活、释放压力,但并非所有饲养者都有时间和经验来管理好鱼缸。一种由单片机控制,可实时检测和调节鱼缸环境,可把鱼缸环境实时反映给用户并能被用户远程操控的系统,可以解决养鱼成活率低、耗费时间和精力、参与感不强等诸多难题。

嵌入式技术开发 7352

C++中函数返回值当引用

本文主要介绍C++中函数返回值当引用。

TechNomad的博客 1474

AXI总线详解完结篇

经过几个月的整理和发文,AXI总线详解系列正式迎来最终篇,内容基本涵盖了上一篇文章的全部内容。 所有文章的链接如下: 1、 AXI总线详解 2、AXI总线详解-总线和接口以及协议 3、AXI协议中的通道结构 4、AXI总线详解-AXI4读写操作时序及AXI4猝发地址及选择 5、AXI4交换机制 6、ZYNQ中DMA与AXI4总线-DMA简介 7、AXI总线详解-不同类型的DMA 8、AXI总线详解-DMA内部寄存器的读写方式 9、AXI总线详解-几种应用DMA的场合 10、Altera Scatter-G.

OpenFPGA的博客 5492

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++ 引用作为函数返回值

(1)以引用返回函数值,定义函数时需要在函数名前加 &amp; (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。 引用作为返回值,必须遵守以下规则: (1)不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 #include &lt;iostream&gt; using namespace s...

a3192048的博客 2万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++函数返回值和返回引用

C++函数的返回过程基本可以分为两个阶段,返回阶段和绑定阶段,根据两个阶段中需要返回的值的类型不同(返回值和引用),和要绑定的值的类型(绑定值和引用)会产生不同的情况。 最基本的规则是先返回,再绑定,返回和绑定的时候,都有可能发生移动或者拷贝构造函数的调用来创建临时对象,并且只会发生一次。更具体的,当返回值的时候,函数返回之前,会调用一次拷贝构造函数或移动构造函数,函数在绑定到值的时候,会发生一...

gtl_csdn的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c++ 引用作为函数的返回值

c++ 引用的本质就是常量指针。 当引用作为函数的返回值时,应该注意以下几点: 1. 引用作为函数的返回值时,必须在定义函数时在函数名前加& 2. 用引用作函数的返回值的最大好处是在内存中不产生返回值的副本。(我认为这样不仅节省了内存,同时提高了系统运行的效率)。 3. 引用作为函数的返回值时,不能返回局部变量的引用。由于函数存在生命周期,他会在函数返回后被销毁,此时对临时变量的引...

qq_20880939的博客 1593

C++ 把引用作为返回值

引用作为返回值 1.通过使用引用来替代指针,会使 C++ 程序更容易阅读和维护。 2.C++ 函数可以返回一个引用,方式与返回一个指针类似。 3.当函数返回一个引用时,则返回一个指向返回值的隐式指针。这样,函数就可以放在赋值语句的左边。 注意: (1)以引用返回函数值,定义函数时需要在函数名前加& (2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。 引用作为返...

weixin_30907523的博客 277

C++引用作为返回值

#pragma 引用作为返回值 #include using namespace std; //返回值类型是引用 相当于创建一个匿名的临时变量 int& fa(int& r){ r++; return r; } int& fb();//函数声明 //主函数 int main (){ int x = 100; // fa(x); // cout <

iOS小菜鸟的专栏 1171

C/C++ 引用作为函数的返回值

语法:类型 &amp;函数名(形参列表){ 函数体 } 特别注意: 1.引用作为函数的返回值时,必须在定义函数时在函数名前将&amp; 2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 //代码来源:RUNOOB #include&lt;iostream&gt; using namespace std; float temp; float fn1(float r){ ...

Jeff_的博客 7万+

C++ 引用作为函数的返回值

语法:类型 &函数名(形参列表){ 函数体 } 特别注意: 1.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 //代码来源:RUNOOB #include<iostream> using namespace std; float temp; float fn1(float r){ temp=r*r*3.14; return temp; } float &fn2(fl.

qq_38472635的博客 594

C++ 函数返回值为引用

C++函数的返回值——返回引用类型&非引用类型 函数的返回主要分为以下几种情况: 1、主函数main的返回值: 允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。 2、返回非引用类型: 函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是

going_fighting的博客 725

C++ 面向对象 引用返回值

,函数结束后局部变量销毁,返回的引用将指向无效内存(悬空引用),导致未定义行为。引用作为函数返回值时,实际上是返回变量本身的别名,而非值的拷贝。:将数据(属性)和操作数据的方法(行为)封装为类,通过访问控制(),允许直接修改实参并返回其别名,常用于链式操作或状态更新。:编译器为含虚函数的类生成虚函数表,实现运行时动态绑定。开闭原则:通过继承扩展功能,而非修改现有代码(如新增。单一职责原则:类应专注于单一功能(如。:若返回局部非静态变量(如。:通过引用参数返回结果(如。作用:增强安全性(如。

波风水门的博客 1184
上一篇: C++ 返回值为引用
下一篇: string::npos的一些说明
ToConnection
博客等级 码龄16年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值