今天看书,看到例子里有个重载自增运算符,前自增还比较好。看后自增的时候有点迷惑。查 c++primer才发现自己这里有知识漏洞。特此补上。
在为类定义自增自减运算符的时候要注意,如何区分前自增/自减 和 后自增/自减运算符。
1 定义前自增/自减运算符
class CheckedPtr{
public:
CheckedPtr& operator++();
CheckedPtr& operator--();
};
CheckedPtr& CheckedPtr::operator++()
{
if(curr==end)
throw out_of_range("");
++curr;
return* this;
}
CheckedPtr& CheckedPtr::operator--()
{
if(curr==beg)
throw out_of_range("");
--curr;
return* this;
}
为了与内置类型一致,前缀形式操作符返回被增或者减量对象的引用。
2 区别前缀和后缀形式
由于前缀和后缀的形参数目和类型相同,普通的重载不能区别所定义的前缀操作和后缀操作
后缀的形式要接收一个额外、无用的int型参。使用后缀式时编译器自动提供0作为实参,它的唯一目的是使用后缀函数与前缀函数区分开。
3 后缀形式操作符
class CheckedPtr{
public:
CheckedPtr operator++(int);
CheckedPtr operator--(int);
};
CheckedPtr& CheckedPtr::operator++()
{
CheckedPtr ret(*this);
++*this;
return ret;
}
CheckedPtr& CheckedPtr::operator--()
{
CheckedPtr ret(*this);
--*this;
return ret;
}
先是保存状态,然后调用自己前面定义的前缀操作。
PS:以上全部内容来自《C++ Primer》