一元运算符
你可以重载 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++
...
}