欢迎来到天天文库
浏览记录
ID:11017817
大小:46.00 KB
页数:4页
时间:2018-07-09
《前置++和后置++的区别》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、这篇文章不是讨论(i++)+(i++)+(i++)的计算结果,更不是讨论(i++)+(++i)+(i++)。 在C++教程中,我们都会学到:i++和++i是两个表达式,他们都会对i进行自增,但是呢,作为表达式,i++的值是自增之前的值,++i的值是自增之后的值。 本文在此基础上,进行一些稍微深入的讨论。 从操作符重载的角度,看i++和++i的区别,是一个比较好的切入点。 操作符重载假设有一个类Age,描述年龄。该类重载了前置++和后置++两个操作符,以实现对年龄的自增。Cpp代码1.class Age
2、 2.{ 3.public: 4. 5. Age& operator++() //前置++ 6. { 7. ++i; 8. return *this; 9. } 10. 11. const Age operator++(int) //后置++ 12. { 13. Age tmp = *this; 14. ++(*this); //利用前置++ 15. return tmp;
3、 16. } 17. 18. Age& operator=(int i) //赋值操作 19. { 1. this->i = i; 2. return *this; 3. } 4. 5.private: 6. int i; 7.}; classAge{public:Age&operator++()//前置++{++i;return*this;}constAgeoperator++(int)//后置++{Agetmp=*t
4、his;++(*this);//利用前置++returntmp;}Age&operator=(inti)//赋值操作{this->i=i;return*this;}private:inti;}; 从上述代码,我们可以看出前置++和后置++,有3点不同:1.返回类型不同2.形参不同3.代码不同4.效率不同返回值类型的区别前置++的返回类型是Age&,后置++的返回类型constAge。这意味着,前置++返回的是右值,后置++返回的是左值。左值和右值,决定了前置++和后置++的用法。Cpp代码1.int
5、main() 2.{ 3. Age a; 4. 5. (a++)++; //编译错误 6. ++(a++); //编译错误 7. a++ = 1; //编译错误 8. (++a)++; //OK 9. ++(++a); //OK 10. ++a = 1; //OK 11.} intmain(){Agea;(a++)++;//编译错误++(a++);//编译错误a++=1;//编译错误(++a)++;//OK++(++a);
6、//OK++a=1;//OK} a++的类型是constAge,自然不能对它进行前置++、后置++、赋值等操作。++a的类型是Age&,当然不能对它进行前置++、后置++、赋值等操作。 a++的返回类型为什么要是const对象呢?有两个原因:1.如果不是const对象,a(++)++这样的表达式就可以通过编译。但是,其效果却违反了我们的直觉。a其实只增加了1,因为第二次自增作用在一个临时对象上。2.另外,对于内置类型,(i++)++这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保
7、持行为一致。a++的返回类型如果改成非const对象,肯定能通过编译,但是我们最好不要这样做。 ++a的返回类型为什么是引用呢?这样做的原因应该就是:与内置类型的行为保持一致。前置++返回的总是被自增的对象本身。因此,++(++a)的效果就是a被自增两次。 形参的区别前置++没有形参,而后置++有一个int形参,但是该形参也没有被用到。很奇怪,难道有什么特殊的用意?其实也没有特殊的用意,只是为了绕过语法的限制。 前置++与后置++的操作符重载函数,函数原型必须不同。否则就违反了“重载函数必须拥有不同的
8、函数原型”的语法规定。虽然前置++与后置++的返回类型不同,但是返回类型不属于函数原型。为了绕过语法限制,只好给后置++增加了一个int形参。 原因就是这么简单,真的没其他特殊用意。其实,给前置++增加形参也可以;增加一个double形参而不是int形参,也可以。只是,当时就这么决定了。 代码实现的区别前置++的实现比较简单,自增之后,将*this返回即可。需要注意的是,一定要返回*this。后置++的实现稍微麻烦一些。因为要返回自增之前的对象,所以先将
此文档下载收益归作者所有