C++大厂面试题及解答
时间: 2023-11-14 19:11:10 浏览: 191
以下是一些常见的C++大厂面试题及其解答:
1. 什么是多态?如何实现多态?
多态是指同一种操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。在C++中,实现多态有两种方式:虚函数和模板。
- 虚函数
在基类中定义虚函数,派生类可以重写该虚函数。当用基类指针或引用调用该虚函数时,实际调用的是派生类中的函数。这种方式称为动态多态。
- 模板
模板是一种编译期多态性,允许类型参数化。通过模板可以实现函数或类的通用性,同时保持代码的安全性和可读性。这种方式称为静态多态。
2. 什么是智能指针?如何使用智能指针?
智能指针是一种封装了指针的对象,可以自动管理内存,避免内存泄漏和空指针引用等问题。C++11中提供了三种智能指针:unique_ptr、shared_ptr和weak_ptr。
- unique_ptr
unique_ptr是独占式智能指针,用于管理一个对象的内存。它不能被复制,只能通过移动语义转移所有权。当unique_ptr超出作用域或被显式删除时,它所管理的对象会被自动销毁。
- shared_ptr
shared_ptr是共享式智能指针,多个shared_ptr可以共享同一个对象的内存,当最后一个shared_ptr被销毁时,才会释放内存。通过控制块来记录当前有多少个shared_ptr指向同一个对象。
- weak_ptr
weak_ptr是弱引用智能指针,它可以用于解决shared_ptr的循环引用问题。weak_ptr不拥有对象的所有权,只是提供了一种安全的访问方式。
使用智能指针时需要注意避免循环引用和空指针引用等问题。
3. 什么是虚函数?虚函数有什么作用?
虚函数是一种动态绑定的函数,用于实现多态。在基类中定义虚函数,在派生类中可以重写该虚函数。当用基类指针或引用调用该虚函数时,实际调用的是派生类中的函数。
虚函数的作用在于实现多态,使得程序可以在运行时根据对象的实际类型来调用适当的函数。这样可以提高代码的灵活性和可扩展性。
4. 什么是纯虚函数?如何使用纯虚函数?
纯虚函数是一种没有实现的虚函数,在基类中定义纯虚函数,派生类必须重写该函数才能使用。纯虚函数用于定义接口,让派生类来实现具体的功能。
定义纯虚函数可以在函数声明后加上`=0`,如下所示:
```cpp
virtual void func() = 0;
```
使用纯虚函数可以强制规定派生类必须实现某些函数,从而实现多态和接口声明的功能。
5. 什么是模板?如何使用模板?
模板是一种泛型编程技术,通过参数化类型和函数来实现通用性。模板可以实现函数或类的通用性,同时保持代码的安全性和可读性。
在C++中,定义模板可以使用关键字template和typename或class。模板可以有多个参数,可以是类型参数或非类型参数。
模板的使用可以通过实例化来完成,即在模板名后加上具体的类型或值。例如:
```cpp
template<typename T>
void func(T arg) { ... }
func<int>(5);
```
6. 什么是STL?STL中包含哪些容器?如何使用STL容器?
STL是标准模板库的缩写,是C++中的一个重要库,提供了一系列容器、算法和迭代器等工具,用于简化程序开发。
STL中包含以下容器:
- 序列式容器:vector、list、deque、array、forward_list
- 关联式容器:set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multimap
- 容器适配器:stack、queue、priority_queue
使用STL容器可以通过头文件`<container>`和`<algorithm>`来实现。例如:
```cpp
#include <vector>
#include <algorithm>
using namespace std;
vector<int> vec = {1, 2, 3, 4, 5};
sort(vec.begin(), vec.end());
```
7. 什么是RAII?如何使用RAII?
RAII是资源获取即初始化的缩写,是一种C++编程技术,用于自动管理资源的生命周期。RAII的核心思想是:在对象的构造函数中获取资源,在对象的析构函数中释放资源。
使用RAII可以避免资源泄漏和空指针引用等问题,提高代码的可读性和可靠性。一般情况下,RAII可以通过智能指针、文件句柄、锁等方式来实现。
例如,使用智能指针实现RAII可以如下所示:
```cpp
class MyObj {
public:
MyObj() { ... }
~MyObj() { ... }
};
void func() {
unique_ptr<MyObj> ptr(new MyObj());
// ...
}
```
当`func()`函数执行完毕时,`ptr`指向的对象会被自动销毁,从而释放资源。
以上是一些常见的C++大厂面试题及其解答,希望对您有所帮助。
阅读全文