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

前言

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

  • 前置运算符作为一元运算符进行重载:(注意T1对象和T2对象是有差异的)
    在这里插入图片描述
  • 后置运算符作为二元运算符重载,多写一个没用的参数:
    在这里插入图片描述

Code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string.h>
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 ++在时空开销上更小,从而更高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值