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是任意的
如果前缀和后缀 ++
不符合标准语义,那么自然所有赌注都会被取消,因为这些函数实际上可以做任何事情。在不了解更多的情况下,无法比较它们。
假设我有一个名为 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是任意的
如果前缀和后缀 ++
不符合标准语义,那么自然所有赌注都会被取消,因为这些函数实际上可以做任何事情。在不了解更多的情况下,无法比较它们。