大家好,又见面了,我是你们的朋友全栈君。
前言
又到了金三银四的季节,每年这个时候都是跳槽的高峰期,在整理电脑资料的过程中发现一些之前记录的面试过程中最常提到的C++和Qt相关问题,其实都是些很基础的知识点,但是在面试过程中出镜率非常高。总结如下,仅供参考。
正文
废话不多说,直接上题。
C++基础篇
- 1.线程同步的方式有哪些
- 2.线程间通信如何实现
- 3.进程间通信如何实现 参考这里
- 4.IO模型用过哪些
- 5.IO实现的方式有哪些
- 6.用过哪些STL
- 7.迭代器失效怎么产生的,如何避免 参考这里
- 8.vector、list、map实现原理
- 9.如何实现多态
- 10.虚函数实现原理,虚函数表结构,对于菱形继承结构,虚函数表处理方式是什么
- 11.内存结构分配方式
C++ 内存分区:栈、堆、全局/静态存储区、常量存储区、代码区。
1.栈:存放函数的局部变量、函数参数、返回地址等,由编译器自动分配和释放。
2.堆:动态申请的内存空间,就是由 malloc 分配的内存块,由程序员控制它的分配和释放,如果程序执行结束还没有释放,操作系统会自动回收。
3.全局区/静态存储区(.bss 段和 .data 段):存放全局变量和静态变量,程序运行结束操作系统自动释放,在 C 语言中,未初始化的放在 .bss 段中,初始化的放在 .data 段中,C++ 中不再区分了。
4.常量存储区(.data 段):存放的是常量,不允许修改,程序运行结束自动释放。
5.代码区(.text 段):存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里。
- 12.malloc free 和new delete的区别,为什么不能malloc和delete混用,会产生什么问题
- 13.红黑树实现原理
- 14.查找算法有哪些
- 15.排序算法有哪些
- 16.快排实现原理,时间复杂度是多少
- 17.指针和引用的区别
- 指针有自己的一块空间,而引用只是一个别名
- 指针的大小是4,引用则是被引用对象的大小
- 指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用
- 作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对应用的修改都会改变引用所指向的对象
- 可以有const指针,但没有const引用
- 指针在使用中可以指向其他对象,但是引用只能是一个对象的引用,不能被改变
- 指针可以有多级指针(**p),而引用只有一级
- 指针和引用使用++运算符的意义不一样
- 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏。
- 18.const声明指针的问题
- 19.哪些运算符不能重载
1 . (点运算符)通常用于去对象的成员,但是->(箭头运算符),是可以重载的
2 ::(域运算符)即类名+域运算符,取成员,不可以重载
3 .* (点星运算符,)不可以重载,成员指针运算符”.*,即成员是指针类型
4 ?: (条件运算符)不可以重载
5 sizeof 不可以重载
- 20.什么是线程安全
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。
线程安全问题大多是由全局变量及静态变量引起的,局部变量逃逸也可能导致线程安全问题。
- 21.C++11新特性用过哪些
- 22.vector的C++新特性有哪些
- 23.讲讲右值引用与完美转发
- 24.对象池的使用及场景
- 25.线程池介绍,使用场景和实现原理
- 26.内存池使用场景和实现原理
- 27.C++的锁
- 28.Lambda表达式传递值有哪些方式,如何确定lambda的返回值 参考这里
- 29.智能指针介绍
- 30.shared_ptr相互引用的场景,如何解决
- 31.auto和decltype的区别
- 32.vector内存拷贝问题,什么情况下会出现内存拷贝,如何解决这个问题使其更加高效
- 33.vector中resize和reverse的区别
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。
- 34.内存泄露的情况
- 35.链表实现原理
- 36.动态库和静态库的区别
- 37.多线程在什么场景下使用
- 38.动态库导出的接口设计有哪些需要注意的。工作中有没有做过动态接口设计,如何考虑不同版本的兼容性。假如已经导出了接口给外部使用,并且该版本已经发布出去了,如果新增加了接口,那么如何保障已经发出去的版本能够调用到这个新的接口,如何设计这个兼容性问题。 参考这里
- 39.用过哪些设计模式,举例说明其原理 参考这里
- 40.堆和栈的区别
1.申请方式:栈是系统自动分配,堆是程序员主动申请。
2.申请后系统响应:分配栈空间,如果剩余空间大于申请空间则分配成功,否则分配失败栈溢出;申请堆空间,堆在内存中呈现的方式类似于链表(记录空闲地址空间的链表),在链表上寻找第一个大于申请空间的节点分配给程序,将该节点从链表中删除,大多数系统中该块空间的首地址存放的是本次分配空间的大小,便于释放,将该块空间上的剩余空间再次连接在空闲链表上。
3.栈在内存中是连续的一块空间(向低地址扩展)最大容量是系统预定好的,堆在内存中的空间(向高地址扩展)是不连续的。
4.申请效率:栈是有系统自动分配,申请效率高,但程序员无法控制;堆是由程序员主动申请,效率低,使用起来方便但是容易产生碎片。
5.存放的内容:栈中存放的是局部变量,函数的参数;堆中存放的内容由程序员控制。
- 41.什么是二叉搜索树
二叉搜索树,左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,并且每棵子树都具有上述特点
Qt相关
- 1.Qt创建线程的方式有哪些 参考这里
- 2.信号槽实现原理
- 3.Qt的消息传输机制
- 4.QML和C++的交互方式
- 5.如何在C++中定义model并在qml中使用
- 6.moveToThread的优缺点
- 7.Qt中的http是同步还是异步,如何实现同步
- 8.Qt的信号槽是线程安全的吗,Qt信号的连接方式?
Qt 支持这些信号槽连接类型:
AutoConnection:自动连接(默认)如果信号在接收对象具有亲和性的线程中发出,则行为与直接连接相同。否则,行为与排队连接相同。
DirectConnection:直接连接,发出信号时立即调用槽。槽在发射器的线程中执行,不一定是接收器的线程。
Queued Connection:当控制返回到接收者线程的事件循环时调用该槽。插槽在接收者的线程中执行。
BlockingQueuedConnection:与 Queued Connection 一样调用槽,除了当前线程阻塞,直到槽返回。
注意:使用该类型连接同一线程中的对象会导致死锁。
UniqueConnection:唯一连接行为 与自动连接相同,但只有在不复制现有连接时才会建立连接。即,如果相同的信号已经连接到同一对对象的相同槽,则不建立连接并且connect()返回false。
可以通过将附加参数传递给connect()来指定连接类型。请注意,如果事件循环在接收者的线程中运行,则在发送者和接收者位于不同线程中时使用直接连接是不安全的,原因与调用位于另一个线程中的对象上的任何函数是不安全的原因相同。
QObject::connect () 本身是线程安全的。
- 9.元对象系统介绍
- 10.QPixmap和QImage的区别 参考这里
- 11.Qt跨平台的优缺点
平台相关
- 1.win系统编程用过哪些系统接口
- 2.windows消息传递机制
- 3.如果要自己写消息循环会怎么写
- 4.windbg调试使用
- 5.内存泄露如何排查和解决
- 6.什么是消息队列
- 7.一个进程可以有多个消息队列吗
- 8.sendMessage和postMessage的区别
- 9.VS调试dump文件过程
网络相关
- 1.TCP底层原理
- 2.TCP三次握手,四次握手过程,发送的报文以及每次握手的状态,断开后为什么是time_wait状态
- 3.TCP粘包如何处理
- 4.网络传输协议如何制定,哪些字段必须定义
编程相关
- 1.手写快排代码 参考这里
- 2.手写冒泡排序
- 3.创建单向链表,顺序添加10个元素
- 4.创建红黑树,添加元素
- 5.单项链表,如何快速查出倒数第N个数据的值
- 6.假设内存无限大,100万个short类型的数据,如何高效排序
- 7.vector一次循环删除多个元素
参考:
std::vector<int> v = {
1,3,5,6,3,4,7,3};
for(auto it = v.begin(); it != v.end();){
cout << "*it=" << *it << endl;
if(*it == 3){
it = v.erase(it);
}
else{
it++;
}
}
项目相关
- 1.libevent接口如何封装的
- 2.介绍自己设计的项目框架
- 3.项目中遇到的难题,如何解决的
- 4.如何调试程序,崩溃问题如何排查
- 5.git和svn区别 参考这里
相关
在之前的博客中也总结过一些关于C/C++ 的基础知识点,可供参考:
C/C++基础知识点(一)
C/C++基础知识点(二)
C/C++基础知识点(三)
C/C++基础知识点(四)
最后
上面这些是之前面试中遇到过的一些常见问题,另外,还整理了一份更详细的复习资料,也是关于C++基础知识以及相关经典面试题,还有一份数据结构和算法的面试手册,非常详细,有需要的可以下载学习。
以上资料附带详细答案。
下载地址
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152888.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...