首页 > 解决方案 > 为什么在 C++ 中按值返回是推荐的方式?

问题描述

我正在读一本关于 C++ 的书,我想知道为什么按值返回是推荐的方式。我们可以通过引用返回而不是使用输出参数,那么为什么我们不建议通过引用返回呢?

在此处输入图像描述

标签: c++

解决方案


在考虑返回引用之前,您必须首先确定结果将引用哪个对象。你有什么选择?

  1. 您可以返回对本地自动变量的引用......这非常糟糕,因为一旦函数返回,本地变量将不存在。
  2. 您可以返回对静态或线程本地存储中的变量的引用。这很糟糕,因为全局状态很糟糕。
  3. 您可以返回对调用者作为参数提供的对象的引用。好吧,在这种情况下,返回引用通常是没有意义的,因为调用者已经知道对象在哪里,因为他们首先负责提供参数。这只是引用文本推荐的“输出参数”的复杂版本。

当然,在某些情况下返回引用是有意义的。引用的一般经验法则并不适用于所有情况。它们适用于大多数简单的情况。如果您知道不遵循它的充分理由,那就不要这样做。如果你不知道是否有原因,那么就按照规则,直到你理解为止。

重要的是要注意建议的上下文。该部分以“如果您有一个需要返回类的对象的函数...”开头。上下文不是“如果您有一个需要返回对类对象的引用的函数”。


我对可以在链中调用的成员函数进行引用返回obj.DoX(...).DoY(...).DoZ(...);

方法链接是返回引用的习惯用法*this。所以,这将是常规的。从技术上讲,我上面的第 3 点适用于这种情况。调用者已经有了obj,那么为什么要返回对它的引用呢?在这种情况下,答案是:为方便起见返回引用。

我想说这本书的建议非常适用于函数式编程范式。

面向对象的编程范式完全不同。修改的成员函数*this实际上是一个带有输出参数的函数 - 参数是隐式*this对象 - 被修改。因此,引用的经验法则可以被视为对 setter 函数的建议......或者它可能被视为不适用于面向对象的编程。


推荐阅读