北大C++课后记录:自增、自减运算符重载的小Demo

前言

自增、自减运算符有前置(++x)和后置(x++)之分,为了对其进行区分,C++规定:

  • 前置运算符作为一元运算符进行重载:(注意T1对象和T2对象是有差异的)
    北大C++课后记录:自增、自减运算符重载的小Demo_第1张图片
  • 后置运算符作为二元运算符重载,多写一个没用的参数:
    北大C++课后记录:自增、自减运算符重载的小Demo_第2张图片

Code

#include 
#include 
#include 
#include 
using namespace std;

class CDemo{
    private:
    int n;
    public:
    CDemo(int i = 0): n(i) {}
    ~CDemo(){}
    CDemo(){}
    operator int (){ return n; }        //为能将对象直接传递给构造函数而不调用复制构造函数,省去开销

    //写在class体内时:参数个数 = 运算符目数 - 1
    CDemo& operator ++ ();          //重载前置++
    CDemo operator ++(int);         //重载后置++
    //--写在外面(本质一样)
    friend CDemo& operator -- (CDemo&);
    friend CDemo operator -- (CDemo&, int);
};

CDemo& CDemo :: operator ++ (){
    n += 1;
    return *this;
}

CDemo CDemo :: operator++(int){
    CDemo tmp(*this);
    n += 1;
    return tmp;
}

CDemo& operator -- (CDemo &a){
    a.n -= 1;
    return a;
}

CDemo operator -- (CDemo &a, int){
    CDemo tmp(a);
    a.n -= 1;
    return tmp;
}

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;
}

总结Tips

  • 从重载函数的实现中也可以看到,前置运算本质上返回的原对象自增(减)的自身引用
  • 而后置运算返回的是原对象的一个深拷贝副本(这个副本的数据展现了原对象自增(减)的内容),因此多创建了一个对象。

因此++ x可能会比x ++在时空开销上更小,从而更高效。

你可能感兴趣的:(北大C++MOOC,c++)