![cb685331b3be14bb07386b869e054c03.png](https://i-blog.csdnimg.cn/blog_migrate/480532cce4f2c54c573b774f583ae5ee.jpeg)
我们在刚开始学面向对象时就了解了C++中的六个默认构造函数,其中有一个就是赋值运算符重载函数,它重载的是赋值运算符,今天我们就对赋值运算符重载函数具体的要求和写法做以总结。其次再举例说明其他的重载函数。
当我们给出一个类的声明时,写赋值运算符函数要考虑三个方面:
1、传参:
1.1:对于操作运算符重载函数要传的参数可以是引用也可以不是引用。但考虑到传引用时不用生成一个临时对象,不用调用拷贝构造函数,效率高,我们选择传引用。
1.2:考虑到修饰的形参不能被修改且要能接收隐式产生的临时量,我们要传常引用。
2、返回值:
2.1:考虑到要能进行连续赋值,我们要传引用,因为如果不传引用的话,传回去第二次赋的值就给了临时量,而且表达式结束时临时量被销毁,不能做到连续赋值。
2.2:函数结束前返回实例自身的引用,既*this。
3、函数体:
3.1:判断自赋值,如果自赋值,直接返回。
3.2:释放自身的资源,防止内存泄漏。
3.3:开辟新的资源,防止同一块内存区域被释放多次,导致程序奔溃。
对于运算符的操作数,编译器只能识别基础的数据类型,如果要使用符合的数据类型(如结构体),则需要对运算符的操作数进行拓展是运算符支持复合数据类型,C++中的运算符重载就解决了这一问题。
运算符函数定义的一般格式如下:
数据类型 operator(参数列表)
{
}
有一些特殊的运算符不能被重载:域解析符(::),条件运算符(?:),直接成员访问运算符(.),类成员指针引用运算符(.*),sizeof运算符(sizeof)
运算符重载分为类的内部方式和全局方式,同一种运算符,全局和内部方式只能存在一种。当无法修改左操作数的类时,使用全局函数进行重载。
eg:计算虚数
class Complex
{
friend Complex operator+(Complex &c1, Complex &c2);
//使用到类的私有变量,需要设为友元函数
friend Complex operator+(Complex &c1, int num);
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void show()
{
printf("%d + %di