C++面试题精选与解析
一、基础与语法
- 请问C++中的指针和引用有什么区别?
指针是一个变量,存储的是另一个变量的内存地址。指针可以被重新赋值以指向另一个不同的对象。而引用是某个变量的别名,一旦引用被初始化为一个变量,就不能改变为指向另一个变量。
- C++中如何实现多态?
多态是面向对象编程的三大特性之一,主要通过虚函数和继承实现。在基类中声明虚函数,并在派生类中重写这个虚函数,然后通过基类指针或引用来调用这个函数,就会实现多态。
- 什么是RAII?它在C++中有什么应用?
RAII是资源获取即初始化(Resource Acquisition Is Initialization)的缩写,是一种管理资源(如内存、文件句柄、网络连接等)的编程技术。在C++中,RAII通常通过对象的生命周期来控制资源的生命周期。例如,智能指针就是一个RAII的典型应用。
二、内存管理
- C++中内存分为哪几个部分?
C++中的内存主要分为四个部分:堆区、栈区、全局/静态存储区和代码区。
- 如何避免内存泄漏?
内存泄漏主要是由于动态分配的内存没有被正确释放导致的。为了避免内存泄漏,应该尽量使用智能指针(如std::unique_ptr
、std::shared_ptr
)来管理动态分配的内存,它们会在适当的时机自动释放内存。同时,定期检查代码,确保所有的new
操作都有对应的delete
操作。
三、STL与容器
- 请简述STL的六大组件。
STL的六大组件包括:容器(Containers)、迭代器(Iterators)、算法(Algorithms)、仿函数(Function Objects)、适配器(Adapters)和配接器(Allocators)。
std::vector
和std::list
有什么区别?
std::vector
是动态数组,支持随机访问,插入和删除操作在首尾效率较高,中间位置效率较低。而std::list
是双向链表,只支持顺序访问,插入和删除操作在任何位置都较为高效。
四、模板与泛型编程
- 什么是模板?C++中的模板有哪些类型?
模板是C++中的一种特性,它允许程序员为类、函数等编写通用的代码,而不必为每种数据类型都重写代码。C++中的模板主要有两种类型:函数模板和类模板。
五、面向对象设计
- 请解释什么是设计模式,并列举几种常见的设计模式。
设计模式是解决特定问题的最佳实践。常见的设计模式有:单例模式、工厂模式、观察者模式、策略模式、装饰器模式等。