C++复习第5篇

八、特殊的运算符重载

*-> () [] new delete

1、[]下标运算符

​ 想让一个类对象当成数组一样使用,可以考虑重载下标运算符,例如

​ vector等

​ 可以考虑在下标重载函数中做非法下标的判断,让下标的适用更安全

2、()函数运算符

​ 重载次运算符可以让一个类对象当做函数一样使用

注意:()[]均不能实现为全局运算符函数,只能实现成员函数(C++全局中已经有类似的函数实现,所以不让实现)

​ = 赋值运算符函数也不能实现为全局函数,因为类内本身一定有一个=赋值运算符成员函数

3、解引用*和访问成员运算符 ->

​ 重载这两个运算符可以让类对象像指针一样使用,智能指针就是通过这两个运算符从而像使用指针一样的类

4、new/delete运算符的重载

​ void* operator new(size_t size)

​ C++语法要求重载new运算符函数的参数必须为size_t,编译器会帮助计算出要申请的字节数并传递,返回值必须为void*,编译器会帮助转换成对应的类型指针返回

​ void* operator delete(void* ptr)

​ C++语法要求重载new运算符函数的参数必须为void*,编译器会帮助转换成void *并传递

​ 注意:new、delete得到成员函数、全局函数格式一样

​ 如果只是针对某个类想要重载它的new\delete,则谢伟成员函数,如果想要所有类型都执行重载版本,则实现全局函数

​ 为什么重载new/delete?

​ 1、可以在重载函数中记录每次分配释放内存的地址、代码情况、次数情况等到日志中,从而方便检查是否出现内存泄漏,以及泄露位置

​ 2、对于字节少、且频繁申请、释放的对象,可以在重载函数中给他多分配点内存从而减少产生碎片的可能

九、重载运算符的限制

​ 1、不能重载的运算符

​ ::域限定符

​ .直接访问成员的运算符

​ ?:三目运算符

​ sizeof 计算字节数

​ typeid 获取类型信息的运算符

​ 2、智能重载为全局函数的运算符

​ << 输出运算符

​ >> 输入运算符

​ 3、只能重载为成员函数的运算符

​ [] () = ->

​ 4、运算符可以自定义运算符执行过程,但是无法改变运算符的优先级

​ 5、运算符的操作数量也不能改变

​ 6、不能发明新的运算符

​ 建议:

​ 1、重载运算符要遵循一致性原则,不要随意改变运算符本身的含义

​ 2、不要忘记实现运算符重载函数的初衷,为了提高可读性,不要随意炫技

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值