++和--操作符
来源:互联网 发布:网站sql注入漏洞修复 编辑:程序博客网 时间:2024/06/05 09:51
c/c++里有两个操作符++和-- ,它们分别有前置式和后置式:
int a=0;
++a; 前置式
a++; 后置式
这两个操作都是把a的值+1,但是有什么区别呢?我们在C++的操作符重载里讨论这个问题。
重载函数是以其参数类型来区分彼此的,然后不论++或--操作符的前置式或后置式,都没有参数,为了填平这个语言学漏洞,只好让后置式有一个int自变量,并在它被调用时,
编译器默默地为该int指定一个0。
class UPInt{public:UPInt& operator++();const UPInt operator++(int); ...};UPInt i;++i; //调用i.operator++()i++; //调用i.operator++(0)
注意到,前置式返回一个引用,后置式返回一个const,下面说明为什么返回引用和const。
UPInt& UPInt::operator++(){*this += 1;return *this;}
可以看到,前置++会先进行累加,再取出。
UPInt& UPInt::operator++(){UPInt oldValue = *this;++(*this);return oldValue;}
可以看到,后置++会先产生一个临时对象,然后对累加,再返回没修改的临时对象。也就是,先取出,再累加。
为什么前置++返回引用,后置++返回const?
前置++返回引用的原因很清楚,但后置++为何返回const?
想像一下:
UPInt i;
i++++;
实施两次后置++,编写代码的人目的想必是对i进行两次递增,但是第二次++的确是返回的临时对象(假如不是const)
所以,我们应该禁止连续后置++,因此,后置++返回const就合情理了。但是连续两次前置++是合法的。
在效率方面考虑,我们应该尽量使用前置++,因为后置++需要产生临时对象,那么就需要调用构造和析构函数。
阅读全文
0 0
- 预处理操作符'#'和'##'
- "#"和"##"操作符
- C#操作符??和?:
- C#操作符??和?:
- C#操作符??和?:
- 重载操作符>> 和 <<
- C#操作符??和?:
- 操作符和表达式
- C# 操作符??和?:
- 操作符和表达式
- 2.6、++和--操作符
- C#操作符??和?:
- ++和--操作符
- C# 操作符 ?? 和 ?:
- C#操作符??和?:
- ++和--操作符分析
- 操作符 ? 和 ??
- 操作符和表达式
- Codeforces 814 B An express train to reveries
- mysql 数据库三大设计结构,三大范式概念
- 【Python】高级特性之切片(slice)
- PAT (Advanced Level) Practise 1117 Eddington Number(25)
- OpenCV中图像的浅拷贝与深拷贝
- ++和--操作符
- Javaweb表单提交及获取属性值
- Spring boot --Oauth2.0 + 单点登录
- 公共数据库介绍~datahub
- deifne小技巧
- ResNet-34 prototxt
- idea web项目与前端网页结合
- 二叉树的三种遍历,包括递归与非递归,c++语言
- 论文笔记:Evaluation of local spatio-temporal features for action recognition