运算符重载: 对于自定义类型的对象,操作符(>,<,++,–)都不支持运算,所以要进行重载
关键字:operator
如何书写重载函数
返回值类型 operator操作符(参数列表)
- 关键字operator后要紧接被重载的运算符,
operator操作符
组成函数名- 函数参数个数取决于操作符本身是一元参数还是二元参数
- 运算符被定义成全局函数,对于一元就是一个参数,二元是两个参数
被定义成成员函数,一元没有参数,二元一个参数
运算符重载的注意事项:
- 重载操作符函数参数,必须有一个类类型或枚举类型(如果参数是内置类型,重载后会无限递归);
- 重载运算符时,不能修改该运算符的规则(对“+”的重载,不能将+含义重载成+=的含义);
- (.*) 、(:: ) 、(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& 就能实现连续插入