自增\自减运算符的重载

自增运算符++ ,自减运算符–有前置/后置之分,为了区分所重载的是前置运算符还是后置运算符,C++规定:
前置运算符作为一元运算符重载
//重载为成员函数时
T & operator ++()
T & operator --()
//重载为全局函数时
T & operator ++ (T&)
T & operatot -- (T&)
后置运算符作为二元运算符重载,多写一个没用的参数
//重载为成员函数时
T & operator ++(int n)
T & operator --(int n)
//重载为全局函数时
T & operator ++(T &,int n)
T & operator --(T &,int n)
但是在没有后置运算符重载而有前置运算符重载的情况下,在VS中,obj++也调用前置重载,在dev中,则obj++编译出错
class CDemo{
    
    
    int n;
    public:
    CDemo(int i=0):n(i){
    
    }
    CDemo operator++(int);//后置
    CDemo &operator++();//前置
    friend CDemo operator--(CDemo &, int);//全局后置
    friend CDemo &operator--(CDemo &);//全局前置
    friend ostream & operator<<(ostream &os,const  CDemo &d);
};
ostream &operator <<(ostream & os,const CDemo & d){
    
    
    os << d.n;
    return os;
}
CDemo CDemo::operator++(int){
    
    //成员后置
    CDemo tmp(*this);
    n++;
    return tmp;
}
CDemo & CDemo::operator++(){
    
    //成员前置
    n++;
    return *this;
}
CDemo operator--(CDemo & d,int){
    
    //全局后置
    CDemo tmp(d);
    d.n--;
    return tmp;
}
CDemo & operator--(CDemo & d){
    
    //全局前置
    d.n--;
    return d;
}

int main() {
    
    
    CDemo d(5);
    cout << (d++) << ',';//等价于d.operator++(0),成员
    cout << d << ',';
    cout << (++d) << ',';//等价于d.operator++(),成员
    cout << d << ',';
    cout << endl;
    cout << (d--) << ',';//等价于operator--(d,0),全局
    cout << d << ',';
    cout << (--d) << ',';//等价于operator--(d),全局
    cout << d << ',';
    cout << endl;
    return 0;
}
写<<运算符重载的时候发现一个问题,就是第二个参数对CDemo 的引用必须是常引用,不加const编译不过,使用的是dev,有点纳闷
ostream &operator <<(ostream & os,CDemo & d){
    
    
    os << d.n;
    return os;
}

猜你喜欢

转载自blog.csdn.net/weixin_43311695/article/details/106701319