C++类与对象:运算符重载


运算符重载: 对于自定义类型的对象,操作符(>,<,++,–)都不支持运算,所以要进行重载
关键字:operator

如何书写重载函数

返回值类型 operator操作符(参数列表)

  • 关键字operator后要紧接被重载的运算符,operator操作符 组成函数名
  • 函数参数个数取决于操作符本身是一元参数还是二元参数
  • 运算符被定义成全局函数,对于一元就是一个参数,二元是两个参数
    被定义成成员函数,一元没有参数,二元一个参数

运算符重载的注意事项:

  1. 重载操作符函数参数,必须有一个类类型或枚举类型(如果参数是内置类型,重载后会无限递归);
  2. 重载运算符时,不能修改该运算符的规则(对“+”的重载,不能将+含义重载成+=的含义);
  3. (.*) 、(:: ) 、(sizeof) 、(?: ) 、(.),这5个运算符不能重载

重载函数的特点:

  • 也是一种拷贝,但是不会创建新对象(也是一种拷贝,但叫成赋值)
    拷贝构造函数在拷贝的同时会构造一个新对象
  • 用户未显式提供,编译器也会自己默认生成一个默认的函数(如下列代码)

Date类需要用到的函数

在这里插入图片描述

<和==

在这里插入图片描述

<=,>,>=,!=

在这里插入图片描述

=

赋值运算符重载和拷贝构造函数的调用时机在最后一幅图
在这里插入图片描述

对于函数参数用const修饰,并且使用引用的原因:

  • const防止调用拷贝构造;
  • 引用提升运行效率

对于该函数的返回值类型确定,和return * this还是d:

  • 因为d是引用,d销毁但是实体还在;this指向的实体也存在;
  • 所以返回类型可以用引用;
  • 根据连续赋值,应该返回的是*this

赋值运算符有左右两个操作数,为什么重载函数只有一个操作数的引用

  • d1.operator=(d2)
  • 这一行语句是对象d1将对象d2作为参数调用重载函数,对象d1被this指针指向,在传参时只需要传被调用的对象;以下其余运算符重载函数的参数部分同理

+

1.加天数
在这里插入图片描述
2.加年月日

+=

在这里插入图片描述

前后++

在这里插入图片描述

在调用时:
d1++; 全写为d1.operator(0);0是编译器在编译完成后自己传的
++d1; 全写为d1.operator( )

全缺省和无参的函数不能同时存在,而且41行也不写形参,表示接收而不使用值

函数重载与运算符重载区别:

  • 函数重载:是一系列函数处于相同的作用域,函数名相同,参数列表不同;将这样一系列的函数称为函数重载
  • 运算符重载:为了提高代码可读性的一种手段

对this指针的深入理解

this指针是Date* const this
通过this指针修改对象中变量值的理解
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<<

在这里插入图片描述

_cout和cout一样,都是ostream类的对象,是一模一样的

重载成友元函数

在这里插入图片描述
类里面定义的函数默认是内联函数,应该将实现放入cpp文件中。
即使函数很复杂,类里面的函数也是具有内联属性的
类中的函数,在外界调用是不用去符号表中寻找的
将void改成ostream& 就能实现连续插入

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值