自增操作符和自减操作符经常要在我们自定义的类类型中使用到,而使用时经常会出现问题。现把自己在学习的过程中的代码拿出来看一下,也是c++ primer中的例子如下:
<pre class="cpp" name="code">#ifndef _CHECK_PTR_
#define _CHECK_PTR_
#include<iostream>
using namespace std;
class checkPtr
{
public:
checkPtr(int *b,int *e);
// 前向自增、自减操作符
checkPtr& operator ++ ();
checkPtr& operator -- ();
// 后缀是操作符
checkPtr operator ++ ( int );
checkPtr operator -- ( int );
// 显示当前指针值
void PrintCurValue( );
private:
int *beg;
int *end;
int *cur;
};
#endif</pre>
<br />
#include "checkPtr.h"
checkPtr::checkPtr(int *b,int *e):beg(b),end(e),cur(b)
{
}
// 前向自增操作符
checkPtr& checkPtr::operator ++()
{
cout<<"调用前向自增操作符"<<endl;
if ( cur == end )
throw out_of_range("increment past the end of CheckPtr");
++cur;
return *this;
}
// 前向自减操作符
checkPtr& checkPtr::operator --()
{
cout<<"调用前向自减操作符"<<endl;
if ( cur == beg )
throw out_of_range("decrement past the beginning of CheckedPtr");
--cur;
return *this;
}
//后缀自增操作符
checkPtr checkPtr::operator ++ ( int )
{
cout<<"调用后缀自增操作符"<<endl;
checkPtr ret(*this);
++*this;
return ret;
}
//后缀自减操作符
checkPtr checkPtr::operator -- ( int )
{
cout<<"调用后缀自减操作符"<<endl;
checkPtr ret(*this);
--*this;
return ret;
}
// 显示当前指针值
void checkPtr::PrintCurValue()
{
cout<<"当前指针指向的元素值为:"<<*cur<<endl;
}
#include "checkPtr.h"
int main( )
{
int ia[]={1,2,3,4,5};
checkPtr pArr(ia,ia+5);
++pArr;
pArr.PrintCurValue();
pArr++;
pArr.PrintCurValue();
return 0;
}
在上面代码中,可以看到在前向操作符和后缀操作符的处理时,有需要注意的点:
1.前缀和后缀两种形式,首先在类的声明中不同,后缀比前缀多了一个形参(int),而这个形参本身是没有值的,编译前默认赋给0,其目的
只是为了区分开前缀和后缀这两种表达形式。
2.前置返回的是对象的引用,即对象本身,做完自增或自减后返回*this,即返回本对象的引用。
3.后置操作符返回的是本对象的一个副本,它返回的是一个旧值。而对象本身this进行自增和自减不变。这样操作都是为了和内置操作符一致。
4.因为这些操作符改变了对象的状态,所以一般定义为类的成员函数。