由于++和--是同理的,这里姑且只以++说明
前置++这里我简称前++,同样后置++这里简称后++
我想很多人跟我之前一样,知道前++和后++的区别也会用。很多老师和书本是这样告诉我们的:
前++是先对变量进行+1操作再返回变量,
后++就是先返回变量的值再对变量进行+1操作
大学老师是这么教我的,想想后来工作也很少思考过这个问题,再者就是我也从来不对++/--写复杂的语句。
今天在more effective c++书中看到有关这个++/--操作符的部分,忽然发现原来自己对此认识得是这么的不深刻。
不过我很高兴因为我又深刻理解了C++的一个小部分,而随着我深刻理解的内容越来越多,我对C++认识也会越来越深。
废话少说,我们来谈谈++/--操作符。现在让我来改正一下之前的不妥的定义:
前++是对变量+1然后返回变量的引用(如果你胡乱重载前++操作符,这里是不包括的 )
后++是先将变量的值保存在一个临时变量中,然后对变量+1,最后返回那个临时变量的值,注意这里是值,另外这里返回的类型是const类型,
这也就是为什么后++在进行++的原因。
现在让我们来说说如果重载前++和后++,其实你很少会有机会这么做,但我们应该对此清楚。
为了方便大家理解,这里我自己写了一个例子:
- class CustomInt
- {
- public:
- CustomInt& operator++(); //前++
- const CustomInt operator++(int);//后++
- CustomInt& operator+=(int); //+=操作符
- private:
- int i;
- };
- CustomInt& CustomInt::operator++()
- {
- *this += 1;
- return *this;
- }
- const CustomInt CustomInt::operator++(int)
- {
- const CustomInt oldTemp = *this;
- *this += 1;
- return oldTemp;
- }
- CustomInt& CustomInt::operator+=(int aValue)
- {
- i += aValue;
- return *this;
- }
使用CustomInt如下:
- CustomInt test;
- ++test; //调用test.operator++();
- test++; //调用test.operator++(0);
相信看了代码之后会变的清楚很多,但仍可能会有疑问,没关系,接下来我会一一说明。
首先让我们来看看前++和后++操作符的声明:
- CustomInt& operator++(); //前++
- const CustomInt operator++(int);//后++
除了operator++这个名字一样外其他都不一样,先来说说返回值:
前++的返回值它的引用,我们可以这样写++test++,没有问题。
后++的返回值是一个常引用,因此我们不能直接修改后++的返回值,这里修改后++的返回值也是没有意义的,因为它返回的只是一个临时变量而已,只是一个编译器产生的临时变量而已,对你而言是没有用处的。
如果你比较仔细你会发现后++有参数,但却没有用,为什么呢?
这里只是为了区别于前++操作符而已,想想,如果没有这个参数,那么前++和后++操作符便只有返回值不一样了,注意这可不能算是重载哦,这么写编译器会 给你一个illegal function overloading的错误,这里如果你还是不清楚为什么编译器就不允许呢,那你一定要自己想想了,哈哈。