看看类A的A++和++A的重载函数就能完全明白了。
class A
{
public:
A():num(0){}
A& operator<<++()//前置++,也就是++A,为了方便观看,直接写成内联函数
{
++num;//先自加
return *this;//再返回自加的对象,直接在当前对象中操作,系统开销小。
}
A operator<<(int)//后置自加,A++,这里的int不表示整型,只表示后置自加类型
{
A temp(*this);//调用复制构造函数 ,将当前对象保存保存到一个临时对象中
num++;
return temp;
/*
由于temp是局部对象,出作用域消失,所以,返回的参数不能为一个引用
需要再次调用复制构造函数,所以,返回的是自加前的对象
!!!可以看到,后置自加,调用了两次复制构造函数,相对应,也有两次析构函数,系统开销大,所以,在for循环中,尽量用++i,而不是用I++,如果是stl中的模版类,使用迭代器遍历的时候,必须++it,这样效率才高。
用int i = 0来说,++i,直接在i的内存里修改i为1,然后返回。
i++,是先创立一个临时整型int temp = i,然后i++,再然后返回temp。
比如,一个函数int sum(int x)
int i = 0;
sum(++i);//就是i = i + 1,然后sum(i),也就是sum(1)
//如果是sum(i++),实际上是sum(i),也就是sum(0),然后i = i + 1;
cout << i << endl ;
/*
对这一条语句来说,无论++i或是i++,结果都是1,这个就是for循环中,有人用++i,有人用i++,结果都正确的原因。不过从效率上来说,推荐++i;
*/
//至于后置++,最典型的应用要算list的删除了。
list<int> iList;
for(int i = 0; i < 8; ++i)
{
iList.push_back(new int(i));//往链表中添加8个在堆中创建的整型
}
list<int>::iterator it;
for(it = iList.begin(); it != iList.end(); )//注意,这里只有两项,第三项没有
{
delete *it;
/*
这里演示的是删除在堆中创建的对象,list删除,只是删除链表中的迭代器,
而不是删除链表中保存的实际数据,
如果不删,就会内存泄漏,因为new要跟delete搭配使用。
*/
iList.earse(it++);
/*
精华在这里,迭代器it先自加,然后在删除迭代器it自加前的一个拷贝,
如果直接删除迭代器it,那么it就没了,就没办法自加了,也就不能遍历链表了。
*/
}
*/
}
private:
int num;
};