1.前置++
hint& hint::operator++() /这里返回值可以用引用,也可以不用,用的话更省内存
{
*this = *this+ 1;
return *this;
}
hint& operator++(hint& _gold) /全局函数
{
_gold = _gold + 1;
return _gold;
}
--类似
2.后置++
后置++与前置++的区分,因为前置和后置的符号一模一样,区分的方式就在于后置++多了一个默认的占位参数,这个参数值为多少不重要,只是用来区分的
特别注意*:这里的占位参数只能是int类型,不能是short、unsignde等等
hint hint::operator++(int)
{
hint val = *this;
*this = *this + 1;
return val;
}
这里的返回值为什么不是引用呢,因为不能返回局部变量的引用,当代码进行到hint val=*this时,会调用默认的副本构造,会把*this的内存空间全部复制一份,在析构的时候就会出错,并且返回val时,因为它时局部变量,所以会复制一份val的值来返回,这里也会调用默认副本构造,也会出错。所以这里我们可以重写一下副本构造函数。
hint::hint(hint& val): hint((int) val)
{
}
另外,我们也可以删除掉默认的副本构造
hint(hint& val)=delete;
不过后置++重载里面要写成这样,如果不进行显示转换,会出错
hint hint::operator++(int)
{
hint val =(int) *this;
*this = *this + 1;
return val;
}
那么问题来了,为什么return val时,就不会出错呢,因为return val更多的是复制val的内存,这里我也解释不清楚
知识扩展*:原生的后置++不支持这种,gold++++,但我们的重载支持,如果想要它和原生的一样,可以在返回值前面加上const,这样就限定了它的返回值不能再加第二次。
const hint hint::operator++(int)