赋值操作符重载为什么要防止自身赋值_C++中的运算符重载

cb685331b3be14bb07386b869e054c03.png

我们在刚开始学面向对象时就了解了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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值