一元運算子

你可以過載 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++
    ...
}