专栏首页编程更高级的C+,Qt对象模型

更高级的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交流群的小伙伴,可以在控制台输入“我要加群”,按照提示入群。

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

本文来自企鹅号 - 跟小豆君学Qt媒体

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java后台编程初学者,这些常识你都知道吗?

    Java编程中的一些常识,希望有心学习的可以多看一眼,如果你是高手欢迎指点文中小编的不足,感谢支持。以下这些编程常识均由小编结合个人水平以及搜寻相关资料整理编辑...

    企鹅号小编
  • 用编程语言参加战争,谁会是最强武器?

    自从计算机问世,各种编程语言也随之诞生,作为程序猿,Java、Python和C++是必学的三种编程语言,但有时难免疑惑:这三种语言究竟孰优孰劣? 那么不妨读一读...

    企鹅号小编
  • 机器人来“抢工作”了,瑞典人为何能淡定处之

    在世界上大部分地方的人都越来越担心未来机器人和自动化可能带来失业潮之际,瑞典人却异常淡定。 根据欧盟委员会今年的一项调查,有80%的瑞典人对机器人和人工智能表达...

    企鹅号小编
  • Struts2声明式验证

    声明式验证步骤 一 、编写Action类 package com.tg.action; import com.opensymphony.xwork2.Acti...

    汤高
  • java学习与应用(4.2)--JavaScript、bootstrap

    JavaScript,弱类型脚本语言,增强交互和用户体验提高效率等。JavaScript=ECMAScript+JavaScript特有的内容(BOM对象+DO...

    嘘、小点声
  • 小甲陪你一起看Ceph (OSDC | 上篇)

    小甲师兄有个喜好——喜欢下雨:每逢下雨天,不是诗兴大发,就是代码撸的飞起。再加上最近在优化rbd,小甲把之前分析的OSDC代码分享给大家

    腾讯云TStack
  • 设计模式之原型模式

    爱撒谎的男孩
  • 第185天:百度星座案例

    半指温柔乐
  • (2019)[前端]面试题[6]:水平垂直居中方法

    如果已知子元素宽高度,那么transform: translate(width/2,height/2);一样的效果。

    无道
  • “梦想工厂”Google X里的那些超酷项目

    美国很多牛逼公司都有自己的秘密实验室,此前最著名的是美国电话电报公司(AT Labs)、施乐帕克研究中心(Xerox PARC)。但现在最受万众期待的肯定是Go...

    机器人网

扫码关注云+社区

领取腾讯云代金券