八、特殊的运算符重载
*-> () [] 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、不要忘记实现运算符重载函数的初衷,为了提高可读性,不要随意炫技