前置++和后置++的区别.doc_第1页
前置++和后置++的区别.doc_第2页
前置++和后置++的区别.doc_第3页
前置++和后置++的区别.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这篇文章不是讨论(i+)+(i+)+(i+)的计算结果,更不是讨论(i+)+(+i)+(i+)。在C+教程中,我们都会学到:i+和+i是两个表达式,他们都会对i进行自增,但是呢,作为表达式,i+的值是自增之前的值,+i的值是自增之后的值。本文在此基础上,进行一些稍微深入的讨论。从操作符重载的角度,看i+和+i的区别,是一个比较好的切入点。操作符重载假设有一个类Age,描述年龄。该类重载了前置+和后置+两个操作符,以实现对年龄的自增。Cpp代码 1. classAge 2. 3. public: 4. 5. Age&operator+()/前置+ 6. 7. +i; 8. return*this; 9. 10. 11. constAgeoperator+(int)/后置+ 12. 13. Agetmp=*this; 14. +(*this);/利用前置+ 15. returntmp; 16. 17. 18. Age&operator=(inti)/赋值操作 19. 20. this-i=i; 21. return*this; 22. 23. 24. private: 25. inti; 26. ;class Agepublic:Age& operator+() /前置+i;return *this;const Age operator+(int) /后置+Age tmp = *this;+(*this); /利用前置+return tmp;Age& operator=(int i) /赋值操作this-i = i;return *this;private:int i; 从上述代码,我们可以看出前置+和后置+,有3点不同:1. 返回类型不同 2. 形参不同 3. 代码不同 4. 效率不同 返回值类型的区别前置+的返回类型是Age&,后置+的返回类型const Age。这意味着,前置+返回的是右值,后置+返回的是左值。左值和右值,决定了前置+和后置+的用法。Cpp代码 1. intmain() 2. 3. Agea; 4. 5. (a+)+;/编译错误 6. +(a+);/编译错误 7. a+=1;/编译错误 8. (+a)+;/OK 9. +(+a);/OK 10. +a=1;/OK 11. int main()Age a;(a+)+; /编译错误+(a+); /编译错误a+ = 1; /编译错误(+a)+; /OK+(+a); /OK+a = 1; /OKa+的类型是const Age,自然不能对它进行前置+、后置+、赋值等操作。+a的类型是Age&,当然不能对它进行前置+、后置+、赋值等操作。a+的返回类型为什么要是const对象呢? 有两个原因:1. 如果不是const对象,a(+)+这样的表达式就可以通过编译。但是,其效果却违反了我们的直觉 。a其实只增加了1,因为第二次自增作用在一个临时对象上。 2. 另外,对于内置类型,(i+)+这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保持行为一致 。a+的返回类型如果改成非const对象,肯定能通过编译,但是我们最好不要这样做。+a的返回类型为什么是引用呢? 这样做的原因应该就是:与内置类型的行为保持一致。前置+返回的总是被自增的对象本身。因此,+(+a)的效果就是a被自增两次。形参的区别前置+没有形参,而后置+有一个int形参,但是该形参也没有被用到。很奇怪,难道有什么特殊的用意?其实也没有特殊的用意,只是为了绕过语法的限制 。前置+与后置+的操作符重载函数,函数原型必须不同。否则就违反了“重载函数必须拥有不同的函数原型”的语法规定。虽然前置+与后置+的返回类型不同,但是返回类型不属于函数原型。为了绕过语法限制,只好给后置+增加了一个int形参。原因就是这么简单,真的没其他特殊用意。其实,给前置+增加形参也可以;增加一个double形参而不是int形参,也可以。只是,当时就这么决定了。代码实现的区别前置+的实现比较简单,自增之后,将*this返回即可。需要注意的是,一定要返回*this。后置+的实现稍微麻烦一些。因为要返回自增之前的对象,所以先将对象拷贝一份,再进行自增,最后返回那个拷贝。在Age的代码中,后置+利用了前置+来实现自增。这样做是为了避免“自增的代码”重复。在本例中,自增的代码很简单,就是一行+i,没有必要这样做。但是在其它自增逻辑复杂的例子中,这么做还是很有必要的。效率的区别如果不需要返回自增之前的值,那么前置+和后置+的计算效果都一样。但是,我们仍然应该优先使用前置+,尤其是对于用户自定义类型的自增操作。前置+的效率更高,理由是:后置+会生成临时对象。从Age的后置+的代码实现也可以看出这一点。Cpp代码 1. constAgeoperator+(int)/后置+ 2. 3. Agetmp=*this; 4. +(*this);/利用前置+ 5. returntmp; 6. const Age operator+(int) /后置+Age tmp = *this;+(*this); /利用前置+return tmp;很明显,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论