C++:在这种情况下引用的优点是什么?

2024-03-24

我有两段代码:

int f1(int b)
{
   return b;
}

int & f2(int b)
{
   return b;
}

这些功能有什么区别?我知道第二个返回一个引用,但由于我可以以相同的方式使用这两个函数,有什么区别?

编辑:这个功能更好吗?

int && f2(int b)
{
   return b;
}

我什么时候应该使用返回引用的函数?

Edit2:那么我什么时候应该使用返回右值引用的函数?


考虑一个简单的类,它包装了一个数组,其目的只是为了提供 OP 可以对返回的引用执行哪些操作的示例。

class example
{
private:
    int array[]= {1,2,3,4,5,6,7,8,9,0};
public:
    int get(int index)
    {
        return array[index];
    }
    int & get2(int index)
    {
        return array[index];
    }
}

现在我们有一个例子,它不会陷入未定义行为的荒地,并且可以向您展示这个全副武装且可操作的参考的力量。

说我们有

example x;

我们可以调用 get 函数来检索值

int val1 = x.get(1);
int val2 = x.get2(2)

但我们也可以

x.get2(3) = 30;

因为 get2 返回一个引用,我们可以分配给它并使分配保持不变。

如果您想向示例添加索引运算符,这是非常宝贵的

int & operator[](int index)
{
    return array[index];
}

因为它允许预期的数组行为

int val = x[5];
x[6] = 10;

EDIT

托尼·D 提出了另一个重要特征。返回引用返回by参考。除了允许修改返回的对象之外,这不会创建副本并节省了创建副本所消耗的任何精力。对于整数的示例情况,这是没有意义的。传递整数和对整数的引用的成本要么相同,要么非常接近,以至于无关紧要。对于可能需要花费大量精力来复制的更大、更复杂的对象或不能或不应该复制的对象,情况并非如此。

BigFreakingObject & getBigFreakingObject();

将允许调用者操作BigFreakingObject无需承担重复的成本。然而,这会移交王国的钥匙,并允许调用者执行以下操作:BigFreakingObject任何BigFreakingObject的权限将允许,这可能与以下的要求相冲突BigFreakingObject的主人。

将引用声明为const with

const BigFreakingObject & getBigFreakingObject();

or

BigFreakingObject const & getBigFreakingObject();

将提供一个参考BigFreakingObject但不允许调用者修改其状态,保护所有者BigFreakingObject免受任何不愉快的意外。

有关这方面的更多详细信息,阅读常量正确性 https://isocpp.org/wiki/faq/const-correctness.

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

C++:在这种情况下引用的优点是什么? 的相关文章

  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • C# 3 新功能帖子(与 .Net 3.5 功能无关)[关闭]

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

    如果我有一个Dictionary
  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • 如何重命名 bash 函数?

    我正在围绕另一个定义 bash 函数的软件包开发一些方便的包装器 我想用我自己的同名函数替换他们的 bash 函数 同时仍然能够从我的函数中运行他们的函数 换句话说 我需要重命名它们的函数 或者为其创建某种持久别名 当我创建同名函数时 该别
  • send() 使我的程序崩溃

    我正在运行服务器和客户端 我正在我的计算机上测试我的程序 这是服务器中向客户端发送数据的函数 int sendToClient int fd string msg cout lt lt sending to client lt lt fd
  • 重写 ASP.Net Core 中的 415 响应

    在 ASP net Core 2 1 中 我想返回 Json 响应以及状态代码 415 而不是默认返回的 415 为了实现这一点 我使用资源过滤器 public class MediaTypeResouceFilter Attribute
  • 为什么 ATOMIC_FLAG_INIT 为假?

    In C 11有std atomic flag这对于线程循环很有用 static std atomic flag s done ATOMIC FLAG INIT void ThreadMain while s done test and s
  • 数据绑定问题,请解释

    public partial class Form1 Form MyClass myClass new MyClass one two public Form1 InitializeComponent textBox1 DataBindin
  • ASP.NET MVC - HybridViewResult (ViewResult /PartialViewResult)

    是否可以构建一个依赖于 Ajax 请求或 Http 请求返回的混合 ViewResultPartialViewResult or ViewResult IsAjaxRequest gt 返回 PartialViewResult IsAjax
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • std::regex 的行为不一致

    我有以下问题 std regex如果我传递结果 行为会有所不同boost filesystem path string vs 将结果存储在中间字符串变量中 第一个将返回一个被截断的匹配 并且稍后不被接受std stoull 抛出 inval
  • cygwin $'\r':命令未找到错误

    我稍微修改了一个项目 在调试下它运行得很好 当我尝试在不调试的情况下构建它时 它显示错误 无法修复它 make Making all in third party make 1 Entering directory cygdrive c U
  • DateTimeFormat.AbbreviatedMonthNames 在月份名称末尾添加一个点

    昨晚 我们将 Web 服务层从物理 Windows 2008 r2 迁移到虚拟 Windows 2012 我们的日志中收到大量有关 DateTime 无效格式的事件 这很奇怪 因为我们仔细检查了区域设置 长话短说 CultureInfo G
  • 解析 SWIG 接口文件的结构属性

    这是我不久前问过的问题的延续 为通过参数返回的函数创建类型映射 https stackoverflow com questions 12793973 create a typemap for a function that returns
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • ASP .NET Core IIS 托管用户身份名称为空且 IsAuthenticated=false

    我在 IIS 上运行 ASP NET Core dll 使用 AspNetCoreModule 使用以前的 ASP NET 我可以通过以下方式获取用户身份名称 HttpContext Current User Identity Name 因
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • 写入 Windows 7“预览”窗口区域

    如何使用 C 将控件写入或绘制到 Windows 7 预览区域 作为我正在讨论的示例 请在 Windows 7 中打开 Windows Media Player 并播放一首歌曲 播放歌曲时 最小化 Windows Media Player

随机推荐

  • 如何在 for_each 中组合函数和谓词?

    你怎么能打电话给Function over some容器的一部分 使用for each 我创建了一个for each if 做一个 for i in shapes if i color 1 displayShape i 电话看起来像 for
  • 用于挂钩进程函数的 Linux 模块

    我有一个问题 也许你有一些关于这方面的信息 我想在运行进程中挂钩套接字接收函数 recv 并修改传入数据 我怎么知道 我可以使用内核模块来做到这一点 但我找不到有关如何执行此类挂钩的信息 我尝试过其他方法 例如 Netfilter ipta
  • 使用 Alamofire ObjectMapper 映射到 Swift 对象问题显示 nil

    我是 iOS 和 Swift 开发环境的新手 我试图使用 Alamofire 来提取 JSON 并使用 AlamofireObjectMapper 将检索到的 JSON 集合映射回我的 Swift 对象 问题是我可以通过 Alamofire
  • Calendar.getTime() 失败,并显示 java.lang.IllegalArgumentException:MINUTE(对于亚洲/新加坡时区)

    为什么这段代码会失败 目的是删除时间部分 String dateStr 1982 01 01 String timeZoneID Asia Singapore DateFormat dateFormat new SimpleDateForm
  • django图像上传表单

    我在 django 表单和图像上传方面遇到问题 我已经用谷歌搜索 阅读了文档 甚至还提出了问题 但无法找出问题所在 这是我的文件 我的模特 class UserProfile User user with app settings DESI
  • 以编程方式 IIS 6.0 - 创建虚拟目录且未将其设置为应用程序时出现问题

    因此 我以编程方式在 IIS 6 0 中创建虚拟目录 但我遵循有关创建虚拟目录的唯一 MSDN 或其他 文档 但我的文档位于 http msdn microsoft com en us library ms525598 VS 90 aspx
  • 从范围引用但未定义的 LambdaExpression 变量

    我有一个简单的 lambda 表达式 我想编译和调用它 Expression lt Func lt Commands bool gt gt expression c gt c IsValid test 但是当我执行以下操作时 LambdaE
  • 变异下标越界

    我正在尝试从两个插入符号模型输出创建敏感性和特异性的汇总表 并且在我的 for 循环中 当从包含值的名为 models 的列表中查找值时 它会抛出下标越界错误 这是一个完全可重现的示例 Dplyr 的版本是 0 7 0 谢谢 heart l
  • Laravel、AngularJS 和 CORS 的路由问题

    我一直在广泛寻找解决这个问题的方法 我有一个 AngularJS Web 应用程序 其后端实现为 Laravel 4 如下所示 http app mydomain io AngularJS web app http api mydomain
  • 在 x86 32 位中禁用分页

    我试图直接写入物理内存位置 因此我使用汇编函数首先禁用分页 写入值 然后重新启用分页 但由于某种原因 在尝试写入时仍然会触发页面错误价值 据我了解 在x86 32位中 通过翻转cr0中的第32位来打开和关闭分页 所以这是我的汇编函数 mov
  • 使用 robocopy 复制文件(长名称和路径,以及许多空格) - 缺少参数

    我尝试使用 robocopy 复制文件 但 PowerShell 给出错误 MissingArgument robocopy D Enciclopedia mia Tutorial FATTI DA ME Internet Google L
  • 是否可以让您上传的 iPhone 应用程序自动更新? [复制]

    这个问题在这里已经有答案了 我即将将我的 iPhone 应用程序上传到苹果商店 但我打算在不久的将来发布更多版本 一旦我将新版本上传到苹果商店 是否有办法使我的应用程序自动更新 也就是说 我即将上传版本 1 0 一旦我上传版本 1 x 用户
  • 并发字典 AddOrUpdate 与索引添加

    在当前项目中 我可以通过两种方式为并发字典中的现有键分配值 A concurrentDictionary1 key value and B concurrentDictionary2 AddOrUpdate key value k v gt
  • 如何在 Pygame 中获取显示器的分辨率?

    我只是想知道我是否可以在 Pygame 中获取显示器的分辨率 然后使用这些尺寸创建一个窗口 以便启动程序检测显示器分辨率 然后自动将窗口适合全屏屏幕 我目前正在使用pygame display set mode AN INTEGER AN
  • weblogic.jndi.WLInitialContextFactory 类在哪里?

    当尝试执行我的 jar 文件时 出现异常 javax naming NoInitialContextException Cannot instantiate class weblogic jndi WLInitialContextFacto
  • 有条件地将操作添加到 Java 8 流

    我想知道是否可以根据流外部设置的某种条件向流添加操作 例如 我想向流添加限制操作 如果我的limit变量不等于 1 我的代码目前看起来像这样 但我还没有看到以这种方式使用流的其他示例 其中 Stream 对象被重新分配给应用于自身的中间操作
  • Haskell 中关系数据的安全建模

    我发现在函数式程序中对关系数据建模是很常见的 例如 在开发网站时 我可能希望使用以下数据结构来存储有关我的用户的信息 data User User name String birthDate Date 接下来 我想存储有关用户在我的网站上发
  • Django 自定义表单 ImportError 即使文件位于同一目录中

    我正在努力通过有效的 Django http effectivedjango com 教程系列 我目前在尝试创建要在应用程序中使用的自定义表单时遇到问题 我按照中的说明创建了 forms py 文件本教程的这一部分 http effecti
  • 中心参数在新的谷歌地图嵌入中不起作用

    我已将新的嵌入代码用于新的谷歌地图 如下所示 https developers google com maps documentation embed guide https developers google com maps docum
  • C++:在这种情况下引用的优点是什么?

    我有两段代码 int f1 int b return b int f2 int b return b 这些功能有什么区别 我知道第二个返回一个引用 但由于我可以以相同的方式使用这两个函数 有什么区别 编辑 这个功能更好吗 int f2 in