需要帮助理解返回引用的函数

Need help understanding functions that returns a reference

本文关键字:引用 函数 返回 帮助 助理      更新时间:2023-10-16

课本内容:

MyClass& Myclass::operator++() {
  do something
  return *this;
}

MyClass Myclass::operator++() {
  do something
  return *this;
}

*表示"指向"的值....

是否第二个示例将返回this指向的对象的副本(*this的副本),而第一个示例将返回*this本身?

如果是这样,那又有什么区别呢?提高执行时间?

两者的区别在于

in case 1

你返回的是一个引用,也就是说你返回的是一个指向该对象的常量指针。

In case 2

你正在创建一个新对象并返回对象

让我们更深入地了解事情

In case 1

由于返回的是指向现有对象的指针,因此对

所做的任何更改都会影响原始对象

In case 2

因为它是一个副本,所以对原始对象没有影响

在速度和内存方面

如果是1

由于您返回的是一个现有对象的地址,因此没有或很少有开销

In case 2

你正在创建一个新的副本…因此,对象的构造函数将被调用,因此在内存和时间方面存在开销

第二个版本将复制MyClass对象(即*this)。第一个函数只返回对它的引用。

并不是其中任何一个都是"正确的",而是它们有不同的含义。有时您希望克隆一个对象,以便拥有两个(可能)独立的副本。有时候你想共享一个对象

正如您在答案中已经提到的那样,第一个返回引用,第二个正在生成副本。主要的区别是语义完全不同,考虑:

const auto & r = ++a;
++a;
assert(a == r);    // true/false depending on what is returned

在前缀operator++的特殊情况下,正确的语义(大多数用户期望的语义)产生一个引用。做任何其他事情都会引起混乱,并可能最终成为源代码中bug的来源。

在一个更一般的问题中,如果函数没有预定义的预期语义,那么在用法方面的差异仍然是相同的。如果复制(对于那些拷贝可能是昂贵的类型),则成本更高,但如果需要引用语义,则需要生成引用,如果需要复制语义,则需要按值返回,无论这是多么便宜/昂贵。

注意,关于成本,它可能比您期望的要少,这取决于您实际在做什么。如果调用者要使用return来初始化一个新对象,成本可能与RVO将启动并删除不必要的额外副本相同。