全部都是实际面试中被问到的
重点
智能指针的几种类型,分别的作用和场景
类型:
1 | C++中的智能指针主要是为了解决原始指针可能导致的内存泄漏和悬挂指针问题,通过封装和自动管理动态分配的内存来提高代码的安全性和可靠性。以下是几种常见的智能指针类型及其作用: |
场景:
1 | //unique_ptr: 想象一下你正在编写一个简单的游戏,游戏中每个玩家都有一个独一无二的武器 |
1 | //shared_ptr: 考虑一个文档编辑软件,其中多个标签页可以打开并共享同一个文档。 |
智能指针的常用接口
1 | `unique_ptr` 和 `shared_ptr` 是 C++ 中两种常用的智能指针,它们都用于自动管理动态分配的内存,但各自有不同的特性和接口设计来满足不同的使用场景。 |
shared_ptr内部的引用计数,怎么实现的
1 | `shared_ptr` 的内部引用计数机制是通过一个称为“控制块”(control block)的数据结构来实现的,这个控制块通常包含以下几个关键部分: |
shared_ptr:我拿一个裸指针指向这个对像,其他已经指向这个对象的共享指针能知道吗
1 | 当你使用裸指针指向一个由 `shared_ptr` 管理的对象时,这个裸指针操作本身并不会直接影响到原有的 `shared_ptr` 对象。换句话说,通过裸指针访问该对象,并不会让 `shared_ptr` 自动感知到这一行为,也不会改变 `shared_ptr` 内部的引用计数。 |
指针和引用的区别
1 | 指针和引用是C++中两种重要的概念,它们都允许你间接访问内存中的数据,但它们之间存在一些根本性的差异: |
为什么要用指针,用static变量/普通成员变量可以吗
1 | 指针之所以在C++中被广泛使用,是因为它们提供了一些独特的能力,是静态变量(static variables)和普通成员变量所不具备的。以下是使用指针的一些主要原因: |
父类和派生类的构造顺序
1 | 在C++中,当创建一个派生类对象时,构造函数的调用顺序遵循以下规则: |
构造函数和析构函数能是虚函数吗,如果反着来会有什么问题
1 | 在C++中,构造函数不能是虚函数,而析构函数可以是虚函数,但不是必须的。 |
虚函数底层原理
1 | C++中虚函数的底层原理基于两个核心概念:虚函数表(Virtual Table,简称vtable)和虚指针(Virtual Pointer,简称vptr)。下面是对这个机制的详细解析: |
虚表指针和虚表什么时候创建的
1 | 在C++中,虚表指针(vptr)和虚表的创建时机如下: |
你认为在多线程编程中最重要的东西?互斥锁和信号量的区别?
1 | 多线程编程中最重要的几个要素包括: |
进程与线程的区别
1 | 进程与线程是现代操作系统中实现并发执行和资源管理的两个基本概念,它们有以下几方面的区别: |
从操作系统的角度解释线程比进程切换的快的原因
1 | 从操作系统的角度来看,线程比进程切换更快的原因主要在于线程共享地址空间和减少了上下文切换时需要保存和恢复的信息量。下面是详细解释: |
死锁问题
1 | 死锁是指在多线程或多进程的并发系统中,两个或多个进程(或线程)因为互相等待对方占有的资源而永久阻塞的状态,导致这些进程都无法继续执行下去。死锁发生的必要条件通常包括: |
动态库和静态库的区别
1 | 动态库和静态库是程序开发中用于代码复用的两种不同类型的库文件,它们在链接方式、运行时行为、资源占用、更新维护等方面有着显著的区别: |
qt的事件循环讲一下
1 | Qt的事件循环是其框架内用于处理各种用户交互和系统事件的核心机制。它基于事件驱动编程模型,允许应用程序响应如鼠标点击、键盘输入、窗口调整大小、定时器触发等多种事件,而不是按照固定的线性流程执行。 |
qt的消息机制和windows的消息机制有什么关联吗
1 | Qt的消息机制和Windows的消息机制虽然服务于相似的目的——即实现应用程序的事件驱动编程,但它们在实现细节和设计理念上有所不同,同时又存在着紧密的关联,特别是在Qt应用于Windows平台时。 |
Qt架构相较于C++标准库有哪些不同吗,多了哪些东西,有哪些优势
1 | Qt架构与C++标准库(STL)之间有一些本质上的不同,主要体现在目标、功能范围和提供的特性上。以下是它们之间的一些关键区别以及Qt所增添的优势: |
qt的信号槽底层原理
1 | Qt的信号槽(Signals and Slots)机制是其框架中一个核心且强大的特性,允许对象之间进行解耦通信。其底层原理涉及以下几个关键技术组件和步骤: |
qt的信号槽connect函数的参数,第五个参数是什么
1 | Qt的`connect`函数用于建立信号和槽之间的连接,其原型可以接受多个参数,其中第五个参数是`connectionType`,用于指定信号和槽之间的连接类型。这个参数是可选的,因为默认情况下会使用`Qt::AutoConnection`。以下是关于第五个参数`connectionType`的可能取值及其含义: |
有一串列表,怎么判断他们有没有相交的部分
1 | 判断两个链表是否相交,通常涉及以下几种方法,具体取决于链表是否有环以及你所拥有的信息。这里假设您提到的是单链表,且希望判断它们是否在某个节点处相交。 |
求给定数组中第k大的数
1 | 找到给定数组中第k大的数的方法主要有以下几种: |
32位和64位系统下成员变量和对象各种区别和细节
1 | 在C++中,32位和64位系统的区别主要体现在以下几个方面,这些区别会影响到成员变量和对象的处理: |
32位软件跑在64位系统上,跟64位软件跑在64位系统上有什么区别
1 | 32位软件跑在64位系统上与64位软件跑在64位系统上的主要区别包括: |
vector/map/list底层原理,复杂度
1 | 在C++标准模板库(STL)中,`vector`、`map`、和`list`是非常常用的数据结构,它们各有不同的底层实现和操作复杂度。 |
常用数据结构的应用场景
1 | C++中常用的数据结构及其应用场景如下: |
map的key是有序的吗
1 | 是的,在C++中,`map`的key是有序的。`map`容器是通过红黑树实现的,它自动按照key的升序排序(默认情况下)。当你插入元素时,`map`会根据key值将元素插入到适当的位置,以维护树的有序性。这使得对`map`进行遍历会得到一个按key排序的序列。如果需要,你可以自定义比较函数来改变排序标准。 |
C++里面的内存分配方式,堆区和栈区的区别
1 | C++中的内存分配方式主要涉及堆区(heap)和栈区(stack),它们有以下几点关键区别: |
TCP/UDP的区别,三次握手四次分手
1 | TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种主要的传输层协议,它们在网络通信中扮演着不同的角色,主要区别在于连接性、可靠性、顺序保证和速度等方面: |
p2p协议选tcp还是udp
1 | 如果我来设计一个P2P(点对点)系统,我会考虑同时使用TCP和UDP,因为两者各有优势,结合使用可以更好地适应不同的网络环境和应用场景。 |
http协议(http请求和http响应协议)
UDP如何实现可靠性
1 | UDP(User Datagram Protocol)本身是一个无连接的、不可靠的传输层协议,它不提供像TCP那样的确认、重传、排序等机制来确保数据包的可靠传输。然而,如果需要在UDP基础上实现可靠性,可以通过在应用层增加额外的逻辑来模拟TCP的部分功能,以下是实现UDP可靠性传输的一些常见策略: |
C++ 11 /17新特性
1 | C++11和C++17是C++编程语言现代化过程中非常重要的两个版本,它们引入了大量新特性,显著提高了代码的简洁性、效率和安全性。以下是这两个版本中的一些关键新特性概览: |
深拷贝和浅拷贝
1 | 深拷贝和浅拷贝是计算机编程中关于对象复制的概念,主要涉及如何处理对象的属性,特别是指针或引用类型的成员变量。它们主要出现在面向对象编程语言中,如C++、Java等。理解深拷贝和浅拷贝的区别对于避免内存泄漏、数据不一致等问题至关重要。 |
C++的多态是怎么实现的
1 | C++中的多态主要通过虚函数(virtual functions)和动态绑定(dynamic binding,也称作迟绑定或运行时绑定)来实现。以下是其实现原理的详细说明: |
C++继承的实现原理
1 | C++中的继承实现原理主要是通过以下几个方面体现的: |
C++的整个编译过程
1 | C++的编译过程可以大致分为以下几个阶段: |
cpu 1ghz数每毫秒运行几次
1 | CPU的时钟频率,也就是这里的1GHz(千兆赫兹),表示CPU每秒钟可以进行10亿(1,000,000,000)个周期。要计算每毫秒(千分之一秒)能执行多少个周期,我们可以做如下换算: |
CPU时间片
1 | CPU时间片(Time Slice)是操作系统中用于实现进程(或线程)调度的基本概念之一。在现代多任务操作系统中,CPU时间被划分为多个微小的时间片段,每个正在执行的进程或线程被分配一段这样的时间片来使用CPU。当一个进程或线程用完它的时间片后,操作系统会暂停其执行,保存其上下文(即当前的执行状态),然后将CPU控制权交给下一个进程或线程,这个过程称为上下文切换。 |
对称和非对称加密
1 | 对称加密和非对称加密是现代密码学中两种基本的加密方法,它们在确保数据的安全传输和存储中扮演着至关重要的角色,但工作原理和适用场景有所不同。 |
进程间通信常见几种方式和他们之间的区别、优缺点,详述
1 | 进程间通信(IPC, Inter-Process Communication)是多进程系统中实现数据交换和协调的关键机制。下面详细介绍几种常见的进程间通信方式及其区别、优缺点: |
单例模式怎么实现,能拷贝构造吗,单例的优点是什么
1 | 单例模式通常有几种实现方式,包括但不限于: |
静态全局变量和静态局部变量
1 | 静态全局变量和静态局部变量是C/C++编程中两种特殊的存储类别,它们的特点和区别主要体现在作用域、生命周期和存储位置上: |
简单的实现一个string类
1 |
|
其他
1.智能指针
- 底层实现
- QPointer、QScopedPointer、QSharedDataPointer
2.指针
- 指针常量和常量指针的区别
3.构造析构
- 基类构造, 子类构造, 子类成员变量的构造顺序是什么
4.虚函数
- 多态中,父类与子类的虚表一样吗?如果一个子类的方法用了override关键字呢,虚表又是否相同
- 多继承下的虚函数表
- 虚表指针的大小
- 虚函数和纯虚函数的区别
5.线程和进程
- 多线程用过吗, 交互有哪些方式
- 多线程读写同一个静态变量你是怎么解决的
QTimer
是在哪个线程?QTimer
为什么启动和停止要在同一个线程?qt
中生成线程的方式?继承QThread
,重写run
函数与moveToThread
的区别?- 进程通信,共享内存如何实现进程安全
- 线程池了解吗
- linux 查看进程
- linux 线程和进程的调度
- 一个线程1在读文件,主线程退出了,怎么让线程1也退出不继续读
- 为什么要用qthread管理多线程?windows自己也有回调机制?
- 线程池,申请多少个线程池,比较合适?会不会使用GPU?
- 多线程加锁,会劣化性能,请问有什么优化的手段?
- 写一个线程不安全的例子, 再把它改为线程安全
- 进程间通信方式?线程呢?
- QT的多线程,你用了哪些技术.哪些是只有Qthread能做的,QtConcurrent办不到的.
- 如果同时有1000个访问请求,线程池只有8个线程的情况下怎么处理
6.Qt
- 对qt有啥了解,使用qt线程池做过什么
- QT的object类作为所有控件的基类,做了哪些工作,发挥了什么作用
- qobject parent的用处
- qt mfc这种框架怎么和计算机底层交互的
- 写一个用户登录界面的逻辑 要求实现多个方法的验证(用户名密码, 手机验证码, 人脸登录等) 并可以后序添加模块
- 消息循环机制 消息队列为空怎么办
- 写QT的时候尝试用过cmake吗
- Qt内存管理机制
- Qt如何只释放子窗口
- Qt中一些类的构造函数中经常有一个指针参数,用过吗
- moc元编译器元对象
- 多线程中是如何使用信号槽的
- 项目中如何维护各控件的生命周期
- 如何保证只打开一个exe.当打开了exe1的时候,如果再打开exe1第二次,会将exe1之前打开的旧窗口调出,并最大化显示.
- QWidget和QML的区别,在渲染层面
- GPU渲染和CPU渲染,之间的区别是什么
- 兄弟窗口,想刷新他们的重叠部分,请问流程是什么样的,刷新的顺序是什么样的
- 父子窗口间的刷新管理?兄弟窗口间的刷新管理?如何让子窗口刷新,父窗口不刷新
- show() exec()区别
- Qt Remote Object的序列化与反序列化
- 软件如果出现问题,如何去定位的,如何处理的?静态扫描和动态检测,有哪些方法.
- 用QT实现一个三角形的按钮,会如何实现?
- 使用QT渲染的时候,有没有遇到显卡适配的问题?
- 制作一个按钮,会躲避鼠标,鼠标一旦移动上去,按钮就会跑
- 除了用鼠标移动去控制指针以外,我们还有很多方式去控制,他都会触发mouseMove事件吗
- 鼠标指针,可以移动,除了鼠标键盘可以控制,某些触摸板/触控屏,他们触发的都是mouseEvent吗?
- qgraphscene/ qgraphitem的填充模式,任意一个多边形,它的填充模式有哪些?
- qgraphscene的内存开销,刷新的性能
7.信号槽
- Qt槽函数在单线程和多线程的区别
- 信号与槽,是如何去提高它的匹配性能的,一个信号,如何高效地去找它的槽函数
- 一个线程上的对象发出signal,另一个线程上的对象响应slot,这其中会有多线程相关的问题吗
8.数据结构
- 数组的存放方式有: 链表,索引,顺序?
- 图搜索,dfs
- B+树和B树的区别?数据库的几个隔离级别,具体如何实现的?
- 二分查找
- 大端小端判定
- 左值和右值
- 二叉树如何求深度
- 如何求第k大的元素
- unicode和utf-8
- 数组/链表区别
- 二维数组按行、按列读取速度的差异
- vector 动态扩容底层,扩容机制
- 两个 vector 一个放普通数据类型一个放指针,扩容有什么区别
- malloc 和 free 如何知道释放内存具体大小
- 宏定义放在哪里
- 为什么要内存对齐
- vector和map查找效率
- 栈溢出的产生与避免
- 内存布局,静态变量和全局变量会放在哪里
- 常用的stl容器
- stl的map和hashmap有什么区别,效率方面
- weak_ptr的例子,简单写一下会出现的问题并介绍下
- unordered_map的实现和map的实现
- vector和list的区别
- vector删除一个元素需要注意些什么
- 左右值转换
- 双向链表和环形链表用在什么场景
- 手写自己设计的vector
- 用过哪些容器,迭代器失效?
- .int,long long占多少字节
9.网络基础
- ping的底层原理
- 除了ping还有什么命令可以去检测该主机网络是否正常,具体命令
- http1.1相比1.0 http2.0相比1.x的区别
- http和https的区别
- 一个https的url输入到浏览器到页面显示 发生了什么
- 抓过包吗 https抓包会抓到什么
- 我们用腾讯会议聊天的话,用TCP还是UDP,为什么
- 计算机网络七层
- GET和POST
- 浏览器输入URL后会经历什么过程
10.其他
- 操作系统常见的文件操作函数
- 传入派生类的引用, 调用谁的成员函数
- for ++i i++区别
- 编程:排序,奇数全放前面
- 做过的项目里哪一个是最满意的, 讲一下这个项目
- 原子操作有用过吗, 有什么作用
- 函数有几种传参方式, 哪种情况用哪种方式
- 有用过linux吗, 755权限代表什么含义
- vector的reserve函数和resize函数有什么区别
- 什么情况下会使用静态变量
- 用过无锁编程吗,知道原子量吗
- 你知道MQTT吗?
- Linux系统中阻塞和非阻塞的区别
- volatile关键字的作用
- window的消息队列
- 项目中心跳检测机制如何实现的
- 说一下C++的move构造和拷贝构造是怎么实现的
- C++模板元编程中的 enable_if 说一下,有什么应用
- 多态是如何实现的
- 动态绑定与静态绑定说一下,哪个更高效
- 结构体和class的区别
- 程序编译过程
- 函数模板用过吗
- wondows 消息循环
- 预防内存泄漏方式
- 了解json格式吗
- 类中的引用计数
- Lambda表达式
- 动态链接、静态链接
- C++面向对象的特性
- MVC和MVVM
- 怎么保证生成的随机数是均匀分布的
- 抽奖会得到四种道具概率分别不同,该怎么实现这个程序
- 假设有几万个号码算出来他们的MD5以16进制存储,然后有一个新的号码算出来它的MD5值,现在要判断这个值在不在之前的数据当中,该怎么实现不能调用库函数
- 有没有自己重写过自定义控件
- 宏定义如何使用(直接替换),嵌套宏定义如何使用,展开顺序
- 关键字inline、类与结构的区别、explicit关键字.
- C++的类型转换
- 一个浏览器的网页,包含前进和后退功能,使用哪种数据结构来存放历史网页,比较合适
- windows系统下,是怎么实现窗口刷新(窗口刷新机制);是立即刷新,还是异步刷新;每次我需要一个窗口刷新,他都能立马刷新吗
- 说说windows系统的内存管理,怎么实现共享内存?操作系统层面是如何完成这个过程的
- 如何分析dump文件
- 如何排查出代码里已经存在的内存泄漏问题,线上的内存泄漏
- class前项申明和include的区别
- 什么情况下,delete需要加一个中括号[]
- 装饰器模式/门面模式/中介者模式,他们的代码实现和优缺点
- 共享内存的流程(底层原理)
- 自己有没有实现过读写锁?
- 乐观锁和悲观锁的区别,自旋锁,是一种乐观锁吗?
- dynamic_cast怎么保证安全的?
- 如果有一块内存,如何知道内存是被人正在使用的,还是忘记delete导致内存泄漏的?
- 堆内存分配的时候,需要找寻足够大的内存,如果没有足够大的内存怎么办
- const成员如何进行初始化