好教程推荐系列:收录常见的Qt面试题

2023-05-16

Qt面试题:

1.connect几个类型的区别
2.自绘控件
3.Qt常用线程几种方式,数据竞争,加锁同步等等
4.Model-View-Delegate的理解
5.Qt的插件机制是怎么做的
6.信号槽机制是怎么实现的
7.对Qt事件循环的理解
8.Qt的事件分发是怎么做的
9.QMetaObject::invokeMethod

10.元对象系统,信号槽连接方式,事件分发拦截,继承QWidget样式自绘

11.GraphicsView会问一下,几个坐标系,还有怎么用Gpahicsview绘制一个五角星

12.qt实现发布订阅的设计方法

Qt-Pub-Sub: 基于Qt的发布订阅机制

Quick Event: 基于QT设计的一套控制与界面完全分离的代码模型

Qt实战7.轻量级发布订阅模式 - Qt小罗 - 博客园

13.通过c++11的std::bind及std::function实现类方法回调,模拟Qt实现信号槽

使用 C++11 编写类似 QT 的信号槽

https://github.com/chxuan/cpp-utils/tree/master/Connect

 Qt事件

1、事件循环一般用exec()函数开启。QApplicaion::exec()、QMessageBox::exec()都是事件循环。其中前者又被称为主事件循环。
事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出。从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。
2、事件循环是可以嵌套的,一层套一层,子层的事件循环执行exec()的时候,父层事件循环就处于中断状态;当子层事件循环跳出exec()后,父层事件循环才能继续循环下去。

Qt的事件处理有5中级别:
1.重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
2.重写QObject::event(),在事件到达事件处理函数时处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
3.给QObject对象安装事件过滤器:对象用installEventFilter()后,所有达到目标控件的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
4.给QApplication安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的事件都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理非活动状态控件的鼠标事件时这个方法也很常用。
5.继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器处理事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。
许多事件类型,包括鼠标,键盘事件,是能够传播的。如果事件在到达目标对象的途中或者由目标对象处理掉,事件处理的过程会重新开始,不同的是这时的目标对象是原目标对象的父控件。这样从父控件再到父控件,知道有控件处理这个事件或者到达了最顶级的那个控件。

C++面试题:

1. new malloc使用的区别
2. static的用途,区别
3. 智能指针相关的,有哪些,区别是什么
4. 多态的实现机制,虚函数表是怎样的
5. 多态有没有别的实现方案
6. 线程,竞争,同步(更偏向于标准库)
7. C++11都有哪些东西,用的咋样
8. 标准库里的容器常用哪些,区别是什么,实现原理
9. 析构函数、构造函数能不能虚拟的,为什么
10. 右值引用了解多少,怎么用
11. 模板用的怎么样,会不会写

12.C++可能会问智能指针/虚函数/面向对象之类的吧?
13.C++可能会问内存模型,线程安全,高速缓存

14.写个单例模式

15.写个斐波那契数列

int Fib(int n)
{
    if (n == 1 || n == 2)
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);
}

16.卷数据结构和算法

(1)编码实现字符串转化为数字,例如“24145”-->24145

(2)单链表逆序

(3)冒泡排序,快速排序

2.C++-选择排序、冒泡排序、插入排序、希尔排序、归并排序、快速排序_诺谦的博客-CSDN博客

https://github.com/huihut/interview

其他:

A

1. null指针调用某个类的方法,会怎样
2. 大小端的是什么意思
3. 结构体、类成员的字节对齐
4. 大小端相关的强制类型转换访问问题
5. 类继承问题,B继承A,B什么都没有新增,能不能互相强制转换
6. 私有成员如何访问,除了friend这些
7. 网络传输,json太臃肿,怎么提速。(猜还是直接内存字节传输,约定大小端这种)
8. 多线程、进程、网络,实际去抽象应该要解决一个什么问题(猜是同步,面试官没说)
9. 提了项目的多进程通信用的管道没用socket,说代理问题,但是面试官比较怀疑会有代理问题

B

1、const、static作用。
2、c++面向对象三大特征及对他们的理解,引出多态实现原理、动态绑定、菱形继承。
3、虚析构的必要性,引出内存泄漏,虚函数和普通成员函数的储存位置,虚函数表、虚函数表指针。
4、malloc、free和new、delete区别,引出malloc申请大内存、malloc申请空间失败怎么办。
5、stl熟悉吗,vector、map、list、hashMap,vector底层,map引出红黑树。优先队列用过吗,使用的场景。无锁队列听说过吗,原理是什么(比较并交换)
6、实现擅长的排序,说出原理(快排、堆排)
7、四种cast,智能指针。static_cast, const_cast, reinterpret_cast, dynamic_cast。
8、tcp和udp区别
9、进程和线程区别。
10、指针和引用作用以及区别。
11、c++11用过哪些特性,auto作为返回值和模板一起怎么用,函数指针能和auto混用吗。
12、boost用过哪些类,thread、asio、signal、bind、function
13、单例、工厂模式、代理、适配器、模板,使用场景。
14、QT信号槽实现机制,QT内存管理,MFC消息机制。
15、进程间通信。会选一个详细问。
16、多线程,锁和信号量,互斥和同步。
17、动态库和静态库的区别。

18、c++一般情况下复制对象,都要考虑深拷贝,比如char *成员要申请空间,并拷贝源对象的内存。假设函数返回的临时对象,不可避免有一次拷贝,但实际临时对象会立刻释放掉,此时直接将管理的资源交给新对象即可,不需要重新申请。可以写拷贝构造函数,也可以借助c++11移动构造函数move。

C

1、统计字符串中出现次数最多的字母并输出

2、上亿行数据的查询 c++

3、C++查找文本中出现最频繁的10个单词

D

1、map和unordered_map区别及其优缺点

map和unordered_map区别及其优缺点 - 己平事 - 博客园

2、map和unordered_map的key可以是什么数据类型?能否是c++类?

C++ map的键类型可以是一个类,比如键类型可以是C++标准库中的string类,
但是对作为键的类有一个约束,那就是这个类必须定义小于操作符,也就是要重载小于运算操作符。
C++标准库的string类就定义了小于操作符。

3、map和multimap的区别

map支持唯一键值,每个键只能出现一次;而multimap中相同键可以出现多次。multimap不支持[]操作符。

4、c++11 share指针,shared_ptr,什么时候引用计数-1?是否一定是内存安全?

当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它。

主动释放对象
shared_ptrr<int> up1(new int(10));
up1 = nullptr ;//int(10) 的引用计数减1,计数归零内存释放 
或up1 = NULL; //作用同上

重置
up.reset() ;    //将p重置为空指针,所管理对象引用计数 减1
up.reset(p1);   //将p重置为p1(的值),p 管控的对象计数减1,p接管对p1指针的管控
up.reset(p1,d);  //将p重置为p(的值),p 管控的对象计数减1并使用d作为删除器

交换
std::swap(p1,p2); //交换p1 和p2 管理的对象,原对象的引用计数不变
p1.swap(p2);    //同上

5、c++11的泛型,有哪些了解?

6、c++联合体,哪些数据类型可以?类行不行?

class Hello
{
    Hello()
    {
        std::cout << "hello" << std::endl;
    }

    ~Hello()
    {
    }
};

class World
{
    World()
    {
        std::cout << "world" << std::endl;
    }

    ~World()
    {
    }
};

//共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。
//Union的一大特征在于,一个Union类中的所有数据共享同一段内存。
//如果union类的成员包含自己的构造函数,析构函数,那么同一Union类的成员在初始化时,就有可能会执行不同的构造函数。
//这是无法预料的。所以,我们在定义Union类时要尽量避免成员变量是对象(含有自己的构造函数)
union MyUnion
{
    int iA;
    double dA;
    char cA;
    Hello j;
    World r;
    std::string strChar;
};

7、vector和list的迭代器怎么设计和实现?vector中迭代器的实现

C++四种类型转换

转换类型操作符    作用
const_cast    去掉类型的const或volatile属性
static_cast    无条件转换,静态类型转换
dynamic_cast    有条件转换,动态类型转换,运行时检查类型安全(转换失败返回NULL)
reinterpret_cast    仅重新解释类型,但没有进行二进制的转换

dynamic_cast

//有条件转换,动态类型转换

//1) 安全的基类和子类之间的转换

//2) 必须有虚函数

//3) 相同基类不同子类之间的交叉转换,但结果返回NULL

reinterpret_cast

//仅重新解释类型,但没有进行二进制的转换:
//1) 转换的类型必须是一个指针、应用、算数类型、函数指针或者成员指针
//2) 在比特级别上进行转换,可以把一个指针转换成一个整数,也可以把一个整数
         //转换成一个指针,(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,
         //还可以得到原先的指针值)。但不能将非32bit的实例转成指针
//3) 最普通的用途就是在函数指针类型之间进行转换。
//4) 很难保证移植性

总结

去const属性用const_cast

基本类型转换用static_cast

多态类之间的类型转换用dynamic_cast

不同类型的指针类型转换用reinterpret_cast

C++单例

单例模式为什么双重校验锁? 

双重校验锁第一次进行判空原因:当程序顺序执行的时候,如果不进行判空,每一个线程都会先去获得当前类的类锁,而其他线程都进入阻塞状态。单例模式中初始化单例的程序只会执行一次,大部分情况下会直接到return语句返回,如果都阻塞在获取锁的位置,会大大降低程序的运行速度。

双重校验锁第二次进行判空原因:假设有两个线程A和B,都进行完第一次判空了,A和B都阻塞在此。这个时候A线程获取了类锁,然后B线程被阻塞,A线程新建了一个实例后释放了锁,B线程获取锁,又新建了一个实例,这破坏了单例设计模式的初衷。 

#include <iostream>
#include <memory>
#include <mutex>

class Singleton {
public:
    static Singleton& GetInstance() {
        static std::once_flag s_flag;
        std::call_once(s_flag, [&]() {
            instance_.reset(new Singleton);
        });

        return *instance_;
    }

    ~Singleton() = default;

    void PrintAddress() const {
        std::cout << this << std::endl;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() = default;

private:
    static std::unique_ptr<Singleton> instance_;
};

std::unique_ptr<Singleton> Singleton::instance_;

int main() {
    Singleton& s1 = Singleton::GetInstance();
    s1.PrintAddress();
    Singleton& s2 = Singleton::GetInstance();
    s2.PrintAddress();
    return 0;
}

构造函数能否为虚函数?

构造函数不能是虚函数,因为虚函数是基于对象的,构造函数是用来产生对象的,若构造函数是虚函数,则需要对象来调用,但是此时构造函数没有执行,就没有对象存在,产生矛盾,所以构造函数不能是虚函数。

从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的。问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

技术分享

1、C++软件异常排查从入门到精通系列汇总
http://t.csdn.cn/7JVfo
2、C++软件异常的常见原因分析与总结(实战经验分享)
http://t.csdn.cn/cq35E
3、排查C++软件异常的常见思路与方法(实战经验总结)
http://t.csdn.cn/VMCz7
4、Visual Studio高效调试手段与技巧总结(经验分享)
http://t.csdn.cn/C00bO
5、分析C++软件异常需要掌握的汇编知识汇总
http://t.csdn.cn/OxTDs
6、Windows和Linux下排查C++软件异常的常用调试器与内存检测工具详细介绍
http://t.csdn.cn/sXDx1
7、内存越界一定会导致程序崩溃吗?详解内存越界
http://t.csdn.cn/mGphU

如何找合适的C++项目给自己的简历加分

https://www.zhihu.com/question/280881677/answer/2604431959

重点关注张小方的回复

更多关于Qt的面试题,请下载资源汇总:

https://download.csdn.net/download/libaineu2004/86338415

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

好教程推荐系列:收录常见的Qt面试题 的相关文章

  • bootloader开发阶段总结以及可能会碰到的问题

    到今天 xff0c vivi源代码基本分析完毕 对bootloader有了更深层的认识 在此期间 xff0c 仔细阅读了毛德操 胡希明先生编著的 嵌入式系统 采用公开源代码和StrongARM XScale处理器 第七章 xff1a 嵌入式
  • 用模式一实现用户登录功能

    login jsp为显示登录表单和处理登录请求的页面 xff0c 登录成功后跳转到logonSuccess jsp页面 xff0c 登录失败时重新显示登录表单和失败的帮助信息 xff0c 以便用户重新登录 xff1b 如果已登录用户再次访问
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序
  • jni中使用extern "C"的原因

    首先 cplusplus这个宏是微软自定义宏 xff0c 大小是个整数 xff1a cplusplus This macro is defined when the C 43 43 compiler is in use You can us
  • VmWare虚拟机设置ubuntu和windows之间的共享文件夹

    一般在进行编程作业的时候 xff0c 我们会采用 开发在Windows中编辑源代码 xff0c 在linux中编译 执行源代码 这往往需要需要将在Windows下编辑好的源代码上传到linux系统种进行编译 怎么来进行上传呢 xff1f 其
  • C++的最后一道坎|百万年薪的程序员

    导语 C 43 43 的起源可以追溯到 40 年前 xff0c 但它仍然是当今使用最广泛的编程语言之一 xff0c C 43 43 发明人Bjarne Stroustrup 一开始没想到 C 43 43 会获得如此大的成功 xff0c 他说
  • Modbus 协议

    1 主站 xff1a 可以进行读写操作 从站 xff1a 只能被动响应主站操作 2 一个 Modbus 网络只有一个主站 xff0c 可以多个从站 xff08 主站不用连在两端 xff09 485 通讯 1 接线 最多 254 个站 xff
  • 数据结构对齐

    xfeff xfeff 对齐的算法 xff1a 由于各个平台和编译器的不同 xff0c 现以本人使用的gcc version 3 2 2编译器 xff08 32位x86平台 xff09 为例子 xff0c 来讨论编译器对struct数据结构
  • 关于示波器测485串口波特率的使用方法总结

    之前没有用过示波器 xff0c 更不知道怎么来测试串口的波特率 xff0c 结果遇到一客户说我们产品的波特率达不到9600 xff0c 只有9100 xff0c 为了验证这一说法 xff0c 我们只能自己测试一下 说明 xff1a 产品通过
  • C语言对寄存器封装

    一 封装外设 用C语言代码把外设地址映射用宏定义封装 span class hljs comment 外设基地址 span span class hljs preprocessor define PERIPH BASE unsigned i
  • JavaJDK下载安装与环境配置(Windows 10 超详细的图文版教程 )

    前言 xff1a 对于很多初学者来说 xff0c 我想可能很多人都会遇到JDK环境变量的配置问题 明明就是按照度娘上的教程去一步步配置的 xff0c 但还是会有很多的人出现配置不成功的问题 所以今天在这里分享一下windows 10 系统下
  • win32 获取窗口句柄的方法

    第一种方法是根据窗口句柄值获取窗口句柄 使用spy 43 43 获取指定窗口的窗口句柄值 xff0c 因为句柄值是16进制数 xff0c 所以前面加0x 然后进行强制转换为HWND类型 HWND hWnd 61 HWND 0x0028072
  • 当设置display:inline;时li的宽度无效的解决方法

    若制作导航栏时 xff0c 使用列表li 的定义时 xff0c 若想加上一个背景图 xff0c 这时候若定义li的一个属性为 li display inline width 83px height 30px xff0c 则浏览器会无视后面的
  • js文本框或者按钮鼠标悬停提示说明文字

    html页面中很多元素会用到文本提示 xff0c 当鼠标悬停之后显示一段说明文字 显示说明性文字 function tips id str t 61 getTop document getElementById id document ge
  • localstorage兼容ie8以下浏览器的问题

    最近在做一个网站 xff0c 由于希望尽可能减小服务器的压力 xff0c 也想提高网站的运转速度 xff0c 就想尽可能少的在服务器上读写数据以及下载重复数据 xff0c 需要重复使用的数据 xff0c 就储存在本地 xff0c 能在本地进
  • HTTP请求返回状态码中301与302的状态码区别

    一 xff0e 官方说法 301 xff0c 302 都是HTTP状态的编码 xff0c 都代表着某个URL发生了转移 xff0c 不同之处在于 xff1a 301 redirect 301 代表永久性转移 Permanently Move
  • java防止 csrf 攻击 --- 采用 spring .

    CSRF xff08 Cross site request forgery xff09 xff0c 中文名称 xff1a 跨站请求伪造 xff0c 也被称为 xff1a one click attack session riding xff
  • Gson解析数组多类型元素

    why used gson Gson is a Java library that can be used to convert Java Objects into their JSON representation It can also
  • js中获取时间new Date()详细介绍

    1 var myDate 61 new Date Date 返回当日的日期和时间 getDate 从 Date 对象返回一个月中的某一天 1 31 getDay 从 Date 对象返回一周中的某一天 0 6 getMonth 从 Date
  • 如何让一个行内元素(如一张图片)在div中居中

    xff08 1 xff09 第一种 xff1a 用vertical align lt div class 61 34 method1 34 gt lt span class 61 34 tiptop 34 gt lt span gt lt

随机推荐

  • 释放webpack tree-shaking潜力之webpack-deep-scope-analysis-plugin

    在上周末广州举办的 feday 中 webpack 的核心开发者 Sean 在介绍 webpack 插件系统原理时 隆重介绍了一个中国学生于 Google 夏令营 在导师 Tobias 带领下写的一个 webpack 插件 https gi
  • iframe跨域通信的通用解决方案

    此方案已有新版本 请查看 iframe跨域通信的通用解决方案 第二弹 xff08 终极解决方案 xff09 本文章可做技术学习供继续交流 一 背景 在这个Web页面越来越丰富的时代 xff0c 页面通过iframe嵌入其他的页面也越来越常见
  • C++实现轻量级RPC分布式网络通信框架

    前言 xff1a 2022 4 14更新 xff1a 在我重新回顾这篇文章的时候 xff0c 我觉得里面内容有点乱 xff0c 主要还是因为RPC里面涉及到很多概念和知识点 本来代码内容就已经挺抽象了 xff0c 还要结合各种概念 xff0
  • 浅谈JavaScript设计模式

    创建型模式 xff1a 该模式处理的是用于创建对象的各种机制 工厂方法抽象工厂建造者原型单例 结构型模式 xff1a 考虑的是对象的组成以及对象彼此之间的关系 适配器桥接组合装饰器外观享元代理 行为型模式 xff1a 关注的是对象之间的依赖
  • Ardupilot-SITL仿真模拟调试

    1 配置SITL仿真调试 span class token punctuation span span class token operator span waf configure span class token operator sp
  • PX4——Range Finder 篇

    Range Finder 此处选用的是 Benewake 下的 Lidar 参数设置 General Configuration 除了官方的参数设置外 xff0c 我在 EKF2 中还找到了 EKF2 RNG AID 参数 xff0c 用来
  • STM32 时钟 定时器基础

    STM32 Clock Tree 时钟源 HSI xff1a xff08 High Speed Internal xff09 内部的 RC 震荡电路产生时钟信号 HSE xff1a xff08 High Speed External xff
  • Albumentation

    文章目录 AlbumentationClassificationSegmentationDetectionKeyPoints Augmentation Albumentation 所有实现的变换 变换以及支持的类型 此处 Classific
  • Pytorch 分布式训练

    文章目录 分布式训练OverviewDP or DDPDPDDP TCP 初始化Moco TCP 初始化例子 ENV 初始化可选后端进程间通信操作Template 区分概念 xff1a Machine vs Device 多机 Machin
  • FLANN C++ 使用

    FLANN FLANN 库 xff0c 包含 KNN 算法 众多工程 xff08 例如 OpenCV xff09 使用了 FLANN xff0c 这里单独介绍这个库 xff0c 方便以后单独使用 由官方 Latex 编译的文档链接 xff0
  • HDF5 C++ 使用

    HDF5 简介 HDF5 可以用来存储异构数据对象 xff0c 包括图片 xff0c 表 xff0c 图 xff0c 甚至 PDF 和 Excel HDF5 中的数据存储在不同组 Group 中 xff0c 类似于 Linux 文件树结构
  • Pandoc 使用

    文章目录 PandocInstallationLatex 到 Word命令详解 Pandoc Installation MacOS brew span class token function install span pandoc Lat
  • Docker -- DockerFile 讲解

    文章目录 DockerFile 指令讲解FROMCOPY 写在开头 xff1a 实验室给的电脑只能装 20 04 然后跑仿真需要在 18 04 20 04 的 Gazebo 居然不能支持 xff01 要是有人知道如何在 20 04 中使用
  • MySQL介绍及CRUD操作。

    目录 一 基本介绍 1 数据库结构 2 数据库增删改查 二 增删改查语句 1 insert 添加数据 2 update 修改操作 3 delete 删除操作 4 select 查询操作 5 加密和系统函数 6 流程控制函数 三 表的增删改查
  • Docker 容器

    文章目录 容器图形界面XserverVNC 容器 图形界面 Xserver 采用 ROS 官网的教程 这里相当于是将容器的图形信息发送给宿主的 Xserver 然后显示在你的电脑屏幕上 首先需要打开主机 Xserver 权限 xff1a x
  • C++ -- OpenMP 笔记

    64 toc OMP CMake Setup set CMAKE CXX STANDARD 14 set CMAKE CXX STANDARD REQUIRED ON find package OpenMP REQUIRED Set Fla
  • 转载:亚像素数值极值检测算法总结

    动机 在计算机视觉领域 xff0c 经常需要检测极值位置 xff0c 比如SIFT关键点检测 模板匹配获得最大响应位置 统计直方图峰值位置 边缘检测等等 xff0c 有时只需要像素精度就可以 xff0c 有时则需要亚像素精度 本文尝试总结几
  • C++动态库*.dll文件的Debug/Release版本是否可以混用(交叉用)?

    1 现象 xff1a 使用一些第三方的dll xff0c 比如opencv xff0c 会分别生成debug和release的dll xff0c 在exe中必须要引用指定版本的dll xff0c 不能混用 xff0c 否则会出错 xff1b
  • EditPlus编辑器选中列的方法

    1 主菜单 xff1a 编辑 gt 选择 gt 按列选择 2 先按下 Alt 43 C xff0c 释放 xff0c 然后移动鼠标或键盘上下左右键进行选择
  • 好教程推荐系列:收录常见的Qt面试题

    Qt面试题 xff1a 1 connect几个类型的区别 2 自绘控件 3 Qt常用线程几种方式 xff0c 数据竞争 xff0c 加锁同步等等 4 Model View Delegate的理解 5 Qt的插件机制是怎么做的 6 信号槽机制