文章目录
- 1.new和delete
- 1.1new是先malloc申请空间在进行构造函数初始化。
- 1.2delete是先调用析构函数再调用free销毁
- 1.2 为什么new[ ],必须[ ] delete;
- 1.2.1背景
- 1.2.2原因
- 2.类于类之间的关系
- 2.1 复合
- 2.2 委托
- 2.3 继承(目前只讨论public,不讨论protect,private)
- 继承中类的静态函数成员访问
- 3.虚函数
- 4. 面向对象三大特征
- 4.1 封装
- 4.2 继承
- 4.2.1 类普通成员(同名)访问
- 继承中类的静态函数成员访问
- 4.3 多态
1.new和delete
关于new和delete,目前我们所知的就是在c++中使用,是malloc和free的升级版。
那我们深入一点,探寻调用new和delete关键字所发生的事。
(侯捷老师的课件)
1.1new是先malloc申请空间在进行构造函数初始化。
首先,会通过操作符重载new申请空间,并定义一个void指针mem指着,
然后void指针转型为ps类型指针,由ps指向mem所指的空间,
最后通过ps指针对目标空间执行构造函数进行初始化
1.2delete是先调用析构函数再调用free销毁
delete的操作就比较简单,就是先析构,再销毁,可以理解为先把里面数据销毁,再把整个变量销毁。
1.2 为什么new[ ],必须[ ] delete;
1.2.1背景
这就涉及到内存,首先先讲一下内存中动态数组的情况
其实系统用的内存不止那么多,首先它会先用4字节(vc编译器情况下),即记录内存的大小,然后上下加一对cookie(夹心饼干的意思,非常形象),然后所用的内存字节数必须是16的倍数,所以加一个pad补齐。
那么上面的21是什么意思呢?,20表示2*16=32字节占用,1表示你是从系统要的,没有还
题外话:当我们用vc debug时会有额外的内存加入
1.2.2原因
为了防止内存泄漏,如果我们创建是普通的数组,那么单纯delete,没有加 [ ] ,因为有cookie的存在,delete中的free函数仍然能删除整个数组,似乎无伤大雅。
但真正麻烦的是指针数组,没有加中括号,那么析构函数只会调用一次,
这种情况下,free删除数组,那么数组里的指针指向的内存从第二个开始没有被析构,我们也在free之后失去了指向它们的指针,这样就造成了内存泄漏
所以我们array new一定要搭配array delete
2.类于类之间的关系
类与类之间的关系分为三种,继承,复合,委托
2.1 复合
a类包含b类
构造由内到外,析构由外到内。
2.2 委托
委托和复合很像,但不同的点在由于,包含另一个类的方式是通过指针,形式更为灵活。
2.3 继承(目前只讨论public,不讨论protect,private)
继承的概念非常重要,继承,表示的是“一种”。
子类是一种父类,中国人是一种人。在这之中,人是父类,中国人是子类。子类继承了父类的特征,继承真正的精髓是和虚函数结合起来。
父类又叫基类,子类又叫派生类
目前在我学习阶段,继承感觉更像是可迭代的模板类?
父类的变量完整的继承到子类中,包括private,但private无法访问,
而对子类的访问,直接用" . “便可直接调用,而基类中的元素和函数,如果与子类同名便会被隐藏,这时便需要通过作用域限定符” :: "进行访问。
继承中类的静态函数成员访问
继承的构造和析构
同上,构造由内到外,析构由外到内,另外父类的析构函数必须是虚函数(粗略理解为可被子类改写的函数)。
3.虚函数
继承主要就是为了省事和父子的关联性,子类可以调用父类的函数,严格来说调用权,如果子类成员函数的功能与父类不同,又或者子类的同一动作,但具体代码不同,我们又不想每个子类重新定义
比如父类求矩形的面积,而子类是正方形面积,虚函数应运产生,允许子类改写父类函数,严格来说是父子都有调用权的函数。
函数分为非虚函数,虚函数(有默认定义),完全虚函数(没有默认定义,如上)
面对对象编程,类与虚函数互相结合加强了耦合性。
4. 面向对象三大特征
4.1 封装
将信息包装,只留下各种接口对接,用户无需知道其中细节,只需要通过接口访问对象,
也就是类定义中的“public,protect,private”
4.2 继承
4.2.1 类普通成员(同名)访问
父类的变量完整的继承到子类中,包括private,但private无法访问,
而对子类的访问,直接用" . “便可直接调用,而基类中的元素和函数,如果与子类同名便会被隐藏,这时便需要通过作用域限定符” :: "进行访问。
继承中类的静态函数成员访问
继承的构造和析构
同上,构造由内到外,析构由外到内,另外父类的析构函数必须是虚函数(粗略理解为可被子类改写的函数)。
4.3 多态
多态,即,不同接口接受同一信息,采取的动作不同。
最简单的多态:子类虚函数,接受同样的数据,同一个area求面积函数接口,但是在不同子类中函数被重新编写,可以求不同形状的面积。
学深入了后面慢慢补,太难了QAQ