1

有没有关于何时使用 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 来改变它,这显然很糟糕。因此,我们需要返回const TYPE&getter。

我的同事支持只返回vector<int>并完成它。他的论点是:

  1. 这是一个不应该从一开始就教授的高级概念。我们现在可以从 getter 中按值返回(并因此生成副本),然后在他们能够理解幕后发生的事情时过渡到引用。(我的观点是,因为我认为使用它是一种非常好的实践,所以应该从一开始就教授和执行它,以便人们习惯这样做,然后我们确保每个人都真正理解 const 引用意味着什么的部分可以在以后出现因为我们可能没有时间让学员达到可以兼顾参考的水平。)

所以我的问题基本上是:

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

  2. 虽然我和我的同事对 C++ 相当满意,但我们都没有专业地使用它,所以......这个问题在行业中是否有标准或惯例?

4

2 回答 2

3

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

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

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

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

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

所以:

  • this, 类成员和具有静态存储持续时间的对象:安全地通过引用返回它
  • 局部变量和函数的输入参数:按引用返回不安全

关于输入参数 - 它甚至适用于const引用,因为它们可以引用临时变量。例如:

std::string const& badFunc(std::string const& arg) {
   return arg; // not a good idea
}

    std::string const& x = badFunc("abc");
    // now x contains a dangling reference
于 2020-07-14T10:34:20.543 回答
-1

首先,您必须考虑要实现的目标。您是否真的需要访问来执行数据的实例,或者副本是否适合您。如果是拳头的话,那就没有别的办法了,那就用引用或者指针吧。但请注意,返回的 const 引用并不能保证指向的对象不会改变。它只是说调用者不能修改它,但它可以在被调用者对象内部更改。

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

于 2020-07-14T10:24:25.007 回答