一元運算子
你可以過載 2 個一元運算子:
++foo
和foo++
--foo
和foo--
兩種型別(++
和 --
)的過載相同。向下滾動以獲得解釋
在 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++
...
}