C++ 上的运算符重载 ++

Operator overloading ++ on C++

假设我有一个名为 A 的 class,但我没有 class 实现。 在 运行 时间尺度上哪个会更贵: 后缀还是前缀++操作?

示例:

void some_function{
    ...
    A x;

    ++x;

    x++;

    ...
}

我在网上看到classes上的后缀x++运算符会做2次构造函数调用,但是没有给出解释。 我找不到合适的解释。为什么我们有 2 个电话,另一个是 none?

这个问题有两个可能的答案,因为您不知道 class 的实现(如您所说)。

情况一:class是合理的

在这种情况下,++ 的语义类似于内置类型和标准库迭代器的语义:++x 是前置增量,x++ 是后置增量。

在这种情况下,++x return 是 x 递增后的值。它实际上是 ++x 到 return x 的引用,使 ++ ++ x 合法。一个典型的实现是:

A& A::operator++()
{
  increment_somehow();
  return *this;
}

如您所见,无需复制(构建)。

x++,另一方面,return是增量之前的值。这意味着它必须将值存储在某处才能 return 它。一个典型的实现是:

A A::operator++(int)
{
  A old(*this); // copy construction
  ++(*this); // re-use preincrement to keep semantics consistent
  return old;  // move construction of return value (possibly elided)
}

如我上面的评论所示,涉及两个构造函数调用(即使可以省略其中一个)。

场景二:class是任意的

如果前缀和后缀 ++ 不符合标准语义,那么自然所有赌注都会被取消,因为这些函数实际上可以做任何事情。在不了解更多的情况下,无法比较它们。