C++运算符重载


前言

本文介绍了C++运算符重载,基于施磊老师的C++课程。


一、C++运算符重载

1、编译器做对象运算的时候,会调用对象的运算符重载函数(优先调用成员方法);如果没有成员方法,就在全局作用域找到合适的运算符重载函数。
2、在定义全局运算符重载函数的时候,应当在类内将这个函数定义为友元函数。
3、在定义自增或者自减运算符时,依赖operator++()和operator++(int)区分其是前置运算还是后置运算,operator++()为前置++,operator++(int)为后置++

二、模拟实现C++的string类及其迭代器实现

待补充

三、迭代器的实效问题

可能造成迭代器失效的情况:
1、当容器调用erase/insert方法后,当前位置到容器末尾元素的所有迭代器全部失效
2、对于insert来说,如果引起容器扩容,那么原来的所有迭代器就全部失效了

如何解决:
insert或者erase会返回更新后的迭代器,用变量接收后继续进行逻辑处理即可。(需要注意insert和erase的处理逻辑可能不同)

解决迭代器失效的底层原理:
待补充

四、深入理解new和delete的原理

1、malloc和new的区别
a. malloc是按字节开辟内存的,而new开辟内存时需要指定类型;所以malloc开辟内存返回的都是void*,而new会返回相应的类型

b.malloc只负责开辟空间,new不仅仅有malloc的功能,还可以进行数据的初始化。new int(20); new int[20] (); 初始化为零,不能在括号内填入数字,不支持这样的初始化。

c.malloc开辟内存失败返回nullptr指针,new抛出的是bad_alloc类型的异常

2、free和delete的区别
a. delete会调用析构函数

3、new和delete能否混用?即new int[]、delete[]和new int、delete?

对于普通的编译器内置类型,二者是一样的。而对于自定义的类类型,有析构函数,为了调用正确的析构函数,那么开辟对象数组的时候,会多开辟4个字节,混用会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值