重载前置,后置(自增运算符 ++ 和自减运算符 --)

如何重载增量运算符 ++ 和 --

运算符++和--有前置和后置两种形式,如果不区分前置和后置,则使用operator++( )或operator--( )即可;否则,要使用operator++( )或operator--( )来重载前置运算符,使用operator++(int)或operator--(int)来重载后置运算符,调用时,参数int被传递给值0。

对于“++” 和“--”这两个一元运算符,存在前置和后置的问题,在定义时必须有所区分。
(1) 用成员函数的形式来进行重载
如果++为前增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( )
{
//…
}

如果++为后增量运算符时,重载函数的一般格式为:
< type > ClassName :: operator ++ ( int )
{
//…
}

(2) 非成员函数形式的重载
以++ 为例说明
用友元函数来实现“++”运算符的重载时,前置++运算符的重载的一般格式:
friend <type> operator ++ (ClassName & );
其中,第一个参数是要实现++运算的对象。

后置++运算符的重载的一般格式:
friend <type> operator ++(ClassName &,int);
其中,第一个参数是要实现++运算的对象;而第二个参数除了用于区分是后置运算外,并没有其他意义,故起参数可有可无.

-------------------------------------------------------

#include <iostream>
#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 main()
{
	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.一般通过前自增操作来实现后自增操作符函数。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值