Qt C++/Go/Python 面试题(持续更新)

news2025/4/25 13:43:46

目录

1、封装、继承、多态是什么?

2、final标识符的作用是什么?

3、介绍一下虚函数

4、介绍一下智能指针

5、介绍一下左值、右值、左值引用、右值引用

6、指针和引用有什么区别?

7、define和const的区别是什么?

8、C++程序的内存划分

1. 代码区(Text Segment)

2. 全局/静态数据区(Data Segment)

3. 堆区(Heap)

4. 栈区(Stack)

5. 常量区(Read-Only Data)

6. 内存映射区(Memory Mapping Segment)

9、class与struct的区别

10、内存对齐是什么?

11、进程之间的通信方式有哪些?

12、介绍一下 I/O 多路复用

13、多线程为什么会发生死锁?

14、面向过程和面向对象

15、++i和i++哪个效率更高

16、介绍一下vector、list的底层实现原理和优缺点

17、空对象指针为什么能调用函数?

18、介绍一下 push_back 和 emplace_back

19、空类中有什么函数?

20、explicit 什么作用?

21、成员变量初始化的顺序是什么?

22、malloc和new的区别是什么?

23、迭代器和指针

24、线程有哪些状态


 

1、封装、继承、多态是什么?

封装:将具体实现过程和数据封装成一个类,只能通过接口进行访问,降低耦合性。

继承:子类继承父类的特征和行为,复用了基类的全体数据成员函数,基类私有成员可被继承,但是无法被访问,其中构造函数、析构函数、友元函数、静态数据成员、静态成员函数都不能被继承。

多态静态多态通过函数重载实现,可以实现同一个函数名根据传入参数不同而具有不同实现,编译期间就已经确定;动态多态:通过虚函数表实现,在派生类中重写基类函数,实现同一个函数名不同实现,运行时根据虚函数表确定调用哪个函数。

2、final标识符的作用是什么?

放在类的后面表示该类无法被继承,也就是阻止了从类的继承,放在虚函数后面该虚函数无法被重写。

3、介绍一下虚函数

虚函数是通过虚函数表实现的,含有虚函数的类在构造函数中会初始化虚函数表指针,它存储在类内存中,指向虚函数表,虚函数表存储指向每个虚函数的指针,多个类对象共用一张虚函数表。虚函数和普通函数都存储在代码段。

构造函数不能为虚函数,因为虚函数表指针需要在构造函数中初始化。析构函数最好为虚函数,这样当一个指向派生类的基类指针被释放时,可以先调用派生类析构函数,再调用基类析构函数,否则只会调用指向的类的析构函数。

类中static函数不能声明为虚函数,因为类中的 static 函数是所有类实例化对象所共有的,没有 this 指针,此时无法访问到虚函数表指针。

4、介绍一下智能指针

智能指针可以自动管理内存,通过调用对象的析构函数来实现。

share_ptr:共享同一个资源,每增加一个智能指针,引用计数加1,当引用计数为0时释源。

unique_ptr:对其持有的堆内存具有唯一拥有权,也就是说引用计数永远是 1,禁止复制语义。

weak_ptr:不占用引用计数,用于解决 share_ptr 循环引用问题。比如有两个类,它们各有一个指向对方的 share_ptr,然后相互初始化,此时就会造成引用循环。将其中的一个 share_ptr 换成 weak_ptr,就可以解决。

实际开发中,有时候需要在类中返回包裹当前对象(this)的一个 std::shared_ptr对象给外部使用,C++ 新标准也为我们考虑到了这一点,有如此需求的类只要继承自 std::enable_shared_from_this模板对象即可。用法如下:

#include <iostream>
#include <memory>
​
class A : public std::enable_shared_from_this<A>
{
public:
    A()
    {
        std::cout << "A constructor" << std::endl;
    }
​
    ~A()
    {
        std::cout << "A destructor" << std::endl;
    }
​
    std::shared_ptr<A> getSelf()
    {
        return shared_from_this();
    }
};
​
int main()
{
    std::shared_ptr<A> sp1(new A());
​
    std::shared_ptr<A> sp2 = sp1->getSelf();
​
    std::cout << "use count: " << sp1.use_count() << std::endl;
​
    return 0;
}

5、介绍一下左值、右值、左值引用、右值引用

左值:有地址的值,如下列代码中的变量a。

右值:临时值,如下列代码中的10。

int a = 10;

左值引用:就是普通的引用。

右值引用:一种引用类型,用&&表示,它专门用于绑定到临时对象(右值)上,主要用于实现完美转发移动语义

完美转发就是在传递参数时维持参数的类型(左值、右值)不变

移动语义就是允许资源的所有权转移而非复制。

std::move 的功能是将一个左值引用强制转化为右值引用,继而可以通过右值引用使用该值,以用于移动语义,从实现原理上讲基本等同一个强制类型转换

6、指针和引用有什么区别?

指针:指针是变量,内存中存储的是目标数据的地址。

引用:是变量的别名,不额外占用内存,必须初始化且只能初始化一次。

7、define、const、inline 的区别是什么?

define 是在预处理时进行简单的文本替换,不会进行类型安全检查,define 定义的宏常量,在程序中使用多少次就会进行多少次替换,内存中有多个备份,占用的是代码段的内存。

const 则是在编译时确定其值,会进行类型安全检查。

inline 是建议编译器在函数调用处将函数展开,适用于比较短、功能单一的函数,节省函数调用的开销。如果函数体过长,频繁使用内联函数会导致代码编译膨胀问题

在头文件中类内声明并定义的函数默认是 inline,类内声明类外初始化的必须加 inline,以解决多重定义错误(否则多个cpp文件包含了这个h文件,链接时会出现多重定义错误)。

在头文件中类内声明,cpp文件中定义的函数不需要加 inline,此时不会发生多重定义错误。

8、C++程序的内存划分

1. 代码区(Text Segment)

  • 存储内容:程序的机器指令(可执行代码)

  • 特点

    • 只读内存区域

    • 在程序启动时加载

    • 可能被多个进程共享(对于相同的可执行文件)

2. 全局/静态数据区(Data Segment)

分为两部分:

  • 已初始化数据段(.data)

    • 存储已初始化的全局变量和静态变量

    • 包括静态局部变量

  • 未初始化数据段(.bss)

    • 存储未初始化的全局变量和静态变量

    • 程序加载时由操作系统初始化为零

3. 堆区(Heap)

  • 存储内容:动态分配的内存(通过new/malloc分配)

  • 特点

    • 手动管理(需要delete/free释放)

    • 内存分配方向从低地址向高地址增长

    • 分配速度较慢(需要系统调用)

    • 大小受系统虚拟内存限制

4. 栈区(Stack)

  • 存储内容

    • 局部变量

    • 函数参数

    • 函数调用信息(返回地址、寄存器状态等)

  • 特点

    • 自动管理(函数结束时自动释放)

    • 内存分配方向从高地址向低地址增长

    • 分配速度快(只需移动栈指针)

    • 大小有限(通常几MB,可配置)

5. 常量区(Read-Only Data)

  • 存储内容

    • 字符串字面量

    • 编译期确定的常量表达式(如constexpr

  • 特点

    • 只读内存区域

    • 尝试修改会导致段错误

6. 内存映射区(Memory Mapping Segment)

  • 存储内容

    • 动态链接库

    • 内存映射文件

    • 共享内存区域

  • 特点

    • 由操作系统管理

    • 可用于进程间通信

9、class与struct的区别

class 默认是 private 继承,struct 默认是 public 继承。

10、内存对齐是什么?

CPU通常以固定大小的块(如4字节、8字节)从内存中读取数据。如果数据未对齐,可能需要多次内存访问才能读取完整数据,降低效率。

11、进程之间的通信方式有哪些?

管道:管道本质上是一个内核中的一个缓存,当进程创建管道后会返回两个文件描述符,一个写入端一个输出端。缺点:半双工通信,一个管道只能一个进程写,一个进程读。不适合进程间频繁的交换数据

消息队列:可以边发边收,但是每个消息体都有最大长度限制,队列所包含的消息体的总数量也有上限并且在通信过程中存在用户态和内核态之间的数据拷贝问题

共享内存

套接字:例如QLocalSocket,可以创建一个类,继承于QLocalServer,接受QLocalServer::newConnection信号,在槽函数中获取客户端套接字,并调用其函数进行读取/写入。

12、介绍一下 I/O 多路复用

这三个都是I/O多路复用技术,用于同时监控多个文件描述符(fd)的状态变化(可读、可写、异常等),是高性能网络编程的核心机制。

select:每次调用select都需要把fd集合从用户区拷贝到内核区,而select系统调用后有需要把fd集合从内核区拷贝到用户区,这个系统开销在fd数量很多的时候会很大,并且存在最大fd数量限制,一般为1024

poll:和select基本相同,但采用了链表存储,没有最大fd数量限制

epoll:Linux特有的高效I/O多路复用机制,采用事件驱动方式,在调用epoll_ctl系统调用时拷贝一次要监听的文件描述符数据结构到内核区,在调用epoll_wait的时候不需要再把所有的要监听的文件描述符重复拷贝进内核区,支持水平触发和边缘触发

13、多线程为什么会发生死锁?

当各个线程想获取的资源,但是得不到满足,同时自身也不释放已有资源,就会产生死锁。

四个必要条件:互斥条件、请求和保持条件、不可剥夺条件、环路等待条件,破坏其一就可解除死锁。

14、面向过程和面向对象

面向过程:分析出解决问题的步骤,然后将这些步骤一步一步的实现,使用的时候一个一个调用就好。代码效率更高但是代码复用率低,不易维护。

面向对象:就是将问题分解为各个对象,每个对象描述某个事物在整个解决问题的步骤中的行为,相比面向过程,代码更易维护和复用。但是代码效率相对较低。

15、++i和i++哪个效率更高

++i 是左值,++i 直接修改 i 并返回 i 本身,因此它是可修改的具名对象

i++ 是右值,i++ 返回的是递增前的临时副本,该副本是临时对象,过程中会触发拷贝构造

16、介绍一下vector、list的底层实现原理和优缺点

vector 是由一块连续的内存空间组成,因此可使用下标随机访问,尾插尾删效率高,当容器大小超过容量时,会自动申请一块更大的内存(原有内存的1至2倍),并且把所有数据拷贝到新内存中。

list 是由双链表实现的,不支持下标随机访问,按需申请内存,不会造成内存空间浪费。在任意位置的插入删除下效率高。

17、空对象指针为什么能调用函数?

空对象指针可以调用成员函数,前提是成员函数中不涉及到成员变量。

18、介绍一下 push_back 和 emplace_back

push_back 接收左值时调用拷贝构造函数,接受右值时调用移动构造函数

emplace_back 则是在容器内部直接构造新对象,避免了复制操作

19、空类中有什么函数?

默认构造函数、默认拷贝构造函数、默认析构函数、默认赋值运算符

空类的大小为1B

20、explicit 什么作用?

只能用于修饰只有一个参数的类构造函数(有一个例外就是,当除了第一个参数以外的其他参数都有默认值的时候此关键字依然有效),它的作用是表明该构造函数是显示的,而非隐式的。作用是防止类构造函数的隐式自动转换,比如构造函数中接收 float 类型,结果传了 int 类型,此时不进行类型转换。

跟它对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下声明为implicit。

21、成员变量初始化的顺序是什么?

与构造函数中初始化成员列表的顺序无关,只与类中定义成员变量的顺序有关。

类中const成员常量必须在构造函数初始化列表中初始化。类中static成员变量,只能在类内定义、类外初始化。

22、malloc和new的区别是什么?

New/delete会调用构造析构函数,malloc/free不会,所以他们无法满足动态对象的要求。

23、迭代器和指针

迭代器返回的是对象引用,而指针是一个变量。

24、线程有哪些状态

创建,就绪,运行,阻塞,结束。

阻塞态/创建态 + 资源 = 就绪态

就绪态 + CPU调度 = 运行态

运行态 - 资源 = 阻塞态

阻塞态不可直接到达运行态,需要先转为就绪态。

25、介绍一下 map 和 unordered_map

  • map:底层使用 红黑树(Red-Black Tree) 实现。红黑树是一种自平衡二叉搜索树,元素是按照键的升序排列的。插入元素时,会自动根据键的大小进行排序。查找、插入和删除操作的时间复杂度是 O(log n)。红黑树的节点存储需要额外的指针来维护树的结构,因此内存开销相对较大。

  • unordered_map:底层使用 哈希表(Hash Table) 实现。哈希表通过哈希函数将键映射到桶中,从而实现快速查找。元素的顺序是 不确定的,因为哈希表中的元素是根据哈希值存储的,而哈希值与元素的插入顺序没有关系。平均情况下,查找、插入和删除操作的时间复杂度是 O(1)。哈希表需要额外的内存来存储哈希桶和处理哈希冲突,但是内存开销小于 map。

26、lamda表达式捕获列表捕获的方式有哪些?

按值捕获:符号=,不能修改参数

引用捕获:符号&,可以修改传入的外部参数

默认的引用捕获可能会导致悬挂引用,引用捕获会导致闭包包含一个局部变量的引用或者形参的引用,如果一个由lambda创建的闭包的生命周期超过了局部变量或者形参的生命期,那么闭包的引用将会空悬。解决方法是对个别参数使用值捕获

27、哈希碰撞的处理方法

开放定址法:当遇到哈希冲突时,去寻找一个新的空闲的哈希地址。

再哈希法:同时构造多个哈希函数,等发生哈希冲突时就使用其他哈希函数知道不发生冲突为止,虽然不易发生聚集,但是增加了计算时间

链地址法:将所有的哈希地址相同的记录都链接在同一链表中

28、动态链接和静态链接

动态链接:不会将代码直接复制到自己程序中,只会留下调用接口,程序运行时根据代码中的路径将动态库加载到内存中,所有程序只会共享这一份动态库,因此动态库也被称为共享库。

静态链接:通俗来说就是把静态库打包到可执行程序中,如果有个多程序,每个程序链接静态库后,都会包含一份独立的代码,当程序运行起来时,所有这些重复的代码都需要占用独立的存储空间,显然很浪费计算机资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++智能指针上

一、裸指针 “裸指针”是最基础的&#xff0c;直接存储内存地址的指针类型。特点&#xff1a;①它本身没有自动的内存管理机制&#xff1a;如它不会自动释放内存&#xff0c;也不会检查是否指向有效的内存区域&#xff1b;②直接操作内存地址&#xff0c;不进行任何的边界检查&…

低代码平台开发串口调试助手

项目介绍 串口调试助手是一款用于串口通信调试的工具&#xff0c;它可以帮助开发人员发送和接收串口数据&#xff0c;主要用于嵌入式开发、工业控制、物联网设备开发等领域。 主要功能包括&#xff1a; 数据收发&#xff1a;可以实时发送和接收串口数据&#xff0c;并显示在界…

怎么配置一个kubectl客户端访问多个k8s集群

怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群&#xff0c;因为有的是把~/.kube/config文件&#xff0c;改为了~/.kube/.config文件&#xff0c;文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑&#xff0c;kubectl找不到要访问集群…

12N60-ASEMI无人机专用功率器件12N60

编辑&#xff1a;LL 12N60-ASEMI无人机专用功率器件12N60 型号&#xff1a;12N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;12A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;0.68…

长城智驾重复造轮子

左手新能源&#xff0c;右手智驾&#xff0c;这是长城当下最在意的两块业务。 从去年8月首款具备高阶智能驾驶功能SUV全新蓝山上市之后&#xff0c;长城在传播端的重点就是围绕智驾、无图方案打造智驾标签。 先是在广州国际车展上&#xff0c;整个展厅只展出全新蓝山&#xf…

continue插件实现IDEA接入本地离线部署的deepseek等大模型

文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c;您的关注是我…

滚珠螺杆在数控机床中如何降低摩擦系数?

对数控机床这样要求加工精度高而且加工精度能保持长期稳定的设备来说是必须的&#xff0c;而且具有较低的传动阻力也同时为更高速的传动打下基础。使用滚珠螺杆&#xff0c;也是数控机床加工效率高的一个重要原因&#xff0c;为了减少数控机床的滚珠螺杆出现摩擦&#xff0c;可…

【现代深度学习技术】循环神经网络05:循环神经网络的从零开始实现

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

Python实现技能记录系统

Python实现技能记录系统 来自网络&#xff0c;有改进。 技能记录系统界面如下&#xff1a; 具有保存图片和显示功能——允许用户选择图片保存&#xff0c;选择历史记录时若有图片可预览图片。 这个程序的数据保存在数据库skills2.db中&#xff0c;此数据库由用Python 自带的…

Linux常见指令介绍下(入门级)

1. head head就和他的名字一样&#xff0c;是显示一个文件头部的内容&#xff08;会自动排序&#xff09;&#xff0c;默认是打印前10行。 语法&#xff1a;head [参数] [文件] 选项&#xff1a; -n [x] 显示前x行。 2. tail tail 命令从指定点开始将文件写到标准输出.使用t…

VIC-3D非接触全场应变测量系统用于小尺寸测量之电子元器件篇—研索仪器DIC数字图像相关技术

在5G通信、新能源汽车电子、高密度集成电路快速迭代的今天&#xff0c;电子元件的尺寸及连接工艺已进入亚毫米级竞争阶段&#xff0c;这种小尺寸下的力学性能评估对测量方式的精度有更高的要求&#xff0c;但传统应变测量手段常因空间尺寸限制及分辨率不足难以捕捉真实形变场。…

下篇:深入剖析 BLE GATT / GAP / SMP 与应用层(约5000字)

引言 在 BLE 协议栈的最上层,GAP 定义设备角色与连接管理,GATT 构建服务与特征,SMP 负责安全保障,应用层则承载具体业务逻辑与 Profile。掌握这一层,可实现安全可靠的设备发现、配对、服务交互和定制化业务。本文将详解 GAP、GATT、SMP 三大模块,并通过示例、PlantUML 时…

27、Session有什么重⼤BUG?微软提出了什么⽅法加以解决?

Session的重大BUG 1、进程回收导致Session丢失 原理&#xff1a; IIS的进程回收机制会在系统繁忙、达到特定内存阈值等情况下&#xff0c;自动回收工作进程&#xff08;w3wp.exe&#xff09;。由于Session数据默认存储在进程内存中&#xff0c;进程回收时这些数据会被清除。 …

云智融合普惠大模型AI,政务服务重构数智化路径

2025年是“十四五”收官之年&#xff0c;数字政府和政务数智化作为“数字中国”建设的重点&#xff0c;已经取得了显著成效。根据《联合国电子政务调查报告2024》&#xff0c;我国电子政务发展指数全球排名第35位&#xff0c;与2022年相比提升8个名次&#xff1b;其中&#xff…

UE5 调整字体、界面大小

文章目录 方案一 5.4 版本及以上&#xff08;推荐&#xff09;方案二 5.3 版本及以下&#xff08;推荐&#xff09;方案三 使用插件&#xff08;不推荐&#xff09; 方案一 5.4 版本及以上&#xff08;推荐&#xff09; 进入 编辑 > 编辑器偏好设置&#xff0c;如下图所示&…

抽象类相关

抽象类的定义 抽象类 是一种特殊的类&#xff0c;它不能被实例化&#xff0c;只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数&#xff0c;表示该函数没有具体实现&#xff0c;必须由派生类来实现。 抽象类的作用 提供统…

【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建

本文章同步到我的个人博客网站&#xff1a;ElemenX-King&#xff1a;【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建 希望大家能使用此网站来进行浏览效果更佳&#xff01;&#xff01;&#xff01; 目录 一、异步FIFO1.1 异步FIFO的定义1.2 亚稳态1.3 异步FIFO关键技术…

【通关函数的递归】--递归思想的形成与应用

目录 一.递归的概念与思想 1.定义 2.递归的思想 3.递归的限制条件 二.递归举例 1.求n的阶乘 2.顺序打印一个整数的每一位 三.递归与迭代 前言:上篇博文分享了扫雷游戏的实现&#xff0c;这篇文章将会继续分享函数的递归相关知识点&#xff0c;让大家了解并掌握递归的思…

【FAQ】针对于消费级NVIDIA GPU的说明

概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关​​键组件、安装说明和重要注意事项。 注意&#xff1a;本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…

MyBatis操作数据库---从入门到理解

文章目录 关于MyBatis操作数据库MyBatis⼊⻔&#xff08;使用&#xff09;Mybatis操作数据库的步骤&#xff1a;配置数据库连接字符串使⽤MyBatis完成简单的增删改查操作注解xml 单元测试开启驼峰命名(推荐) 打印日志 关于MyBatis操作数据库 在之前的学习,我们了解到web应⽤程…