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

Itz*_*984 2 c++ operator-overloading

假设我有一个名为class的类A,我没有类实现.在运行时间范围内哪个会更贵:后缀或前缀++操作?

例:

void some_function{
    ...
    A x;

    ++x;

    x++;

    ...
}
Run Code Online (Sandbox Code Playgroud)

我在网上读到x++类上的后缀运算符将执行2次构造函数调用,但没有给出解释.我找不到合适的解释.为什么我们有2个电话而另一个没电话?

Rei*_*ica 7

这个问题有两个可能的答案,因为你不知道班级的实现(如你所说).

情景一:班级合理

在这种情况下,语义++类似于内置类型和标准库迭代器的语义:++x是preincrement,x++是postincrement.

在这种情况下,++x返回x增量后的值.实际上预计通过引用++x返回x,++ ++ x合法化.典型的实现方式是:

A& A::operator++()
{
  increment_somehow();
  return *this;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,不需要复制(构造).

x++另一方面,返回增量的值.这意味着它必须将值存储在某处以便能够返回它.典型的实现方式是:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

场景二:该类是任意的

如果前缀和后缀++没有被标记以匹配标准语义,那么自然所有的赌注都是关闭的,因为函数可以做任何事情.如果不了解它们,就无法进行比较.