今天我们来看看Qt的对象模型,但在讲述之前,先来看看C++对象模型。
1 C++对象模型
学习过C语言的同学都知道,在C语言中,数据和函数是分开的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。
而在C++中,通过类的概念,将数据与函数相关联,数据称之为属性,函数称之为方法(接口)。
方法提供了访问属性的接口。
将数据与接口关联起来的过程,我们称之为封装。在封装的过程中,我们将该类所能够提供的服务或者说是接口,对外声明为public,将本身的属性声明为private。
计算机本身是不支持什么公有私有之说,它只认识0和1,而这些特性都是由编译器来控制完成的。那么,想要编译器支持public,private等声明,那就需要建立一个有效的模型概念,我们则称之为对象模型。
对象模型主要做两方面的事情,一个是直接支持面向对象程序设计,一个是支持各种的底层实现。
如果再有面试官问你C++和C语言的区别,就没必要直接扯封装,继承,多态,你完全可以从编译器的对象模型来分析概述这些特性,面试官必然是对你刮目相看,也可使你在众多面试者中脱颖而出。
2 简单对象模型
下面小豆君介绍一个简单对象模型
先定义一个学生类:
class Student
{
public:
Student();
~Student();
int getAge();
private:
int age;
};
下图是简单对象模型原理:
image在stu这个实例中,所有成员并不存放在stu内,stu内存放的是每个成员的地址,因为地址的大小固定,所以可以通过索引值来找到这个地址,然后通过该地址访问到stu中的真正成员。例如,可以通过stu的首地址+4,找到成员变量int Student::age的地址,然后访问它。
如果想深入了解这方面知识,推荐研读《深度探索C++对象模型》,作者是参加设计了第一套C++编译器cfront的Lippman,书比较难懂,初学者不推荐,你只需要知道C++的这些特性是通过编译器对象模型支持实现的就可以了,C++的名字较之C多了个++,也是表明它在C的基础上更进一步。
3 Qt对象模型
如果说C++的对象模型是在C的基础上更进一步,那么Qt的对象模型就是在C++的基础上更进一步。下面的列表便是Qt中的独有特性,它能够帮助你更灵活舒服的使用C++,在以后的分享中,小豆君会详细介绍每个特性。
-
信号和槽,一个非常强大的机制,用于无缝的对象通信。
-
可查询和可设计的对象属性系统,支持静态和动态两种模式,动态属性相当于在程序运行过程中,临时为你的类添加一个成员变量。
-
强大的事件机制和事件过滤器。
-
国际化的上下文字符串翻译。
-
复杂的间隔驱动计时器,使它能够在事件驱动的GUI中优雅地集成许多任务。
-
层次结构和可查询对象树以一种自然的方式组织对象所有权,利用这个特性在很大程度上可以解决C++程序员对于指针释放的困惑。
-
守护指针(QPointer),当被引用的对象被销毁时,它会自动设置为0,不像普通的c++指针,当对象被销毁时,它会变成悬空指针。
许多Qt特性都是通过标准C++技术实现的,基于QObject的继承。所以想要使用Qt的这些特性,必须继承QObject,并且加入宏Q_OBJECT。所以,如果你是使用Qt编程,强烈推荐这样的声明方法。
class Student: public QObject
{
Q_OBJECT
public:
Student(){}
};
其他的,如对象通信机制和动态属性系统,需要由Qt自己的元对象编译器(moc)提供的元对象系统。
元对象系统是一个C++扩展,使语言更适合于真正的组件GUI编程。
想要加入C++/Qt交流群的小伙伴,可以在控制台输入“我要加群”,按照提示入群。
这次的分享就到这儿了,我们下次见。
最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。
网友评论