更高级的C+,Qt对象模型

时间:2022-04-24
本文章向大家介绍更高级的C+,Qt对象模型,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天我们来看看Qt的对象模型,但在讲述之前,先来看看C++对象模型。

1 C++对象模型

学习过C语言的同学都知道,在C语言中,数据和函数是分开的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。而在C++中,通过类的概念,将数据与函数相关联,数据称之为属性,函数称之为方法(接口)。方法提供了访问属性的接口。

将数据与接口关联起来的过程,我们称之为封装。在封装的过程中,我们将该类所能够提供的服务或者说是接口,对外声明为public,将本身的属性声明为private。

计算机本身是不支持什么公有私有之说,它只认识0和1,而这些特性都是由编译器来控制完成的。那么,想要编译器支持public,private等声明,那就需要建立一个有效的模型概念,我们则称之为对象模型。

对象模型主要做两方面的事情,一个是直接支持面向对象程序设计,一个是支持各种的底层实现。

如果再有面试官问你C++和C语言的区别,就没必要直接扯封装,继承,多态,你完全可以从编译器的对象模型来分析概述这些特性,面试官必然是对你刮目相看,也可使你在众多面试者中脱颖而出。

2 简单对象模型

下面小豆君介绍一个简单对象模型

先定义一个学生类:

classStudent

{

public:

Student();

~Student();

intgetAge();

private:

intage;

};

下图是简单对象模型原理:

在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编程,强烈推荐这样的声明方法。

classStudent:publicQObject

{

Q_OBJECT

public:

Student(){}

};

其他的,如对象通信机制和动态属性系统,需要由Qt自己的元对象编译器(moc)提供的元对象系统。

元对象系统是一个C++扩展,使语言更适合于真正的组件GUI编程。

想要加入C++/Qt交流群的小伙伴,可以在控制台输入“我要加群”,按照提示入群。

这次的分享就到这儿了,我们下次见。