程序员PyQt

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

2019-03-03  本文已影响26人  223480235e8e

今天我们来看看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++,在以后的分享中,小豆君会详细介绍每个特性。

许多Qt特性都是通过标准C++技术实现的,基于QObject的继承。所以想要使用Qt的这些特性,必须继承QObject,并且加入宏Q_OBJECT。所以,如果你是使用Qt编程,强烈推荐这样的声明方法。

class Student: public QObject
{
    Q_OBJECT
public:
    Student(){}
};

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

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

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

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

最后也希望大家多多支持小豆君的创作,关注小豆君的公众号“小豆君Qt分享”,最新文章都会在公众号第一时间发布,或者你有不懂的问题,关注公众号后,可加好友或进Qt群获得答案。

上一篇下一篇

猜你喜欢

热点阅读