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

C++ 需要帮助理解返回引用的函数吗,c++,function,reference,C++,Function,Reference,两者的区别是什么 教科书上写的内容: MyClass& Myclass::operator++() { do something return *this; } 及 *表示“所指的值” 是否第二个示例将返回此对象所指向的对象的副本(“this”)的副本,而第一个示例将返回“this”本身 如果是这样,那又有什么区别呢?提高执行时间 第二个版本将复制MyClass对象(即*此)。第一个将只返回对它的引用 这并不是说两者都是“正确的”——而是它们有不同的含义。有时,您希望克隆一个对

两者的区别是什么

教科书上写的内容:

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

*
表示“所指的值”

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


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

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


这并不是说两者都是“正确的”——而是它们有不同的含义。有时,您希望克隆一个对象,以便拥有两个(可能)独立的副本。有时你想共享一个对象。

两者的区别在于

在案例1中

您正在返回一个引用(即返回指向对象的常量指针)

案例2

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

让我们再深入一点,更好地理解事情

在案例1中

由于您将返回指向现有对象的指针,因此所做的任何更改都会影响原始对象

案例2

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

在速度和内存方面

如果是1

由于返回现有对象的地址,因此没有或几乎没有开销

案例2

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


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

const auto & r = ++a;
++a;
assert(a == r);    // true/false depending on what is returned
在prefix
operator++
的特殊情况下,正确的语义(大多数用户期望的语义)会产生一个引用。做任何其他事情都会引起混乱,并可能最终成为源代码中bug的来源

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


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

伙计们,错误地按了回车键,在我纠正之前,你们做了一个否定的。。。无论如何,不用担心:)
const auto & r = ++a;
++a;
assert(a == r);    // true/false depending on what is returned