七.对象模型(对象树)
(1)Qt对象树的模型
在Qt中创建对象的时候会提供一个Parent对象指针,下面来解释这个parent到底是干什么的
QObject是以对象树的形式组织起来的
当你创建一个QObject对象时,会看到QObject的构造函数接收一个QObject指针作为参数,这个参数就是 parent,也就是父对象指针
这相当于,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表
当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)
(2)这里先复习一下cpp类和对象
1.先复习一下new和delete的用法
这里可以new指令看到是返回的任意类型的指针,int型指针可以,别的类型也可以
operate new是符号的重载
当程序不再需要由new分配的内存空间时,可以用delete释放这些空间;
使用new和delete应注意的事项:
1.用new运算符申请分配的内存空间,必须用delete释放掉;
2.对于一个已经分配内存的指针,只能用delete释放一次。
3.delete作用的指针对象必须是由new分配内存空间的首地址;
4.用new运算符为多个对象申请分配内存空间的时,不能提供初始化;
2.再复习一下类和对象的用法
1.class是定义类的关键字,类名必须是C++的有效标识符,但一般首字母 大写;
2.大括号内的部分是类的成员,分别由private,public , protected三个关键字后跟冒号来指定访问属性,这3个部分非必须同时出现,可以任何顺序出现任意次;
3.只有类中的成员函数才能使用private的数据成员和成员函数;
4.public部分说明的数据成员或成员函数可被程序中的任何函数或语句调用;
a)成员函数
如下列例子
b)类的实例
对象是类的一个具体实现,被称为实例
类是抽象的概念,而对象是具体的,类只是一种数据类型,而对象是属于该类的一个变量
对象成员的表示方法分为通过对象访问成员和通过类指针访问成员两种形式,通过对象访问成员是哦那个运算符“.”来实现
3.复习一下this指针
1.this为C++保留字,它是一个指针,在任何一个类成员函数的运行过程中,指针this 总指向当前调用者对象;
2.“*this”来表示当前调用者对象;
3.“this->成员名”或“(*this).成员名”来表示当前调用者对象的某成员;
4.“return this”来返回该当前调用者对象的指针 (即地址);
5.“return *this”返回该当前调用者对象 (本身);
(3)再看构造函数和析构函数
构造函数和析构函数是一类特殊函数,由系统自动执行,在程序中不可显式地调用它们。
构造函数的作用(对象的初始化):
建立对象时,将对象的数据成员进行初始化
其特殊性除了由系统调用之外,还是一类同名函数,比如类的名称是X,那么构造函数的名称也是X,并且是没有返回值的,可以有多个参数,也可以不带参数
默认构造函数(对象的初始化)
1.cpp规定,每个类必须有构造函数
2.如果一个类没有定义任何构造函数,在需要时编译器将会为它生成一个无参的,函数体为空的默认构造函数
3.默认构造函数只是在形式上保证创建对象时必须有构造函数
4.一旦写了一个构造函数,系统就不再提供默认的构造函数
构造函数的特点:
1.构造函数与类同名;
2.构造函数没有返回类型;
3.构造函数由系统自动调用,不允许在程序中显示调用;
4.构造函数可以被重载,即一个类中可以定义多个参数或参数类型不同的构造函数;
举例:
无参构造函数(对象的初始化)
用class定义一个学生类,并在主函数中定义类的对象进行调用测试
有参构造函数(对象的初始化)
同样是用class定义一个学生类,并在主函数中定义类的对象进行调用测试
析构函数的作用(回收/撤销对象):
对象生命周期结束时回收对象,把分配出去的空间再给收回来
1.析构函数主要用于对象生命周期结束的时候回收对象;
2.与类同名,在其前面加上字符“~”;
3.没有返回值;
4.只有一个,无参,因为只是完成一些清理工作,因此不需要传参;
析构函数的特点(回收/撤销对象):
1.如果一个类没有定义任何析构函数,系统会为它生成一个默认析构函数;
2.对大多数类,默认析构函数能够满足要求;
3.只有在一个对象完成其操作之前需要做一些内部处理时,才显示的定义析构函数
承接上文的案例,将析构函数加入
将上文案例补充完整,可得下图完整代码
(4)Qt对象树实例
Qt 引入对象树的概念,在一定程度上解决了内存问题
下面看实例