您的位置:首页 > 编程语言 > C语言/C++

C++重载自增运算符的效率问题

2014-08-15 13:25 260 查看
C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。

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.一般通过前自增操作来实现后自增操作符函数。

从上面可以看出,后置运算需要复制一个无用的临时对象,效率肯定是要低一点的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: