我们经常使用for
循环来遍历东西,循环变量可以前自增也可以后自增,发现对遍历结果没啥影响,但是该如何选择呢?
我们应该尽量使用前自增运算符而不是后自增运算符,即用 ++Iter
代替Iter++
。
为什么要这么做,有什么有实际价值?下面我会详细解释。
前缀和后缀形式之间的区别是众所周知的。我希望它们内部结构的区别,大家也是清楚的。如果你有使用过运算符重载的话,肯定已经意识到了。没有用过的话,我在这儿简单地解释一下用过运算符重载的可以跳过下面关于运算符重载的例子。
前自增运算符改变了对象的状态并返回对象改变后的状态,不需要创建临时对象。下面是前自增运算符的例子:
MyOwnClass& operator++()
{
++meOwnField;
return (*this);
}
后自增运算符也改变了对象的状态但是返回的是对象改变前的状态,并且需要创建一个临时对象。下面是后自增运算符重载的例子:
MyOwnClass operator++(int)
{
MyOWnCLass tmp = *this;
++(*this);
return tmp;
}
看到上面这段代码,你会发现有一个额外的操作,就是要创建一个临时对象,在实践中这点太重要了!
现在的编译器做代码优化的时候非常智能,如果没有用处,是不会随便创建临时对象的。这就是为什么在发布版中我们很难发现i++
和++i
的区别。
不管咋样,请用 ++Iter
代替Iter++,
这是一个好的代码习惯。