当前位置: 首页 > ds >正文

2025年大厂C++面试题总结与解析

目录

  1. 语言特性与内存管理

  2. 面向对象与多态

  3. STL与设计模式

  4. 网络编程与系统设计

  5. 算法与手撕代码

  6. 面试准备策略总结


1. 语言特性与内存管理

1.1 指针与引用的区别

  • 核心区别:指针是存储内存地址的变量,可修改指向;引用是对象的别名,初始化后不可更改。

  • 应用场景:引用常用于函数参数传递(避免拷贝开销)和返回值优化;指针用于动态内存操作和数据结构实现。

  • 代码示例

    int a = 10;
    int *p = &a;   // 指针
    int &r = a;    // 引用

1.2 const关键字的用法

  • 修饰变量const int a = 10; 表示变量不可修改。

  • 修饰成员函数void func() const; 表示该函数不修改对象状态。

  • 与指针结合

    • const int* p(常量指针):指向的值不可变。

    • int* const p(指针常量):指针本身不可变。

1.3 内存管理:new/deletemalloc/free

  • 区别

    • new会调用构造函数,malloc仅分配内存。

    • delete会调用析构函数,free直接释放内存。

  • 内存泄漏防范:优先使用智能指针(shared_ptrunique_ptr)管理资源,避免手动释放。

1.4 智能指针的实现原理

  • 核心机制:基于RAII(资源获取即初始化)和引用计数。

  • shared_ptrweak_ptr

    • shared_ptr通过引用计数共享所有权。

    • weak_ptr解决循环引用问题,不增加引用计数。


2. 面向对象与多态

2.1 虚函数与多态实现

  • 虚函数表(vtable):每个含虚函数的类维护一张虚函数表,对象通过虚表指针(vptr)访问虚函数。

  • 纯虚函数virtual void func() = 0; 定义接口,派生类必须实现。

  • 多态的作用:通过基类指针调用派生类方法,实现接口统一。

2.2 析构函数为何需要声明为虚函数

  • 内存泄漏风险:若基类析构函数非虚,通过基类指针删除派生类对象时,只会调用基类析构函数,导致派生类资源泄漏。

  • 示例

    class Base {
    public:virtual ~Base() {} // 虚析构
    };
    class Derived : public Base { /* ... */ };

2.3 继承与访问控制

  • 访问权限

    • public继承:基类成员保持原有访问权限。

    • protected继承:基类public成员变为protected

    • private继承:基类所有成员变为private


3. STL与设计模式

3.1 vectorlist的区别

  • 底层实现

    • vector:动态数组,支持随机访问(O(1)),插入删除效率低(O(n))。

    • list:双向链表,插入删除高效(O(1)),不支持随机访问。

  • 扩容机制vector通常以2倍容量扩容,避免频繁内存分配。

3.2 单例模式的实现

  • 线程安全版本

    class Singleton {
    public:static Singleton& getInstance() {static Singleton instance; // C++11保证线程安全return instance;}Singleton(const Singleton&) = delete; // 禁止拷贝
    private:Singleton() {} // 私有构造
    };

3.3 右值引用与移动语义

  • 作用:避免深拷贝,提升性能。通过std::move将资源从临时对象“移动”到新对象。

  • 示例

    std::vector<int> v1 = {1, 2, 3};
    std::vector<int> v2 = std::move(v1); // v1变为空


4. 网络编程与系统设计

4.1 TCP三次握手与四次挥手

  • 三次握手:确保双方收发能力正常。

  • 四次挥手:保证数据完整传输,TIME_WAIT状态防止旧数据干扰新连接。

4.2 解决TIME_WAIT过多的问题

  • 方法

    • 设置SO_REUSEADDR允许端口复用。

    • 调整tcp_fin_timeout缩短等待时间。

4.3 I/O多路复用:selectpollepoll

  • 区别

    • select:基于轮询,支持文件描述符数量有限。

    • epoll:基于事件驱动,高效处理高并发连接。


5. 算法与手撕代码

5.1 反转链表

ListNode* reverseList(ListNode* head) {ListNode *prev = nullptr, *curr = head;while (curr) {ListNode *next = curr->next;curr->next = prev;prev = curr;curr = next;}return prev;
}

5.2 LRU缓存实现

  • 核心结构:哈希表+双向链表,保证O(1)的插入和查询。


6. 面试准备策略总结

6.1 核心学习资料

  • 书籍

    • 《C++ Primer》:掌握语言基础。

    • 《Effective C++》:学习最佳实践。

    • 《STL源码剖析》:深入理解容器实现。

6.2 高频考点梳理

  • 必刷题:虚函数机制、智能指针、TCP状态机、手写LRU。

  • 项目经验:结合实际项目解释设计模式与性能优化。

6.3 模拟面试与实战

  • 刷题平台:LeetCode、牛客网(如牛客网C++题库)。

  • 模拟面试:重点练习大厂真题(如百度、美团、腾讯等)。


结语:C++面试不仅考察语言细节,更注重底层原理与系统设计能力。建议结合理论学习和实战编码,逐步构建知识体系。最后,保持对新技术(如C++20特性)的关注,提升竞争力。

http://www.xdnf.cn/news/6583.html

相关文章:

  • 如何在Windows右键新建菜单中添加自定义项,将notepad添加到新建菜单
  • 黑马程序员C++2024版笔记 第0章 C++入门
  • Web安全科普:构建数字世界的“防盗门”
  • 贪吃蛇游戏消息通知功能开发全解析
  • 变分自编码器(Variational Autoencoder, VAE)
  • GDB的使用
  • TCSVT投稿记录
  • JAVA学习-练习试用Java实现“语音识别的基础 :如使用MFCC特征提取和简单的分类器”
  • Python 类变量与实例变量完全指南:区别、使用场景及常见陷阱
  • Vue 3中ref
  • 实验6 电子邮件
  • 【Java学习笔记】【第一阶段项目实践】零钱通(面向过程版本)
  • Vue3学习(组合式API——生命周期函数基础)
  • 分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现
  • 抢购Python代码示例与技术解析
  • 1C:ENTERPRISE 8.3 实用开发者指南-示例和标准技术(Session1-Session3)
  • 《模版初阶》
  • matlab多项式
  • 【unity游戏开发——编辑器扩展】EditorGUIUtility提供一些 EditorGUI 相关的其他辅助API
  • 车载诊断架构 ---车载总线对于功能寻址的处理策略
  • 北京孙河傲云源墅:限量典藏的主城墅居臻品
  • 3.3 掌握RDD分区
  • 密码学刷题小记录
  • 一物一码赋能智能制造:MES如何实现生产全流程数字化追溯
  • JAVA单元测试、反射
  • 在ubuntu系统中将vue3的打包文件dist 部署nginx 并且配置ssl证书 以https方式访问
  • 2025年5月15日
  • 广度和深度优先搜索(BFS和DFS)
  • Ubuntu20.04下如何源码编译Carla,使用UE4源码开跑,踩坑集合
  • Secs/Gem第七讲(基于secs4net项目的ChatGpt介绍)