2024年C++笔试面试题涵盖了多个方面,包括基础知识、设计模式、进程通信、内存管理、多态实现等。以下是一些常见的面试题目及其解答:
基础知识
1、C++和C的区别:
- C++是面向对象的语言,而C是面向过程的语言。
- C++引入了new/delete运算符,取代了C中的malloc/free库函数。
- C++引入了引用的概念,而C中没有。
- C++引入了类的概念,而C中没有。
- C++支持函数重载,而C中没有这一特性。
2、static关键字的作用:
修饰局部变量时,使得该变量在静态存储区分配内存,生命周期与程序相同,作用域为局部作用域。
修饰全局变量时,使得该变量在静态存储区分配内存,在声明该变量的整个文件中都是可见的。
修饰函数时,使得该函数在声明该函数的整个文件中都是可见的,从而避免同名的函数冲突。
修饰成员变量时,所有的对象都只维持一份拷贝,实现不同对象间的数据共享。
3、进程和线程的区别:
进程:是操作系统分配资源和调度的独立单位,拥有自己的地址空间和系统资源。进程间相互独立,稳定性较高。
线程:是进程内部的执行单元,共享属于相同进程的资源,创建和切换成本较低,但一个线程的失败可能影响同进程的其他线程2。
4、设计模式
工厂设计模式:
定义:定义一个创建对象的接口,让子类决定实例化哪个类,对象的创建统一交由工厂去生产,具有良好的封装性,既做到了解耦,也保证了最少知识原则。
分类:简单工厂模式、工厂方法模式、抽象工厂模式3。
5、内存管理
共享内存的安全性:
共享内存本身没有内建安全措施,需要通过互斥锁或信号量来同步对共享内存的访问。
实施访问控制,限制哪些进程可以访问共享内存。
定期检查和清理,避免僵尸进程造成的资源泄露2。
6、多态实现方式
多态的实现方式:
虚函数:通过基类中的虚函数实现多态。派生类通过重写基类的虚函数来改变函数的行为。
抽象类:包含至少一个纯虚函数的类称为抽象类。派生类必须实现基类的纯虚函数才能进行实例化。
7、指针与引用:
什么是指针?什么是引用?它们有什么区别?
如何避免野指针?
8、内存管理:
C++中有哪些内存分配方式?
解释new和delete的作用。
std::unique_ptr和std::shared_ptr的区别是什么?
9、类与对象:
构造函数和析构函数的用法。
静态成员变量和静态成员函数的作用。
成员函数、友元函数和全局函数的区别。
10、继承与多态:
虚函数是如何实现的?
什么是虚表(vtable)?它是如何工作的?
纯虚函数与抽象类的概念。
菱形继承问题及解决方法。
11、模板:
函数模板与类模板的区别。
模板特化是什么?
12、异常处理:
异常处理的基本语法。
栈展开(stack unwinding)过程。
异常安全编程的原则。
13、标准库:
std::vector、std::list等容器的使用场景。
迭代器失效的情况。
std::algorithm中的常用算法。
14、并发与线程:
std::thread的基本使用。
互斥锁(mutex)与条件变量(condition variable)
std::atomic的使用。
15、数据结构与算法
链表操作:
反转一个单链表。
删除链表中的重复节点。
实现LRU缓存机制。
树结构:
二叉搜索树的插入与删除。
平衡二叉树(如AVL树)的旋转操作。
二叉树的遍历(前序、中序、后序)。
图算法:
Dijkstra最短路径算法。
Floyd-Warshall算法求解所有顶点对之间的最短路径。
图的深度优先搜索(DFS)和广度优先搜索(BFS)。
排序算法:
快速排序、归并排序、堆排序的实现。
排序算法的时间复杂度分析。
16、动态规则
最长公共子序列(LCS)问题。
背包问题(Knapsack Problem)。