前缀式与后缀式
2013-12-02 18:29
211 查看
1、考虑下面的场景:有一个Person类,内部有个age字段,对外提供前缀式和后缀式,把年龄加1。
2、前缀式与后缀式都没有右操作数,也就是说没有形参,需要区分前缀式和后缀式,对于后缀式中增加一个形参。因为这个形参在方法内并不使用,可以省略形参名。
3、前缀式和后缀式是操作符重载,本质上是方法,和GetName()一样。
4、前缀式:
5、后缀式:
二者区别:
1、因为前缀式与后缀式操作符相同,都不需要形参,为了使用过载,对于后缀式增加一个形参。由于方法不使用形参,省略形参名。
2、前缀式返回引用,后缀式返回const对象。为什么?
前缀式表达的意思是:先加1,再返回当前对象,很好理解。
后缀式表达的意思是:获取旧值,当前对象加1,返回旧值。后缀式创建一个局部对象,返回局部对象,但是为什么返回const对象呢?
如果返回不是const对象,考虑下面的情况:p++++;程序员期望对p加2,但实际上呢?第一个++返回一个局部对象,第二个++是对局部对象加1,而不是对原对象p再次加1,这与程序员的期望不一致,为了解决这个问题,让后缀式返回const对象。(注:前缀式可以++++p)
3、考虑效率,对于自定义类型,后缀式效率差很多,涉及到局部对象的构造析构,还有返回类型时临时对象的构造析构。对于基本类型,前缀式与后缀式差别不大,但是为了一致性考虑和代码复用,后缀式往往调用前缀式,也就是说后缀式多了一次方法调用,效率差一点。因此,在前缀式与后缀式等价的情况下,使用前缀式。
2、前缀式与后缀式都没有右操作数,也就是说没有形参,需要区分前缀式和后缀式,对于后缀式中增加一个形参。因为这个形参在方法内并不使用,可以省略形参名。
3、前缀式和后缀式是操作符重载,本质上是方法,和GetName()一样。
4、前缀式:
Person& Person::operator ++() { this->age = this->age+1; return *this; }
5、后缀式:
const Person Person::operator ++(int) { Person old = *this; ++(*this) return old; }
二者区别:
1、因为前缀式与后缀式操作符相同,都不需要形参,为了使用过载,对于后缀式增加一个形参。由于方法不使用形参,省略形参名。
2、前缀式返回引用,后缀式返回const对象。为什么?
前缀式表达的意思是:先加1,再返回当前对象,很好理解。
后缀式表达的意思是:获取旧值,当前对象加1,返回旧值。后缀式创建一个局部对象,返回局部对象,但是为什么返回const对象呢?
如果返回不是const对象,考虑下面的情况:p++++;程序员期望对p加2,但实际上呢?第一个++返回一个局部对象,第二个++是对局部对象加1,而不是对原对象p再次加1,这与程序员的期望不一致,为了解决这个问题,让后缀式返回const对象。(注:前缀式可以++++p)
3、考虑效率,对于自定义类型,后缀式效率差很多,涉及到局部对象的构造析构,还有返回类型时临时对象的构造析构。对于基本类型,前缀式与后缀式差别不大,但是为了一致性考虑和代码复用,后缀式往往调用前缀式,也就是说后缀式多了一次方法调用,效率差一点。因此,在前缀式与后缀式等价的情况下,使用前缀式。
相关文章推荐
- Delphi 调用外部程序并等待其运行结束
- python lambda函数
- pthread_getspecific()和pthread_setspecific()的使用方法
- ios应用程序生命周期
- 真正的冒泡排序
- MySQL wait_timeout参数设置与网上常见错误小纠
- [jQuery]empty()和remove()的区别
- -D_REENTRANT 宏作用
- [jQuery]empty()和remove()的区别
- Dijkstra算法
- 桌面截图
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
- 应该知道的Linux技巧
- 27种设计模式介绍
- python 函数多实参处理
- 百度地图PopupOverlay点击事件
- ArrayList和LinkedList的区别
- linux学习(五) shell脚本(2)
- GetObject()
- UVA-1330 LA 3029 City Game(最大子矩阵)