一元运算符

你可以重载 2 个一元运算符:

  • ++foofoo++
  • --foofoo--

两种类型(++--)的重载相同。向下滚动以获得解释

class / struct 之外超载:

//Prefix operator ++foo
T& operator++(T& lhs)
{
    //Perform addition
    return lhs;
}

//Postfix operator foo++ (int argument is used to separate pre- and postfix) 
//Should be implemented in terms of ++foo (prefix operator)
T operator++(T& lhs, int)
{
    T t(lhs);
    ++lhs;
    return t;
}

class / struct 内部超载:

//Prefix operator ++foo
T& operator++()
{
    //Perform addition
    return *this;
}

//Postfix operator foo++ (int argument is used to separate pre- and postfix) 
//Should be implemented in terms of ++foo (prefix operator)
T operator++(int)
{
    T t(*this);
    ++(*this);
    return t;
}

注意:前缀运算符返回对自身的引用,以便你可以继续对其进行操作。第一个参数是一个引用,因为前缀操作符更改了对象,这也是它不是 const 的原因(否则你将无法修改它)。

后缀运算符按值返回临时值(前一个值),因此它不能作为引用,因为它将是对临时变量的引用,这将是函数末尾的垃圾值,因为临时变量会消失范围)。它也不能是 const,因为你应该能够直接修改它。

第一个参数是对调用对象的非 const 引用,因为如果它是 const,你将无法修改它,如果它不是引用,则不会更改原始值。

这是因为后缀运算符重载需要复制,所以最好习惯在 for 循环中使用前缀++而不是 postfix ++。从 for 循环的角度来看,它们通常在功能上是等价的,但使用前缀++可能会有轻微的性能优势,特别是对于需要复制很多成员的类。在 for 循环中使用前缀++的示例:

for (list<string>::const_iterator it = tokens.begin();
     it != tokens.end();
     ++it) { // Don't use it++
    ...
}