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

C++ 核心技术点解析:从多态到智能指针

C++ 语言特性涵盖面向对象设计、多态机制及内存管理等核心内容。文章解析了封装、继承、多态三大特性,深入探讨虚函数底层原理与构造析构限制。对比了指针与引用、堆栈内存区别,详解 new/delete 与 malloc/free 差异。同时介绍 C++11 新特性如 lambda 表达式、内联函数及智能指针 unique_ptr、shared_ptr 和 weak_ptr 的使用场景与注意事项。

刀狂发布于 2026/3/24更新于 2026/7/629 浏览
C++ 核心技术点解析:从多态到智能指针

C++ 核心机制与内存管理

面向对象与面向过程

面向过程编程更关注解决问题的步骤,将程序视为一系列函数或过程的组合。每个函数完成具体任务,数据在函数间传递。

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

三大特性

  • 封装:数据和操作封装在对象内部,外部只能通过接口访问。
  • 继承:新类可继承并扩展原有类的属性和方法。
  • 多态:不同对象对同一方法做出不同响应,增强灵活性。

简单来说,面向过程是把程序看作由函数组成的过程,而面向对象则是将元素视为对象。

C 语言与 C++ 的区别

  1. 头文件:C 语言常用 .h,C++ 虽兼容但推荐使用标准库头文件。
  2. 布尔类型:C99 之前无布尔类型,用 0 表示假,非 0 表示真;C++ 内置 bool 类型。
  3. 编译器效率:C++ 因支持更多高级特性,编译开销略高于 C,但提供了更强的抽象能力。
  4. 语言定位:C++ 不是更好的 C,而是基于 C 的另一种语言。它包含 C 的特性,同时支持面向对象,易于维护、复用和扩展。
  5. 重载:C 语言不支持函数重载,C++ 支持。重载指同一作用域下函数名相同但参数类型、个数或顺序不同。C++ 编译器通过修饰函数名来区分重载函数。

C++ 编译过程

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

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

多态详解

多态是面向对象的三大特征之一,指不同对象调用同一行为表现出不同形式。可以理解为'一个接口,多种实现'。

分类

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

虚函数

概念与底层

在基类函数名前加 virtual 关键字声明为虚函数。底层通过虚函数表(vtable)和虚表指针(vptr)实现。每个含虚函数的类都有一个虚函数表,存储所有虚函数地址。对象创建时初始化 vptr 指向对应的虚表。子类继承父类时会继承虚表,若重写虚函数则替换表中地址,从而实现运行时多态。

构造函数与析构函数
  • 构造函数不能设为虚函数:对象创建时需先调用构造函数,此时虚表指针尚未建立,无法支持虚函数机制。
  • 虚析构函数:建议将父类析构函数设为虚函数,确保通过基类指针删除对象时能正确释放子类资源。

重载、重写与隐藏

  • 重载 (Overload):同一类中名字相同但参数不同的函数。用于处理类似任务。
  • 重写 (Override):派生类重新定义基类虚函数,参数列表一致。用于提供新版本实现。
  • 隐藏 (Hide):派生类定义同名的非虚函数,或参数列表不同,导致基类函数被隐藏。

引用与指针

引用

引用是变量的别名,创建时必须初始化且不可更改指向。

  • 优势:不占额外内存,避免大对象拷贝开销;作为函数参数可避免指针解引用的复杂性;返回左值时可避免拷贝构造。
  • 注意:引用不能为空,不能初始化为空对象。返回局部变量引用会导致悬空引用错误。

引用与指针区别

  • 本质:指针是变量,存储地址;引用是别名。
  • 可变性:指针可改变指向,引用一旦绑定不可更改。
  • 访问方式:指针需解引用,引用直接访问。
  • 多级:指针支持多级,引用不支持。
  • 空值:指针可为空,引用不可为空。
  • 运算:指针 ++ 是地址偏移,引用 ++ 是值增加。

内存分区与管理

堆与栈

  • 栈:自动管理,函数调用时分配,返回时释放。
  • 堆:手动管理,使用 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,类型安全且语义清晰。

new/delete 与 malloc/free

特性new/deletemalloc/free
类型运算符库函数
返回值正确类型指针void*
构造/析构自动调用不调用
失败处理抛出异常返回 NULL
重载可重载不可重载
  • new 原理:先调用 malloc 分配内存,再调用构造函数初始化对象。
  • delete 原理:先调用析构函数清理资源,再调用 free 释放内存。
  • 数组释放:delete[] 会依次调用数组中每个对象的析构函数。

C++11 新特性

Lambda 表达式

Lambda 允许在代码中直接定义匿名函数,适合临时回调场景。它能捕捉外部变量,简化局部逻辑。但过于复杂的逻辑建议使用传统函数。

内联函数

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

智能指针

C++ 没有垃圾回收机制,智能指针用于自动管理内存,防止泄漏。

  • unique_ptr:独占所有权,不可复制,可通过 std::move 转移所有权。
  • shared_ptr:共享所有权,内部引用计数,最后一个销毁时释放内存。注意不要用一个原始指针初始化多个 shared_ptr。
  • weak_ptr:弱引用,不增加引用计数,用于打破 shared_ptr 循环引用。

函数模板

允许编写通用代码,避免为不同类型重复编写相似函数。编译器根据参数类型自动生成实例。STL 广泛使用模板实现容器和算法。需注意模板特化以处理特定类型的特殊逻辑。

目录

  1. C++ 核心机制与内存管理
  2. 面向对象与面向过程
  3. 三大特性
  4. C 语言与 C++ 的区别
  5. C++ 编译过程
  6. 多态详解
  7. 分类
  8. 虚函数
  9. 概念与底层
  10. 构造函数与析构函数
  11. 重载、重写与隐藏
  12. 引用与指针
  13. 引用
  14. 引用与指针区别
  15. 内存分区与管理
  16. 堆与栈
  17. 指针常量与常量指针
  18. NULL 与 nullptr
  19. new/delete 与 malloc/free
  20. C++11 新特性
  21. Lambda 表达式
  22. 内联函数
  23. 智能指针
  24. 函数模板
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Stable Diffusion 常用模型详解:Checkpoint、LoRA 与 ControlNet 等
  • C++ 进阶:AVL 树的原理与实现
  • Slack 机器人集成 IndexTTS 发送语音消息提醒
  • C++模板与泛型编程:构建灵活代码架构
  • @anthropic-ai/claude-code 快速上手指南
  • OpenClaw 飞书机器人部署记录
  • AI 产品经理面试核心问题与实战解答指南
  • OpenCV 调整图像对比度与亮度的方法
  • Figma + Claude + Weavy AI:构建高效 UI 设计工作流
  • 直流无刷电机 FOC 控制算法详解与 STM32 实现
  • 分治归并排序核心原理及 LeetCode 实战
  • Emotion2Vec+ Large 语音情感识别 WebUI 界面优化实战
  • Python 启动器 py.exe 功能与使用指南
  • 基于 LlamaIndex 实现 Agent 智能体
  • 世界职业院校技能大赛人工智能赛道解析
  • FLUX.1-dev FP8 模型部署与低显存优化实战
  • 深度学习模型优化策略与实战调参
  • C++ Lambda 表达式详解
  • 移动前端开发与 Web 前端开发的区别
  • 基于 Spark 与 Django 的电影票房预测及推荐系统

相关免费在线工具

  • 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