先是下面的代码:
class TestClass
{
public:
TestClass(const int& a){
m_a = a;
}
operator int()const{
return m_a;
}
TestClass operator ++(){
++m_a;
return m_a;
}
TestClass operator ++(int){
return m_a++;
}
private:
int m_a;
};
TestClass operator ++(int)这个比较简单,没有什么好说的。大致就是这个样子吧。
来看看TestClass operator ++()这个函数:
上面的代码很简单,直接让两个重载的运算符返回一个临时对象,好像没问题,大多数情况下也能正常工作。
什么情况下不会正常工作呢?试一下内置的++运算符会发现
int a = 0;++++a;
这样是可以的相当于对a进行了两次++,返回2。
而我们的不是,因为第一次++过后返回一个临时对象,我们对一个临时对象进行了++。
那我们就改进一下返回引用吧,看下下面的代码:
class TestClass
{
public:
TestClass(const int& a){
m_a = a;
}
operator int()const{
return m_a;
}
const TestClass& operator ++(){
++m_a;
return m_a;
}
TestClass operator ++(int){
return m_a++;
}
private:
int m_a;
};
这个代码有问题吗?首先看到的问题是,为了不想让外界修改内部成员变量最直接的结果就是造成++++这种形式不能用了。
那如果把const去掉呢,变成下面的形式:
TestClass& operator ++(){
++m_a;
return m_a;
}
还存在问题吗?好像可以用了,但是我们试一下发现编译都通不过了:
无法从“int”转换为“TestClass &”
问题在于我们应该返回一个引用,但不是成员变量的引用,而是这个对象:
TestClass& operator ++(){
++m_a;
return *this;
}
终于可以了,++++形式可以用了,而且可以正常工作。

高端的,玩C的都是大神!