编译器如何识别重载的可以前置或后置的自增及自减运算符函数呢,通过函数的参数不同来区别。后置自增运算符的参数里有个int型的伪值0,而前置自增运算符函数的参数里没有。
后置版本是利用前置版本来实现的,节约代码。
前置版本的效率高,因为后置版本需要调用前置版本,所有后置版本效率都比前置要低。(++i比i++效率高。)
在后置版本里,人为添加一个参数(int),主要是为了区别前置版本,这个参数不会被使用。
后置自增运算符以值的形式返回类的对象,而前置自增运算符以引用的形式返回类的对象,因为后置自增运算符通常在自增前返回一个包含对象原始值的临时对象。C++将这样的对象视为右值,不能用于赋值运算符的左边。前置自增运算符用新值返回实际自增的对象的引用。这种对象在连续表达式中被用作左值。
int不过是个哑元(dummy),是永远用不上的,它只是用来判断++是prefix,还是postfix。记住,如果有哑元,则是postfix;否则,就是prefix。
#include<iostream>
using namespace std;
class Fraction //数类;
{
friend ostream& operator<<(ostream& out, const Fraction& x);
private:
int den; //加的步进距离,使自加的距离不是1;
int num; //数(初值)
public:
Fraction(int d=1, int n=0):den(d),num(n) {}
Fraction& operator++() //前缀++重载(前置版本prefix)
{
num+=den; //先自增,再返回;
return *this;
}
const Fraction operator++(int) //后缀++重载(后置版本postfix)
{
Fraction old (*this); //拷贝构造。先返回,再自增。
++(*this); //调用的是重载的前置版本;
return old;
}
};
ostream& operator<<(ostream& out, const Fraction& x)
{
out<<x.num<<endl;
return out;
}
int main(void)
{
Fraction b(10,10);
cout<<b++<<endl;
cout<<++b<<endl;
return 0;
}前置版本返回一个对象的引用Fraction& operator++(),后置版本返回一个const对象const Fraction operator ++(int)。后置版本是利用前置版本来实现的,节约代码。
前置版本的效率高,因为后置版本需要调用前置版本,所有后置版本效率都比前置要低。(++i比i++效率高。)
在后置版本里,人为添加一个参数(int),主要是为了区别前置版本,这个参数不会被使用。
本文介绍C++中前置与后置自增运算符的重载方法及其区别。通过参数不同区分前后置版本,前置版本提高效率并直接修改对象,而后置版本则返回原始值的副本。

3029

被折叠的 条评论
为什么被折叠?



