跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++ 核心概念与内存管理实战总结

C++ 涵盖面向对象三大特性及编译流程。重点解析多态机制、虚函数底层原理及构造函数析构函数生命周期。对比 new 与 malloc 内存分配差异,阐述智能指针 unique_ptr shared_ptr weak_ptr 的使用场景与循环引用处理。包含 lambda 表达式、内联函数及函数模板等 C++11 新特性讲解。

Eee_123发布于 2026/3/29更新于 2026/6/1016 浏览
C++ 核心概念与内存管理实战总结

C++ 核心概念与内存管理

面向对象和面向过程

面向过程

面向过程编程侧重于步骤和流程,将程序设计成一系列解决问题的步骤。程序被视为由一组函数或过程组成,每个函数完成具体任务,数据在这些函数间传递。

面向对象

面向对象编程关注'对象',将现实事物抽象为程序中的对象。对象包含数据(属性)和操作数据的方法。思想是将数据和操作封装在一起,通过对象交互实现功能。

三大特性
  • 封装:数据和操作封装在对象内部,外部通过定义好的接口访问。
  • 继承:从已有类派生新类,扩展原有属性和方法。
  • 多态:不同对象对同一方法做出不同响应,增强灵活性。

C 语言和 C++ 的区别

  1. 头文件:C 语言常用 .h,C++ 虽兼容但更推荐使用标准库头文件。
  2. 布尔类型:C99 之前无布尔类型,用整数 0 表示假,非 0 表示真;C99 新增 _Bool 及 stdbool.h。C++ 内置 bool 类型。
  3. 编译效率:C++ 基于 C 增加了更多功能,编译器处理逻辑更复杂,但在现代优化下性能差异已不明显。
  4. 语言特性:C++ 不是完全面向对象的语言,它保留了 C 的面向过程特性。C 语言缺乏面向对象带来的易维护、易复用优势。
  5. 重载:C++ 支持函数重载(同名不同参),C 语言不支持。C++ 编译器通过修饰函数名来区分重载,C 语言则会导致重定义错误。

C++ 编译过程

编译流程分为四个阶段:预处理、编译、汇编、链接。

  1. 预处理:处理 # 开头的指令,如展开宏、插入头文件、删除注释。生成 .i 文件。
  2. 编译:将源代码转换为汇编代码,生成 .s 文件。
  3. 汇编:将汇编代码翻译成机器指令的目标文件,如 .o 或 .obj。
  4. 链接:将所有目标文件和库文件连接成一个可执行文件(Windows 的 .exe 或 Linux 的 .out)。

链接解决了跨文件符号引用问题,确保所有调用的函数和变量都能正确找到地址。

多态

是什么?

多态是面向对象的三大特征之一,指不同对象调用同一行为表现出不同形式和结果。本质是一个接口多种实现。

分类

  • 静态多态:编译期间确定绑定,如函数重载、运算符重载、函数模板。
  • 动态多态:运行期间确定绑定,通过虚函数重写实现,属于晚绑定机制。

虚函数

是什么?

基类函数前加 virtual 关键字声明为虚函数。父类指针指向实际对象时,根据运行时对象类型调用对应虚函数。

底层原理

C++ 通过虚函数表(vtable)和虚函数指针(vptr)实现。含有虚函数的类会有一个虚表,存储该类所有虚函数地址。每个对象包含一个 vptr 指向虚表。子类继承时会继承虚表,重写虚函数会替换表中地址,从而实现运行时多态。

解决的问题

将父类的析构函数设为虚析构,确保删除基类指针时能正确释放子类资源。

构造函数不能设置为虚函数?

创建对象时需先调用构造函数初始化,此时虚函数表指针尚未建立,无法支持虚函数机制。

重载、重写、隐藏

  • 重载:同一作用域内,函数名相同但参数不同(类型、个数、顺序)。编译器根据签名区分。
  • 重写:派生类重新定义基类虚函数,名字参数一致。用于通过基类指针调用派生类实现。
  • 隐藏:派生类定义同名的非虚函数或参数不同的函数,导致基类函数被隐藏。

引用

是什么?

引用是变量的别名,创建时必须初始化并绑定到一个有效对象。

好处

  • 不占额外内存,避免大对象复制开销。
  • 作为函数参数可修改实参,且比指针更安全可读。
  • 返回左值引用可避免拷贝构造。

为什么不能初始化为空?

引用必须绑定到有效对象,一旦创建不可更改指向。这与指针不同,指针可为空且可变。

引用与指针的区别

  • 本质:指针是变量存地址,引用是别名。
  • 初始化:引用必须初始化,指针可选。
  • 赋值:指针可改变指向,引用不可。
  • 解引用:指针需 * 操作,引用直接访问。
  • 多级:指针有多级概念,引用没有。
  • 返回值:返回局部变量引用会导致悬垂引用,返回指针则为野指针,均不安全。

内存分区

堆和栈的区别

  • 栈:自动管理,函数调用时分配,退出时释放。
  • 堆:手动申请和释放,使用 new/malloc 申请,delete/free 释放。

指针常量和常量指针

  1. 指向常量的指针 (const int *p):指针可变,内容不可改。
  2. 常量指针 (int * const p):指针不可变,内容可变。
  3. 指向常量的常量指针 (const int * const p):指针和内容均不可改。

NULL 与 nullptr

  • C 语言:NULL 通常定义为 (void *)0,利用隐式转换赋给任意指针。
  • C++:NULL 定义为 0,因 C++ 类型检查严格。推荐使用 nullptr,具有专门类型 std::nullptr_t,类型安全且语义清晰。

构造函数与析构函数

构造函数

  • 函数名与类名相同,无返回值。
  • 创建对象时自动调用,未定义时编译器提供默认无参构造函数。
  • 成员变量初始化应在初始化列表中进行。

拷贝构造

  • 调用时机:用一个对象初始化新对象、值传递参数或返回值。
  • 参数要求:必须是引用,否则会导致无限递归。加 const 避免修改实参。
  • 深浅拷贝:浅拷贝仅复制指针地址,深拷贝复制堆区实际内容。

析构函数

  • 函数名与类名前加 ~,无参数返回值。
  • 销毁对象时自动调用,负责释放成员变量指向的堆区内存。

new 和 malloc

区别

  • new/delete:C++ 运算符,自动计算大小,返回正确类型指针,可重载,失败抛异常。
  • malloc/free:C 库函数,需手动指定字节数,返回 void*,需强转,失败返回 NULL。

底层机制

  • new 先调用 malloc 分配内存,再调用构造函数初始化。
  • delete 先调用析构函数清理资源,再调用 free 释放内存。
  • new[] 和 delete[] 分别处理数组,依次调用析构函数。

C++11 新特性

lambda 表达式

匿名函数,可在局部作用域直接定义,适合临时回调。支持捕获外部变量,但逻辑不宜过于复杂。

内联函数

建议编译器将函数体插入调用处,减少调用开销。适用于简单频繁调用的函数。递归函数通常不适合内联。

智能指针

解决手动管理内存导致的泄漏问题,核心是引用计数。

  • unique_ptr:独占所有权,不可复制,可用 std::move 转移所有权。
  • shared_ptr:共享所有权,引用计数减至 0 时释放。注意不要直接用原始指针初始化多个 shared_ptr。
  • weak_ptr:弱引用,不增加计数,用于打破循环引用。

函数模板

允许编写通用代码,避免重复。编译器根据参数类型生成实例。STL 广泛使用模板特化来处理特定类型需求。

目录

  1. C++ 核心概念与内存管理
  2. 面向对象和面向过程
  3. 面向过程
  4. 面向对象
  5. 三大特性
  6. C 语言和 C++ 的区别
  7. C++ 编译过程
  8. 多态
  9. 是什么?
  10. 分类
  11. 虚函数
  12. 是什么?
  13. 底层原理
  14. 解决的问题
  15. 构造函数不能设置为虚函数?
  16. 重载、重写、隐藏
  17. 引用
  18. 是什么?
  19. 好处
  20. 为什么不能初始化为空?
  21. 引用与指针的区别
  22. 内存分区
  23. 堆和栈的区别
  24. 指针常量和常量指针
  25. NULL 与 nullptr
  26. 构造函数与析构函数
  27. 构造函数
  28. 拷贝构造
  29. 析构函数
  30. new 和 malloc
  31. 区别
  32. 底层机制
  33. C++11 新特性
  34. lambda 表达式
  35. 内联函数
  36. 智能指针
  37. 函数模板
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Vue 组件开发中的枚举值验证:从 Type 属性错误说起
  • 现代 C++ 新特性 constexpr 详解:从 C++11 到 C++20 的演进
  • 基于 Windows 环境搭建 OpenClaw 项目部署指南
  • 大模型时代下传统程序员是否仍需编写代码
  • 数据驱动多离散场景分布鲁棒电热综合能源系统优化 (Matlab 实现)
  • 通过 URI Scheme 实现从 Web 页面启动本地 C++ 应用程序及源码示例
  • Nginx 配置 SSL 报错:缺少 ngx_http_ssl_module 模块的解决方法
  • PX4 无人机结合 MID360 与 FAST-LIO 实现室内定位及定点
  • 二分查找实战:山脉数组的峰顶索引与寻找峰值
  • AI 大模型开发指南:三本经典书籍深度解析
  • OpenClaw 龙虾机器人 Windows 系统部署指南
  • 基于动态反演和扩展状态观测器的无人机鲁棒反馈线性化自适应姿态控制器
  • AC-MPC:微分 MPC 赋能强化学习,实现高速无人机竞速
  • 栈的经典算法应用:LeetCode 精选题目解析
  • 整合LLama-Factory引擎重塑游戏NPC对话逻辑
  • Flash 存储磨损均衡算法原理与实现
  • 使用 Python 和 AI 构建智能害虫识别助手
  • 网络安全学习指南:核心知识与路径
  • Seedream 4.0 企业级图像生成能力与应用场景深度解析
  • AI 办公实战:7 本好书助你构建高效工作流

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online