运算符重载

        在C++的类和对象中,如果我们要对类类型的对象使用运算符,C++语言允许我们通过运算符重载的方式指定新的含义。同时,对类类型对象使用运算符时,必须调用对应的运算符重载,否则编译会报错。

运算符重载的特点

        1、运算符重载是具有特名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。比如说我们想要重载‘+’这个运算符,那么基本形式就是 int operator+(Date&d1,Date&d2)(假设存在一个Date类)

       2、重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。但需要注意的是,如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。

        如上图,由于有隐含的this指针作为第一个参数,所以二元操作符+的重载函数中参数少一个。

        3、运算符重载以后,其优先级和结合性与对应的内置类型运算符保持⼀致。同时,不能链接语法中没有的符号进行重载,比如operator@。

        4、不能进行重载的运算符有五个,分别为:.*  / :: / sizeof / ?: / .

        5、重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,⽆法很好的区分。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,⽅便区分。因此,

Date& operator++()代表前置++,Date operator++(int)代表后置++。

运算符重载的具体操作

        接下来我们就Date类来实现一些操作符重载。

        

(1)+=运算符重载

        首先创建出GetMonthDay函数得到对应月份的天数

        

(2)+运算符重载

        与+=运算符重载不同的是,+=运算符是作用于对象本身,比如Date类d+=100;改变的是d本身,而+运算符不同,Date类 d1=d+100;改变的是d1而不是d,因此在具体的实现中,与+=略有不同,我们需要创建一个Date类临时对象进行操作,并将该临时对象返回,不改变d本身的值,由此也不能进行引用返回。

        重载完了+=运算符之后,我们可以直接用在+的运算符重载中减少工作量

(3)-、-=运算符重载

        基本思路与上面两个运算符相类似。

        

(4)前置++运算符重载

        前置++运算符重载的思路较为简单,因为前置++是先自加再使用,因此不需要考虑创建一个临时对象拷贝后进行返回。直接本体进行操作即可。

(5)后置++运算符重载

        后置++的思路是先使用,后自加先使用,因此我们创建一个Date类临时对象并返回,然后再让本身++。

        注意后置++中我们需要加一个int参数与前置++区别开来

(6)==、<、<=、>、>=、!=运算符重载

        以上运算符重载的返回值是bool类型,其实我们只需要着重实现==和>的运算符重载,就可以搞定其他的运算符重载

        其他的运算符重载只需要利用上面具体实现的两个重载函数就可以了

(7)-运算符重载

        两个日期类相减,得到两个日期间相差的天数。

        上面这段程序中,flag的意义是被减数小于减数时,使输出值为负数,同时利用上述重载过的运算符,让小的日期加加,直到等于大的日期,减少复杂的运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值