0

和有什么区别

教科书上写的是什么:

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

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

*意思是“指向的值” ....

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

如果是这种情况,那么它有什么区别?提高执行时间?

4

3 回答 3

1

两者的区别在于

情况 1

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

情况 2

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

让我们深入挖掘以更好地理解事物

情况 1

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

情况 2

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

在速度和内存方面

1的情况下

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

情况 2

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

于 2013-04-14T16:18:13.563 回答
0

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

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

于 2013-04-14T16:17:42.950 回答
0

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

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

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

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

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

于 2013-04-14T17:00:19.337 回答