1

自增和自减运算符的重载

问题

编写CDemo类,使得下面程序可以正常运行

int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}

输出结果

5,6,7,7
7,6,5,5

分析

自增++自减--运算符有前置和后置之分,为了区分,后置运算符多一个参数int。
前置运算符:作为一元运算符重载,可以重载为成员函数也可以重载为全局函数(返回值到底是不是引用?)。
后置运算符:作为二元运算符重载,多写一个参数int,但是没有实际意义。可以重载为成员函数也可以重载为全局函数。返回值不是引用!不是引用!不是引用!

强调:后置运算符多一个参数int,返回值不是引用。

为了cout可以正常输出,重载类型强制转换运算符int作为成员函数。

类型强制转换运算符重载

不能写返回值类型
实际上其返回值类型为类型强制转换运算符代表的类型

运算符重载的注意事项

  1. C++不允许定义新的运算符
  2. 重载后运算符的含义应该符合日常习惯
  3. 运算符重载不改变运算符的优先级
  4. 以下运算符不能够被重载:. .* :: ?: sizeof
  5. 以下运算符重载是必须声明为类的成员函数:() [] ->
  6. 流提取>>和流插入<<运算符只能重载为全局函数,第一个参数ostream对象必须为引用。

完整代码

#include<iostream>
using namespace std;
class CDemo{
public:
    CDemo(int num = 0):n(num){}
    CDemo operator++();                     //前置++,成员函数
    CDemo operator++(int);                  //后置++,成员函数
    friend CDemo operator--(CDemo&);        //前置--,友元函数
    friend CDemo operator--(CDemo&, int);   //后置--,友元函数
    operator int(){                         //强制类型转换运算符重载
        return n;
    }
//    friend ostream& operator<<(ostream& co, const CDemo& d);
//    friend istream& operator>>(istream& ci, CDemo& d);
private:
    int n;
};
//前置++
CDemo CDemo::operator++(){
    n++;
    return *this;
}
//后置++
CDemo CDemo::operator++(int){
    CDemo temp(*this);
    n++;
    return temp;
}
//前置--
CDemo operator--(CDemo& d){
    d.n--;
    return d;
}
//后置--
CDemo operator--(CDemo& d, int){
    CDemo temp(d);
    d.n--;
    return temp;
}
//ostream& operator<<(ostream& co, const CDemo& d){
//    co << d.n;
//    return co;
//}
//istream& operator>>(istream& ci, CDemo& d){
//    ci >> d.n;
//    return ci;
//}
int main(){
    CDemo d(5);
    cout << (d++) << ",";
    cout << d << ",";
    cout << (++d) << ",";
    cout << d << endl;
    cout << (d--) << ",";
    cout << d << ",";
    cout << (--d) << ",";
    cout << d << endl;
    return 0;
}

afra
225 声望23 粉丝

你的努力程度之低 远还没有到比拼天赋的需要。