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

时间:2013-04-14 16:14:48

标签: c++ function reference

之间有什么区别

教科书中写了什么:

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

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

*表示“指向的价值”....

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

如果是这种情况那么它会有什么不同?改善执行时间?

3 个答案:

答案 0 :(得分:1)

两者之间的区别在于

案例1

  

你正在返回一个引用,即你正在返回一个指向该对象的常量指针。

案例2

  

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

让我们更深入地了解更好的事情

案例1

  

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

案例2

  

因为它的副本对原始对象没有影响

在速度和记忆方面

如果是1

  

因为你返回现有对象的地址没有或只有很少的开销

案例2

  

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

答案 1 :(得分:0)

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

并非任何一个都是“正确的” - 它们具有不同的含义。有时您希望克隆一个对象,以便您有两个(可能)独立副本。有时你想共享一个对象。

答案 2 :(得分:0)

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

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

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

在一个更一般的问题中,如果函数没有预定义的预期语义,则使用时差异仍然相同。如果你复制(对于那些副本可能很昂贵的那些类型)将是一个更高的成本,但如果你需要引用语义,你将需要产生一个引用,如果你需要复制语义,你将需要返回值no这是多么便宜/昂贵。

请注意,就成本而言,可能会低于您的预期,具体取决于您实际在做什么。如果调用者将使用return来初始化一个新对象,那么成本可能与RVO将启动并删除不必要的额外副本相同。