前言
又到了金三银四的季节。每年这个时候都是跳槽的高峰期。在整理计算机数据的过程中,我发现了面试过程中最常提到的一些记录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 使用了哪些新特性?
- 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++基础知识以及相关经典面试题,还有一份数据结构和算法的面试手册,非常详细,有需要的可以下载学习。
以上资料附带详细答案。 下载地址