【C/C++】 面试 7


93.Qt元对象

元对象(meta object)意思是描述另一个对象结构的对象,比如获得一个对象有多少成员函数,有哪些属性。在Qt中,我们将要用到的是QMetaObject这个类。

元对象系统基于以下3点:

以QObject作为基类
类声明的私有区域中,Q_Object宏指令使我们能够使用元对象的特性,比如动态属性、信号、槽等
元对象编译器(Meta-Object Compiler moc)为QObject子类生成具有元对象特性的代码
我们可以通过QObject类的一个成员函数获得该类的元对象:

QMetaObject *QObject::metaObject() const
qobject_cast 和 QObject::inherits()

94.Qt内存回收机制
    QObject 以对象树的形式组织起来。当为一个对象创建子对象时,子对象会自动地添加到父对象的children()列表中。父对象拥有子对象的所有权,比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findChildren()通过名字和类型查询孩子对象。

    对象所有权(Object Ownership):在Qt中,每个QObject对象都可以有一个父对象。当父对象被删除时,
    所有的子对象也会被自动删除
    这种机制简化了内存管理的工作,因为程序员不需要手动删除所有的对象。
    这种父-子关系在构造函数中通过传递一个指向父对象的指针来建立。

    智能指针(Smart Pointers):Qt提供了QSharedPointer、QWeakPointer、QScopedPointer等智能指针类,用于自动管理内存。
    智能指针在某种程度上可以看作是一个计数器,当没有任何指针指向对象时,智能指针会自动删除对象,从而防止内存泄漏。

    深拷贝与浅拷贝(Deep Copy and Shallow Copy):Qt的数据类如QString、QList、QMap等都使用了隐式共享
    (Implicit Sharing)或称为写时复制(Copy-On-Write)的技术。这种技术可以避免不必要的数据拷贝,提高程序的性能。

    多线程内存管理(Multithreading Memory Management):在多线程环境中,内存管理需要更加小心。
    Qt提供了一些机制,如信号与槽(Signals and Slots)等,来帮助在多线程环境中正确地管理内存。

95.类型转换失败报错
    在C++中,“无效的类型转换”错误是开发者经常遇到的编译错误之一
    error: static_cast from type ‘const void*’ to type ‘const int**’ casts away qualifiers
    从“const void*”类型到“const int**”类型的static_cast强制转换限定符

96.构造函数能不能是虚函数
    不可以
    因为对象中的虚函数表是在构造函数初始化列表阶段才初始化的
    编译报错:constructors cannot be declared ‘virtual’

    养成习惯:基类的析构一定virtual。满足多态的条件:跟对象有关,调用的对象是谁,调用的就是谁的虚函数。
97.h264和aac
    H264编码原理:
    l  数据冗余。例如如空间冗余、时间冗余、结构冗余、信息熵冗余等,即图像的各像素之间存在着很强的相关性。消除这些冗余并不会导致信息损失,属于无损压缩。
    视觉冗余。人眼的一些特性比如亮度辨别阈值,视觉阈值,对亮度和色度的敏感度不同,使得在编码的时候引入适量的误差,也不会被察觉出来。可以利用人眼的视觉特性,以一定的客观失真换取数据压缩。这种压缩属于有损压缩。
    数字视频信号的压缩正是基于上述两种条件,使得视频数据量得以极大的压缩,有利于传输和存储。一般的数字视频压缩编码方法都是混合编码,即将变换编码,运动估计和运动补偿,以及熵编码三种方式相结合来进行压缩编码。通常使用变换编码来消去除图像的帧内冗余,用运动估计和运动补偿来去除图像的帧间冗余,用熵编码来进一步提高压缩的效率。

    RTMP 提供与不同摄取设备的兼容性和低延迟流媒体的稳定性,但是,您需要一个特定的 Flash Media Server 来使用 RTMP 分发您的内容,
    所以RTMP 适用于主要的第三方流应用程序和较旧的硬件编码器;
    RTSP 最适用于 IP 摄像机和运行 IP 摄像机的设备,例如无人机。

98.7zip和zip都是无损压缩
LzmaCompress、LzmaUncompress

99.Qt事件

QT将系统产生的消息转化为QT事件,QT事件被封装为对象,所有的QT事件均继承抽象类QEvent,用于描述程序内部或外部发生的动作,任意的QObject对象都具备处理QT事件的能力。
操作系统将获取的事件,比如鼠标按键,键盘按键等keyPressEvent,keyReleaseEvent,mousePressEvent,mouseReleaseEvent事件, 
放入系统的消息队列中,Qt事件循环的时候读取消息队列中的消息,转化为QEvent并被分发到相应的QWidget对象,相应的QWidget中的event(QEvent *)进行事件处理会对事件进行处理,
event(QEvent *)会根据事件类型调用不同的事件处理函数,在事件处理函数中发送QT预定义的信号,最终调用信号关联的槽函数。
从硬件层来看,事件就是一个中断,事件发送,不一定马上执行,取决于cpu的响应
事件产生信号,信号触发槽函数
事件通知 QApplication bool notify  QObject *recviver
事件过滤 bool eventFilter QObject *watched
事件分发 event(QEvent*e)  accept()  igno()

100.Qt程序打包
使用windeployqt 构建QT执行文件依赖库
nisedit脚本打包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值