什么时候在 C++ 中返回 const 引用是个好主意?

问题描述 投票:0回答:2

是否有任何文章介绍何时使用 const 引用作为返回类型是一种好的做法?

这不是一个关于特定问题的问题,而是一个教育问题。

我们正处于从 C 的初级水平迁移到现代 C++ 的过程中,我和我的同事的任务是指导其他一组人使用 C++,因为我们对这门语言非常熟悉。

我和那位同事就这个问题发生了轻微的争执。手头的例子是一个简单的类:

class Cls
{
private:
    vector<int> vec;

public:

    Cls() { /* put 3 random values in vec */ }

    const vector<int>& getVec() {return vec; }
};

我的论据来自以下事实:

  1. 参考文献应该用作回报,因为你不会浪费时间复制东西。这是直接加速。

  2. 引用应该是 const,因为如果你只返回对

    vec
    的引用,那么任何人都可以仅使用 getter 来改变它,这显然是不好的。因此我们需要为 getter 返回
    const TYPE&

我的同事支持直接返回

vector<int>
就可以了。他的论点是:

  1. 这是一个先进的概念,不应该从一开始就教授。我们现在可以从 getter 中按值返回(从而生成副本),并在稍后当它们能够理解幕后发生的情况时转换为引用。 (我的观点是,由于我认为使用这是非常好的实践,因此应该从一开始就教授和强制执行,以便人们习惯这样做,然后我们确保每个人真正理解 const 引用含义的部分可以稍后进行因为我们可能没有时间让学员达到可以兼顾参考资料的水平。)

所以我的问题基本上是:

  1. 是否有一些关于此主题的良好实践以及何时使用 const 引用而不是值作为返回值的文章?

  2. 虽然我和我的同事对 C++ 相当熟悉,但我们都没有专业地使用过它,所以……业界对于这个问题有标准或惯例吗?

c++ oop reference constants
2个回答
7
投票

何时按引用返回还是按值返回的决定不仅仅是性能问题,而且是代码语义问题(尽管在 C++ 中编码时性能通常很重要)。

通过引用返回的一些值得注意的示例是:

  • a getter 通常期望返回对实际成员的 const 引用,除非该成员复制起来很便宜
  • 允许方法或运算符链接,返回对当前对象的引用 (
    *this
    )

何时按引用返回的问题实际上归结为一个更广泛的问题:如何安全地管理对象的生命周期。 关于对象生命周期的 C++ 核心指南是一个值得遵守的好资源。

如果被引用的对象比函数调用的寿命更长,那么通过引用返回它通常是安全的。

所以:

  • this
    ,具有静态存储持续时间的类成员和对象:安全通过引用返回它

  • 局部变量和函数的输入参数:不安全通过引用返回。对于输入参数,它甚至适用于

    const
    引用,因为它们可以引用临时变量。例如:

    std::string const& badFunc(std::string const& arg) {
      return arg; // not a good idea
    }
    
    int main() {
      std::string const& x = badFunc("abc");
      // now x contains a dangling reference!
      // ...
    }
    

-2
投票

首先,你必须思考你想要实现什么。您是否确实需要访问权限来执行数据的特定实例,或者副本是否适合您。如果是拳头,那么没有其他办法,那就使用引用或者指针。但请注意,返回的 const 引用并不能保证指向的对象不会更改。它只是说调用者不能修改它,但可以在被调用者对象内部更改它。

当然,有一些 100% 有效的返回引用的用法,例如用于制作数据流。

© www.soinside.com 2019 - 2024. All rights reserved.