文章目录

  • 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指针对目标空间执行构造函数进行初始化

java delete 用get还是post_java

1.2delete是先调用析构函数再调用free销毁

java delete 用get还是post_c++_02


delete的操作就比较简单,就是先析构,再销毁,可以理解为先把里面数据销毁,再把整个变量销毁。

1.2 为什么new[ ],必须[ ] delete;

1.2.1背景

这就涉及到内存,首先先讲一下内存中动态数组的情况

java delete 用get还是post_java_03


其实系统用的内存不止那么多,首先它会先用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类

java delete 用get还是post_java_04


构造由内到外,析构由外到内。

2.2 委托

委托和复合很像,但不同的点在由于,包含另一个类的方式是通过指针,形式更为灵活。

java delete 用get还是post_子类_05

2.3 继承(目前只讨论public,不讨论protect,private)

继承的概念非常重要,继承,表示的是“一种”。
子类是一种父类,中国人是一种人。在这之中,人是父类,中国人是子类。子类继承了父类的特征,继承真正的精髓是和虚函数结合起来。

父类又叫基类,子类又叫派生类

目前在我学习阶段,继承感觉更像是可迭代的模板类?

java delete 用get还是post_子类_06


父类的变量完整的继承到子类中,包括private,但private无法访问,
而对子类的访问,直接用" . “便可直接调用,而基类中的元素和函数,如果与子类同名便会被隐藏,这时便需要通过作用域限定符” :: "进行访问。



继承中类的静态函数成员访问

继承的构造和析构
同上,构造由内到外,析构由外到内,另外父类的析构函数必须是虚函数(粗略理解为可被子类改写的函数)。

3.虚函数

继承主要就是为了省事和父子的关联性,子类可以调用父类的函数,严格来说调用权,如果子类成员函数的功能与父类不同,又或者子类的同一动作,但具体代码不同,我们又不想每个子类重新定义

比如父类求矩形的面积,而子类是正方形面积,虚函数应运产生,允许子类改写父类函数,严格来说是父子都有调用权的函数。

函数分为非虚函数,虚函数(有默认定义),完全虚函数(没有默认定义,如上)

java delete 用get还是post_数据结构_07


面对对象编程,类与虚函数互相结合加强了耦合性。


4. 面向对象三大特征

4.1 封装

将信息包装,只留下各种接口对接,用户无需知道其中细节,只需要通过接口访问对象,
也就是类定义中的“public,protect,private”

4.2 继承

4.2.1 类普通成员(同名)访问

父类的变量完整的继承到子类中,包括private,但private无法访问,
而对子类的访问,直接用" . “便可直接调用,而基类中的元素和函数,如果与子类同名便会被隐藏,这时便需要通过作用域限定符” :: "进行访问。



继承中类的静态函数成员访问

继承的构造和析构
同上,构造由内到外,析构由外到内,另外父类的析构函数必须是虚函数(粗略理解为可被子类改写的函数)。

4.3 多态

多态,即,不同接口接受同一信息,采取的动作不同。

最简单的多态:子类虚函数,接受同样的数据,同一个area求面积函数接口,但是在不同子类中函数被重新编写,可以求不同形状的面积

学深入了后面慢慢补,太难了QAQ