C++函数返回引用

2023-10-31

注:C++ 有三种传递方式:值传递,指针传递,引用传递

返回“值”和返回“引用”是不同的

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

一、千万不要返回局部对象的引用

      const string &mainip(const string &s)
      {
             string ret=s;
             return ret;
      }

        当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。

        同理,指针也是这样,返回指针的时候,不能指向局部临时变量,否则指针将变为野指针;

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

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

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

三、返回 this 指向的对象

        在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为 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. }  

四、引用返回this 的成员变量,或者 引用参数的成员变量

        原标题为:引用返回左值(上例的=赋值也是如此,即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;

        这种情况,和第二种是一样的,只不过是返回了参数(引用类型)的一部分。也可以不作为左值,故修改如下:

char &ch = get_val(s,0);
ch = ‘A’;

 

        此句进行的都是引用传递,故运行之后,s[0] 就变为了 A,s为“A23456”;

        此外,可以返回引用参数的成员变量,亲测有效。似乎不是局部临时变量,只要函数结束之后内存没有被销毁的,作为引用返回都没问题:

QString& Test(Student &stu)
{
    return stu.m_name;
}

QString & Student::getRName()
{
    return (*this).m_name;
}

五、最后转上一段code作为总结

#include<iostream>
using namespace std;
string make_plural(size_t,const string&,const string&);
const string &shorterString(const string &,const string &);
const string &mainip(const string&);
char &get_val(string &,string::size_type);
int main(void)  
{  
    cout<<make_plural(1,"dog","s")<<endl;  
    cout<<make_plural(2,"dog","s")<<endl;  
      
    string string1="1234";  
    string string2="abc";  
    cout<<shorterString(string1,string2)<<endl;  
      
    cout<<mainip("jiajia")<<endl;  
      
      
    string s("123456");  
    cout<<s<<endl;  
    get_val(s,0)='a';  
      
    cout<<s<<endl;  
      
    getchar();  
    return 0;  
}  
//返回非引用   
string make_plural(size_t i,const string &word,const string &ending)  
{  
    return (i==1)?word:word+ending;  
}  
//返回引用   
const string &shorterString(const string &s1,const string &s2)  
{  
    return s1.size()<s2.size()?s1:s2;  
}  
//禁止返回局部对象的引用(我的dev c++ 没有报错,比较可怕)   
const string &mainip(const string &s)  
{  
    string ret=s;  
    return ret;  
}  
//引用返回左值  
char &get_val(string &str,string::size_type ix)  
{  
    return str[ix];  
}  


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

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

  • 通过 Active Directory 搜索进行有效分页

    在 NET 中使用 Active Directory 搜索进行分页的有效方法是什么 在 AD 中进行搜索的方法有很多 但到目前为止我找不到如何有效地进行搜索 我希望能够表明Skip and Take参数并能够检索结果中与我的搜索条件匹配的记
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • 从变量使用 OLE DB 源命令的 EzAPI 等效项是什么?

    tl dr 使用 来自变量的 SQL 命令 数据访问模式的 OLE DB 源并分配变量的 EzAPI 代码是什么 Preamble 每月一次 我们需要使用生产数据的子集刷新我们的公共测试站点 我们已确定 根据我们的需求 SSIS 解决方案最
  • 在 MS word .docs 中插入 MathMl 、 Tex 或 LaTex 方程?

    我一直在寻找 C 中 Net 的一些 dll 用于在 MS Word 中插入任何 MathMl Tex 或 LaTex 方程 我尝试了一些类似 DocX 的工具 但它们失败了 你知道吗 或任何提示如何做到这一点 谢谢 Word 2007 可
  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 使用 C# 在 Windows 窗体应用程序中正确使用 OnClick 与 MouseClick 事件

    我目前正在开发一个自定义控件 并意识到我的代码正在运行两次 这实际上并不是一个大问题 它只是 Focus 方法调用 不过 我想了解一下 从阅读点击 MSDN说明单击事件 http msdn microsoft com en us libra
  • C# 3 新功能帖子(与 .Net 3.5 功能无关)[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions Net F
  • C# 中具有字符串键类型的不区分大小写字典

    如果我有一个Dictionary
  • PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

    我正在使用 Npgsql 3 0 3 0 和 PetaPoco 最新版本 当我运行这个命令时 var dateCreated DateTime Now just an example var sql new Sql WHERE date c
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • cygwin $'\r':命令未找到错误

    我稍微修改了一个项目 在调试下它运行得很好 当我尝试在不调试的情况下构建它时 它显示错误 无法修复它 make Making all in third party make 1 Entering directory cygdrive c U
  • 在信号/槽处理期间删除 QObject

    我知道从槽处理中删除 QObject 可能会使应用程序崩溃 因为它可能有其他排队的事件 因此 我将使用 obj gt deleteLater 而不是使用 delete obj 据我所知 obj 等待处理所有排队的事件 然后 删除 obj Q
  • OpenXML 如何获取范围内的单元格

    请帮助我获取范围内的单元格 例如从 A 1 到 E 11 都是矩形单元格 目前我的理想是 Worksheet worksheet GetWorksheet document sheetName SheetData sheetData wor
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • C# 多重继承

    目前我正在学习 C 和 ASP NET MVC 4代码优先方法 我是 Visual Basic 开发人员 现在我想开始 C 而且 现在我遇到了必须管理多重继承的情况 但是 对于Class i来说这是不可能的 那么 我应该如何管理我拥有的这些
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起

随机推荐

  • lua快速入门

    Lua语言简介 1993 年在巴西里约热内卢天主教大学 Pontifical Catholic University of Rio de Janeiro in Brazil 诞生了一门编程语言 发明者是该校的三位研究人员 他们给这门语言取了
  • pytorch dataset自定义_目标检测:SSD模型——pytorch数据载入及增广

    进行模型训练的第一步是载入数据 使用pytorch框架载入数据需要两个步骤 构建Dataset数据集和创建Dataloader数据迭代器 pytorch要载入数据训练SSD 可以直接调用 torchvision datasets VOCDe
  • 【arxiv】Few-Shot Text Generation with Pattern-Exploiting Training

    原文链接 https arxiv org pdf 2012 11926 pdf Abstract 为预先训练好的语言模型提供简单的任务描述或自然语言提示 可以在文本分类任务产生令人印象深刻的few shot结果 在本文中 我们表明了这个潜在
  • storm ui 启动失败,zooper重启解决方案

    给大家写了一个zk集群 如果你linux命令的基础部分 搭建zk集群是很简单的事情 zk集群搭建好了我们怎么连接zk 客户端 进行操作那 接下来就给大家演示如何使用zk shell 的使用 补充 登陆zooper客户端 删除操作 删除sto
  • 关于python报证书验证失败如何解决

    1 使用python访问https的时候返回错误 urllib error URLError
  • 利用Python实现四则运算

    利用Python实现四则运算 输入两个变量 根据类型判断他是否进行运算 若为a和b同时满足int或float类型时 则利用choice选择你所要进行的那种运算 若类型错误 输出其类型 a eval input 请输入a b eval inp
  • tensorflow 移植到android平台

    我的书 淘宝购买链接 当当购买链接 京东购买链接 本文基于 https github com MindorksOpenSource AndroidTensorFlowMachineLearningExample 下载和安装jdk ndk和s
  • shell脚本根据端口杀死进程(带完整解析)

    各位可以将下述内容当为学习Shell脚本 如果只是想要更方便地根据端口杀死进程 可以直接使用该方法 port是端口 kill 9 lsof ti port 在项目开发的时候 我们经常需要根据相对应的端口来杀死进程 而这样的操作最少需要两步
  • 直流无刷减速电机PID控制

    最近做了直流无刷减速电机的控制的项目 针对项目中遇到的问题做下总结 PID Control PID 代码 速度环 位置环 串级 STM32F407VET6 STM32CubeMX 更新记录 V1 0 0 2022 8 5 完善了RTOS程序
  • 怎么使用大疆无人机建模?

    倾斜摄影测量技术是国际测绘遥感领域近年发展起来的一项高新技术 以大范围 高精度 高清晰的方式全面感知复杂场景 通过高效的数据采集设备及专业的数据处理流程生成的数据成果直观反映地物的外观 位置 高度等属性 为真实效果和测绘级精度提供保证 同时
  • 说说学习python pycharm中踩的坑

    说说学习python pycharm中踩的坑 我真的很讨厌很痛苦这种啥都不懂 只能在黑暗中摸索的感觉 1 python 3 9 及以上版本是不支持win7的 2 要安装 python 2 7 和 python 3 8 这样才能在pychar
  • 反射、xml解析

    反射 反射就读取class文件 获取该文件中的属性 方法等 作用 用来获取指定路径下的class文件中所具备的的所有属性和方法 返回Class对象的方式之一 getClass 每一个引用数据类型都有一个getClass的方法 返回的是该类的
  • EXCEL的快速分列

    1 打开Excel并选择分列 选择智能分列 点击 2 选择手动设置分列 3 注意符号一定是英文要和你分列的数据内符号一致 4 点击下一步完成 效果如下
  • 数据链路层三个基本问题(封装成帧 、透明传输和差错检测 )

    文章目录 使用点对点信道的数据链路层 1 1 数据链路和帧 1 2 三个基本问题 1 封装成帧 2 透明传输 3 差错检测 循环冗余检验CRC 帧检验序列 FCS 接收端对收到的每一帧进行 CRC 检验 数据链路层使用的信道主要有以下两种类
  • linux suse设置中文系统

    Linux字符编码默认为UTF 8 如出现乱码可设置为GBK 1 手动更改profile文件的命令 vi etc profile 2 在文件的末尾添加以下两行命令 export LC ALL zh CN GBK export LANG zh
  • Happiness【2019EC Final G题】【模拟】

    题目链接 题意很长 先翻译一下 由N个参赛队伍 给出其余N 1只参赛队伍 另外一支队伍是我们 本次ICPC一共有10道题 我们知道其余N支队伍每道题的通过时间和错误次数 如果是 则为没有在300分钟内解决该问题 最后给出我们队伍 做出每道题
  • 窨井液位计(下水道液位计)的分类

    窨井液位计又称下水道液位计 是应用在市政管网监测集水井 雨水井 污水井 观察井等测量水位变化的仪表 根据原理不同可分为 压力式 雷达式和超声波式3种 通过传感器测量液位数值 利用无线远传的方式上传到数据平台 实现对井下水位实时监测的目的 压
  • yapi的安装

    Yapi的安装 Yapi是一款不错的接口管理软件 我主要用它来进行接口Mock Yapi安装所需环境 Node js 7 6 Mongodb 2 6 git 各环境安装地址 git https git scm com downloads N
  • F.softmax()的用法

    F softmax 的用法 gt gt gt import torch gt gt gt import torch nn functional as F gt gt gt logits torch rand 2 2 gt gt gt pre
  • C++函数返回引用

    注 C 有三种传递方式 值传递 指针传递 引用传递 返回 值 和返回 引用 是不同的 函数返回值时会产生一个临时变量作为函数返回值的副本 而返回引用时不会产生值的副本 既然是引用 那引用谁呢 这个问题必须清楚 否则将无法理解返回引用到底是个