美文网首页程序员PyQt
更高级的C++,Qt对象模型

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

作者: 223480235e8e | 来源:发表于2019-03-03 12:00 被阅读26次

    今天我们来看看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群获得答案。

    相关文章

      网友评论

        本文标题:更高级的C++,Qt对象模型

        本文链接:https://www.haomeiwen.com/subject/cpegjqtx.html