C++面经
我把上述题目当成试卷,写一下答案哈
1. C++中的构造函数和析构函数有什么区别?
答:「构造函数」用于对象构造时的初始化工作,「析构函数」用来做对象销毁时的工作。
2. 解释一下C++中的拷贝构造函数和移动构造函数。
答:「拷贝构造函数」是用于创建对象的一个副本,拷贝构造函数得函数名和类名相同,参数类型与当前类相同,并通过引用得方式传递。
「移动构造函数」是将资源所有权进行转移,这样的话可以减少开销,省去了创建副本,和释放另一个对象的开销。
3. C++中的模板是什么?它的优缺点是什么?
答:「优点」:代码复用,避免编写重复代码;类型安全:在编译时会进行安全检测。
「缺点」:错误信息复杂,不便于调试。
4. C++中的静态成员与非静态成员有什么区别?
答:1) 非静态成员可以调用成员变量和成员函数,非静态成员则不可以,它没有this指针。
2) 非静态成员函数可以使用virtual函数修饰,静态成员则不可以。
3) 调用时静态成员函数时,必须实例化对象才可以对象,而静态成员通过类名即可直接调用。
5. 解释一下C++中的命名空间(namespace)。
答:我了解到的是它用于避免命名冲突,尤其是在大项目中,命名空间尤为重要。
6. C++中如何实现一个简单的链表?
答:通过结构,定义一个值和一个后继指针即可。
7. C++中的虚函数表(vtable)是什么?
答:它用于存储虚函数的地址,当发生动态绑定时,虚指针vptr就会去查询虚表vtable。
8. C++中的异常处理机制是如何工作的?
答:通过try - catch
9. C++中如何使用std::thread创建和管理线程?
答:thread t1(函数地址,参数);通过join回收线程。
10. 解释一下C++中的多态性及其实现方式。
答:多态通俗讲就是允许基类指针指向派生类指针,通过基类指针,在运行时调用具体指向的对象;总之是通过继承的方式,并需要
virtual关键字修饰,派生类重写。
11. C++中的const修饰符有什么作用?
答:const修饰的变量只读。
12. C++中如何使用std::map和std::unordered_map?
答:map的底层实现是红黑树, 有序不重复,适用于数据有序的场景。
unordered_map的底层是哈希表,适用于查询频繁的场景。
13. 解释一下C++中的函数重载和运算符重载。
答:「函数重载」,函数名相同,参数列表不同,包括参数个数、参数顺序等不同。
「运算符重载」只能重载已有的运算符。
14. C++中如何实现一个简单的计数器类?
答:需要有一个成员变量存储计数,有两个成员函数分别是加1和减一。
15. C++中的内存泄漏是什么,如何防止?
答:内存泄漏,一般指的是堆内存泄漏;当指针对象使用完毕后,要及时释放,或则用一个变量计数,当申请一块内存时 + 1,释放时 - 1,
最后打印这个变量是否为0,查看内存是否泄漏;最根本的解决方式,我认为最好使用智能指针。
16. 解释一下C++中的智能指针的使用场景。
答:auto_ptr好像已经不用了,我也没过多了解。
unique_ptr : 独占式指针,同一时刻只能有一个指针指向同一个对象。
shared_ptr这个是共享式指针,同一个时刻可以有多个指针指向同一个对象
weak_ptr : 用来解决shared_ptr相互引用导致的死锁问题。
17. C++中如何使用std::deque?
答:deque是双端队列,两端都可以插入,也都可以出队。
18. C++中的范围for循环是什么,如何使用?
答 : vector<int> nums;
for (int num : nums) {
cout << num << endl;
}
19. C++中如何实现一个简单的状态模式?
答:不太懂
20. 解释一下C++中的动态内存分配和释放。
答:内存分配就是分配一块空闲的内存来存储数据。当释放时,将这块内存的使用权拿走。
21. C++中如何使用std::unordered_set?
答:std::unordered_set底层是哈希表,通过迭代器获取和修改数据。
22. C++中的函数模板和类模板有什么区别?
答:函数模板是与「类型无关」的函数
类模板是与「类型无关」的类
23. 解释一下C++中的类型限制(SFINAE)。
答:不太懂
24. C++中如何实现一个简单的二叉树?
答:设计一个结构体,包括值,以及左右孩子。
25. C++中的std::function有什么用?
答:它是一个可调用对象包装器,可以将不同的函数包装成统一的调用方式。可调用对象包括普通函数,仿函数、静态成员函数,成员函数(需要
与bind搭配使用才可以)四类。
26. C++中如何使用std::condition_variable进行线程同步?
答:不太懂
27. 解释一下C++中的类型安全(type safety)。
答:类型安全很大程度上等价于内存安全,指是否使用未授权的内存区域。
28. C++中如何实现一个简单的优先队列?
答:通过堆数据结构实现。
29. C++中的std::string与C风格字符串有什么区别?
答:string其实是对C风格字符串的封装,使用起来更加方便,它是可变长字符串。
30. 解释一下C++中的尾返回类型(trailing return type)。
答:不太懂
31. C++中如何使用std::tuple?
答:例如vector<tuple<int, int, int>> nums;
获取数据 nums[0].get(1);
32. C++中的可变参数模板(variadic templates)是什么?
答:不太懂
33. 解释一下C++中的委托构造函数(delegating constructors)。
答:复用已经存在的构造函数代码
34. C++中如何实现一个简单的图遍历算法?
答:bfs和dfs
35. C++中的std::shared_ptr与std::weak_ptr有什么关系?
答:std::weak_ptr用于解决std::shared_ptr的依赖问题。