1. 运算符重载:
- C++运算符操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多数时候我们需要对类进行类似的运算,这个时候我们就需要对运算符重新定义,赋予其新的功能,来满足要求。
- C++重载运算符的实质是函数重载,运算符重载实质上是C++的一种多态,叫做静态多态,目的是为了让我们使用同名的函数来完成不同的操作。
2. 类类型对象:
- 作为参数:
- 一般情况下传递的都是引用(因为按照引用方式传递,不需要构造临时对象,传参效率高),如果不需要通过形参改变外部的实参,将参数设置成const T&
- 作为返回值:
- 如果返回的对象不随函数的结束而销毁,直接返回引用(如this指针);
- 如果返回的是函数栈上的空间,只能按照值传递的方式返回;
3.什么情况下要返回对象的引用呢?
①允许进行连续赋值
②防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。
//对于第二点原因:如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。
4. 具体实现:
- <<:
- 实现:
//返回值类型为ostream,实现链式调用,因为只有ostream类型的对象才能调用函数,函数结束时返回ostream类型,所以可以持续调用;
- 调用:
- +=:
- 实现:
- 调用:
- +:
- 实现:
//此处不能返回引用,因为当函数结束时,对象会被销毁,引用该对象其值会成为乱码;
//函数返回值为右值,此处会调用重载运算符<<的右值引用;
- 调用:
- =:
- 实现:
//此处返回值若不为引用,执行完b=c时会返回一个临时对象,然后将临时对象赋值给a,不符合赋值运算符,因为赋值运算符是c值赋值给b,b值赋值给a,故此处为引用,因为对象a是在main函数中,对象没有被销毁所以引用没问题;
//只以a = b这种方式使用赋值运算符,赋值运算符重载函数就没必要有返回值,因为在函数体内已经通过this指针对d2进行了修改。但是为了支持连续赋值,即a = b = c,我们就需要为函数设置一个返回值了,而且很明显,返回值应该是赋值运算符的左操作数(先b = c,再a = b),即this指针指向的对象。
- 调用:
- 前++:
- 实现:
- 调用:
- 后++:
- 实现:
//注意与前++区分,后++在参数位置有个int类型的占位符
- 调用: