新浪博客

前置++和后置++的区别及其重载

2016-03-06 22:21阅读:1,615
C++有个很强大的运算符重载机制,我们可以给我们自己定义的类增加更多的适用于自己的运算符。但是呢,这里也是有一些限制的,当我们自定义类的操作运算符的时候,重载操作运算符的含义应该跟内置类型一样(因为其最基本的还是通过内置类型存在的操作运算符去实现的),你重载+运算符,就是加法的意思,里面是通过内置的+操作运算符实现的。
1:两者的区别:
两者都会自增1,但是增加的前后不一样,a++是先得到a的值,然后对a在进行+1的运算;而++a则是先对a进行+1运算,然后在得到a的值。
实现原理是什么?
一个例子:
  1. class Age
  2. {
  3. public:
  4. Age& operator++() //前置++
br> {
  • ++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;
  • };
  • ++i的实现原理是现将i自增1,然后返回i的引用;j++的实现原理是:先定义一个j的副本,然后在将j自增1,最后返回之前定义个那个副本的值。
    通常,c++的内置类型都要求前缀式操作符返回被增量或被减量对象的引用;而要求后缀式操作符返回被增量和被减量对象做增或减操作之前的副本(这里边就存在内存拷贝)。


    返回值类型:++i返回的是引用,而i++返回的则是 const类型。其中const类型不能对他进行其他操作,二引用可以。
    举个例子
  1. int main()
  2. {
  3. Age a;
  4. (a++)++; //编译错误
  5. ++(a++); //编译错误
  6. a++ = 1; //编译错误
  7. (++a)++; //OK
  8. ++(++a); //OK
  9. ++a = 1; //OK
  10. }
a++的类型是const XX ,自然不能对它进行前置++、后置++、赋值等操作。
++a的类型是XX &,当然可以对它进行前置++、后置++、赋值等操作

2:如何进行重载呢?如何区别?

一般要求后缀式操作符接受一个额外的int型形参(不会使用它,仅做区分用),来区别两者的不同
例如:
class A
{
private:
int a;
public:
A
& operator++()
{

++a; //直接进行++并且返回其引用
return *this; //前置++ //...
}
A
operator+
+(int)
{
A a = *this; //先做一个副本
++*this; //对其本身进行++的操作
return a;
//
后置++ //...
}
}

3:优先使用前置++
在C++中凡是遇到自增1的操作最好使用前置++。因为后置++中,会产生临时对象。

  1. const Age operator++(int) //后置++
  2. {
  3. Age tmp = *this;
  4. ++(*this); //利用前置++
  5. return tmp;
  6. }
很明显tmp是一个临时对象。会造成一次析构函数和一次构造函数的产生的额外开销。虽然编译器可以进行优化,但是我们最好不要依赖于编译的优化,自己去简化。

留言板

下载客户端体验更佳,还能发布图片和表情~

亿万博主正在被热评!
999+

给此博文留言吧! 有机会上热评榜! 攒金币兑换礼品!

好的评论会让人崇拜发布评论

我的更多文章

下载客户端阅读体验更佳

APP专享