之前说的都是在栈上申请的内存空间,现在用new讲在堆上的空间开辟
定义一个对象的格式:类名 对象名 = new 类名();
一、new和malloc的区别
- new先是在堆上申请内存,后调用构造函数
- malloc只在堆上申请空间但是不释放
二、delete和free的区别
- delete先调用析构函数,后释放它
- free只释放
三、堆上的对象的生命周期
被delete的时候生命周期才完结,才析构
四、static成员
- 静态的成员变量在类外初始化
- 静态成员变量是这个类的,一个类只有一份,它不占对象的内存
- 在public权限下,静态成员变量的访问不依赖于对象,可以使用 类名::静态成
员变量 访问 - 静态成员方法,访问不依赖于对象,可以依靠类名::静态成员方法名 访问
5.静态成员方法和静态成员变量使用不依赖于this指针,所静态的成员方法内不允许使用普通的成员变量和成员方法
根据4,5我们可以总结出,其实静态的成员方法和静态成员变量的使用归根
结底不依赖this指针,又因为每次调用普通成员方法时都要传this指针,所以在静
态成员方法内不允许使用普通的成员变量和普通的成员方法,但是普通的成员方法
中可以使用静态成员方法和静态成员变量
6.如果静态变量在private中的时候,通过作用域也访问不了,所以要想访问这个私有的成员变量就在public中给它提供一个接口(函数)
五、初始化列表
初始化列表就是指,在进入构造函数之前(构造对象之前)先对成员先进行初始化,所以说如果存在必须初始化的成员,则一定要将它们放在初始化列表,必须初始化的成员有以下两种情况:
- 被const 修饰了的,一般的我们将不允许改变的变量加上const修饰,这样的话它就不能做左值,那么它就不能被赋值,它能得到值得唯一办法就是初始化,所以我们将它放在初始化列表中
- 传的是引用,那么问题就来了,为什么引用必须初始化?初始化后为什么不能再改变它得指向?因为在出现引用得地方就会被替换成底层得指针解引用,它是没有机会去访问引用得地址得,所以也必须写在初始化列表
六、const加在成员方法得右括号后面,修饰得是this指针指向得对象,不可改
七、如果成员变量是对象则称为成员对象
- 成员对象在类对象构造之前构造
- 如果成员对象不存在默认得构造函数,就必须写在初始化列表里
- 先构造成员对象,再构造类自身得对象
- 先析构自身对象,再析构成员对象(因为在栈区,栈帧回退的时候先是自身对象的那块空间被释放)
八、友元类
- 允许友元类访问自己的私有成员
- 如果一个Date类嵌套在Person类的public访问权限中,在外界要是想要使用我们这个Dtae类,只要加上Person::作用域就行,但是如果在Person类的private访问权限中,就不可以访问了
- 友元类是单向的