前置和后置操作符的区别(More Effective_C++_6(运算符))
2015-08-21 10:02
736 查看
++和- -的原理类似,下面仅++操作符来分析前置和后置的区别
先看一段代码:
从以上代码中,我们大致能看出前置和后置的不同之处:
1. 返回值类型不同,重载后置++或–,返回值类型为const;
2. 参数不同,重载后置++或–,含有参数int;
下面我们再看一段前置和后置具体实现的代码,来了解参数int的意义:
关于参数int的作用
看到以上代码段,我们会发现后置++并没有动用参数int,那么,这个参数唯一的作用只是为了区别前置式后后置式而已;
关于返回值为const的问题
另外,为什么后置式操作符返回的值必须是const,这是为什么?原因是为了使
当返回值为const时,第一次调用operator++返回的const对象,将被用来进行operator++的第二次调用,然而operator++是个non_const成员函数,所以const对象无法调用,即禁止了a++++;
关于效率问题
前置式的效率比后置式的效率更高,因为后置式每次都必须产生一个临时对象作为返回值之用,而前置式很明显不需要临时对象;所以,处理用户定制类型时,应该尽可能的使用前置式
另外,后置式++和–的实现应该以前置式++和–为基础,这样的好处是,你只需要维护前置式的版本,因为后置式版本会自动调整为一致行为
参考:More Effective C++中文版(侯捷译)
先看一段代码:
class A{ pubilc: A& operator++();//前置++ const A operator++(int);//后置++ A& operator--();//前置-- const A operator--(int);//后置-- }; A a; ++a;//调用a.operator++() a++;//调用a.operator++(0) --a;//调用a.operator--() a--;//调用a.operator--(0)
从以上代码中,我们大致能看出前置和后置的不同之处:
1. 返回值类型不同,重载后置++或–,返回值类型为const;
2. 参数不同,重载后置++或–,含有参数int;
下面我们再看一段前置和后置具体实现的代码,来了解参数int的意义:
//前置式:先累加后取出 A& operator++(){ *this=*this+1;//累加 return *this;//取出 } //后置式:先取出后累加 const A operator(int){ A oldValue=*this;//取出 ++(*this);//累加(注:这里后置式的实现,以前置式为基础) return oldValue;//返回累加之前的值 }
关于参数int的作用
看到以上代码段,我们会发现后置++并没有动用参数int,那么,这个参数唯一的作用只是为了区别前置式后后置式而已;
关于返回值为const的问题
另外,为什么后置式操作符返回的值必须是const,这是为什么?原因是为了使
a++++不合法,假如返回值类型不是const,那么这和a.operator++(0).operator++(0)的动作类型相同,即第二个调用动作施行于第一个调用动作的返回值对象身上;
当返回值为const时,第一次调用operator++返回的const对象,将被用来进行operator++的第二次调用,然而operator++是个non_const成员函数,所以const对象无法调用,即禁止了a++++;
关于效率问题
前置式的效率比后置式的效率更高,因为后置式每次都必须产生一个临时对象作为返回值之用,而前置式很明显不需要临时对象;所以,处理用户定制类型时,应该尽可能的使用前置式
另外,后置式++和–的实现应该以前置式++和–为基础,这样的好处是,你只需要维护前置式的版本,因为后置式版本会自动调整为一致行为
参考:More Effective C++中文版(侯捷译)
相关文章推荐
- 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承
- C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类
- C++ map的基本操作和使用
- [iOS]C语言技术视频-17-指针变量高级用法练习二(使用堆内存完成链表结构的存储)
- [iOS]C语言技术视频-16-指针变量高级用法(堆栈内存)
- [iOS]C语言技术视频-15-指针变量高级用法练习一(函数指针完成动态排序)
- c++中无名命名空间的使用
- 井字棋
- [iOS]C语言技术视频-14-指针变量高级用法(函数指针)
- [iOS]C语言技术视频-13-指针变量练习三(结构体指针变量)
- [iOS]C语言技术视频-12-指针变量练习二(数组打印)
- C语言中的const、extern及结构体、联合体的定义
- [iOS]C语言技术视频-11-指针变量练习一(交换值)
- [iOS]C语言技术视频-10-指针变量
- [iOS]C语言技术视频-09-枚举的定义
- [iOS]C语言技术视频-08-结构体的定义
- [iOS]C语言技术视频-07-函数的定义
- c++与webserver通讯总结
- C++11 Lambda表达式实例2
- [iOS]C语言技术视频-06-程序循环结构(for{})