C++中的前置++和后置++

一、对于内置型数据

例如常见的int类型。++i和i++都是将i值自增1,不过++i表达式的值为自增后的值,i++的值为i原值,在之后才会自增。例子如下:

int i = 0;  
int a = i++;  
int b = ++i;  
cout << a << b << endl; 




再例如:

int i = 0;  
int c = (++i)+(i++)+(++i)+(i++);  
cout << c << i <<endl;  




这里,2次++i 使得i值变为2,所以c=2+2+2+2;而i的值在   int c = (++i)+(i++)+(++i)+(i++)    之后再增加2变为4。

还有一点,++++i是合法的,而i++++是非法的。这点后面再讨论。


二、对于用户自定义类型

自定义类型就是我们常用的class。

如果有一个Test 类。声明如下:

class Test

{

...     //  细节省略

};

先看看class Test类的++操作符的原型:

Test & operator++() // 前缀式  
{  
    *this+=1;  // 重载过 operator +=   
    return *this;  
}
const Test operator++(int) //后缀式  
{  
    Test T=*this;    // 保留原值  
    ++(*this)        // 重载过 operator++()  
    return T;  
}


先说明一点,上述两个声明这么做的原因是为了符合内置类型int的行为(以此为参考而设计)。其实完全可以不用这样,不过后果是可能达不到预期效果,当然如果喜欢或者特殊用途可以不像上面这样做。

  ++i为称为前缀表达式,i++称为后缀表达式。因为都是单目运算符,在重载时为了区分,后缀表达式参数中会有一个int参数。这个参数的作用仅仅是告诉编译器这是后缀表达式。并且在大多数编译器中其默认值为0。

对于前缀式返回引用,应该没什么疑问,这样不会产生额外的副本。应该说天生体质较好。而后缀式返回

const Test型是为了杜绝i++++的情景,这与内置int型行为不符。int为什么静止这么做是有原因的。如果把后缀式中

的const 去掉。i++++是在第一个++后的副本上再执行++,与预期结果并不符合。其实i++++如果显示调用就是:

i.operator++(0).operator(0)。const Test 可以有效的静止这一行为。

++++i则不同,返回值为Test& ,完全可以这么做,并且有预期效果。只能说在最初设计时天生体质好。


三、效率

对于内置类型,两者并无明显区别,甚至没有区别(编译器优化)。

对于自定义类型,++i的开销会小很多。


转载自:https://blog.csdn.net/qq_35154908/article/details/52857440

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值