C++重载自增运算符的效率问题
2014-08-15 13:25
260 查看
C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。
increment的前缀形式表示“增加然后取回”,后缀形式表示“取回然后增加”。
说明
1. 类中的++操作符号重载之后必须保证其语意与全局++相同。
2.为了区分前后,用++()表示前自增,用++(int)后自增。
3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
4.后自增应该返回"const Complex".这可以防止形如"a++++"的用法。
5.一般通过前自增操作来实现后自增操作符函数。
从上面可以看出,后置运算需要复制一个无用的临时对象,效率肯定是要低一点的。
increment的前缀形式表示“增加然后取回”,后缀形式表示“取回然后增加”。
#include "stdafx.h" #include "assert.h" class A { public: A(int i) :m_i(i) { } // ++i A& operator++() { ++m_i; return *this; } // i++ const A operator++(int) { A tmp = *this; ++(*this); // Implemented by prefix increment return A(tmp); } int m_i; }; int _tmain(int argc, _TCHAR* argv[]) { int i = 0; int i1 = i++; // i1 = 0; i = 1; int i2 = ++i; // i2 = 2; i = 1; A a(0); A a1 = a++; // i1 = 0; i = 1; A a2 = ++a; // i2 = 2; i = 1; //a++++; //avoid //++++a; //support assert(i1 == a1.m_i); assert(i2 == a2.m_i); return 0; }
说明
1. 类中的++操作符号重载之后必须保证其语意与全局++相同。
2.为了区分前后,用++()表示前自增,用++(int)后自增。
3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
4.后自增应该返回"const Complex".这可以防止形如"a++++"的用法。
5.一般通过前自增操作来实现后自增操作符函数。
从上面可以看出,后置运算需要复制一个无用的临时对象,效率肯定是要低一点的。
相关文章推荐
- 重载赋值符——谈C++中一个稍微有点复杂的问题
- 关于i++ 和 ++i在C++中的效率问题(转载)
- C和C++在效率问题上有哪些差异
- [读书笔记]C++基础知识温习:重载递增/减运算符
- C++中重载间接运算符(operator->())
- 关于C++模板和重载的小问题
- [C/C++]运算符的重载
- C++自增运算符进行重载
- C++输入输出重载中的问题(转换IP为二进制)
- c++中利用sizeof运算符计算结构体大小问题探讨
- 关于C++模板和重载的小问题
- C++编程点滴4:二元运算符重载问题
- More Effective C++ 阅读笔记(十)--效率问题
- C++ 函数重载的问题
- VC6.0中有关输出运算符<<的重载问题(备忘)
- 转贴:关于C++模板和重载的小问题
- 关于C++模板和重载的小问题
- c++中为什么有不能重载的运算符(摘录)
- 模板类中操作符重载问题("<<"和">>"重载)[c++]
- C++中有哪些运算符不能重载?