前置++和后置++的区别

前置++和后置++的区别

ID:11017817

大小:46.00 KB

页数:4页

时间:2018-07-09

前置++和后置++的区别_第1页
前置++和后置++的区别_第2页
前置++和后置++的区别_第3页
前置++和后置++的区别_第4页
资源描述:

《前置++和后置++的区别》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

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。后置++的实现稍微麻烦一些。因为要返回自增之前的对象,所以先将

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。