C++学习进展
文章平均质量分 81
Tantanovo
知不足而奋进
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
讲讲引用底层设计
摘要:C++中的引用(左值引用)在语法层面是对象的别名,不占独立存储空间。底层实现上,主流编译器将其视为不可修改的指针常量(Type* const),通过自动解引用操作模拟别名语义。引用强制初始化、不可改向的特性源于底层指针常量的限制。与指针相比,引用牺牲灵活性换取安全性,但性能无本质差异。特殊引用(如常引用、右值引用)通过修饰指针类型实现语义扩展。需注意引用在结构体中实际占用指针大小的空间,且可能悬空(如绑定到局部变量)。引用本质是编译器提供的语法糖,其设计平衡了安全性与效率。原创 2026-06-20 16:22:39 · 368 阅读 · 0 评论 -
nginx集群聊天室(四)项目的mysql数据库表的设置及代码
本文介绍了聊天系统的数据库设计和MySQL连接类实现。数据库包含5个表:User表存储用户信息,Friend表管理好友关系,AllGroup表记录群组信息,GroupUser表关联用户与群组,OfflineMessage表保存离线消息。MySQL连接类封装了数据库操作,包括连接初始化、查询和更新功能,使用C++和MySQL C API实现,支持GBK编码处理中文数据。表间通过外键关联确保数据一致性,并采用InnoDB引擎和utf8mb4字符集。原创 2026-01-13 06:55:18 · 117 阅读 · 0 评论 -
nginx集群聊天室(三)项目架构及实现网络模块代码
本文介绍了一个基于Muduo网络库的聊天服务器分层架构设计。系统采用模块化分层结构,包括网络层(处理TCP/UDP通信)、核心业务层(聊天室逻辑)、数据层(可选)、公共组件层等。重点展示了网络模块的实现,使用TcpServer处理连接和消息回调,并通过ChatService类实现业务逻辑解耦。代码示例包含服务器启动、连接管理、消息处理等核心功能,采用单例模式管理业务处理器,支持登录/注册等消息类型。该设计实现了网络与业务逻辑的分离,具有良好的扩展性和可维护性。原创 2026-01-13 06:34:24 · 79 阅读 · 0 评论 -
nginx集群聊天室(二)muduo的客户端服务器编程框架
本文介绍了基于muduo网络库实现TCP服务器的方法。muduo提供了TcpServer和TcpClient类,采用epoll+线程池模型,将网络I/O与业务逻辑分离。服务器核心包括:1)组合TcpServer对象;2)创建EventLoop事件循环;3)注册连接/断开回调(onConnection)和读写回调(onMessage);4)设置线程数量。代码示例展示了如何实现回显服务器,包括处理客户端连接状态变化、接收数据并回传等功能。服务器启动后通过EventLoop.loop()进入事件循环,使用智能指针原创 2026-01-12 22:53:25 · 734 阅读 · 0 评论 -
nginx集群聊天室(一) 初步讲解集群聊天室所需库的搭建
摘要:本文介绍了一个基于C++ Muduo网络库的集群聊天服务器系统架构。系统采用分层设计,包含客户端→Nginx负载均衡→ChatServer集群→Redis消息队列→MySQL数据持久化的整体流程。关键技术包括:Muduo网络库搭建、JSON数据序列化、Nginx TCP负载均衡配置、Redis发布订阅机制以及MySQL数据存储。项目实现了用户注册/登录、好友/群组管理、在线/离线消息等功能,并通过CMake构建和GitHub管理项目。文中详细提供了Linux环境下Muduo网络库和JSON库的安装配置原创 2026-01-11 21:59:37 · 1062 阅读 · 0 评论 -
线程池学习(七)实现定时(调度)线程池
ScheduledThreadPool是一种定时任务线程池,核心功能包括延迟执行和周期性任务调度。其实现基于优先级队列(最小堆)管理任务,按执行时间排序。支持两种模式:1)一次性定时任务(schedule);2)周期性任务(scheduleAtFixedRate按固定间隔执行,scheduleWithFixedDelay任务结束后延迟执行)。线程池通过条件变量实现任务等待和唤醒机制,包含任务队列线程安全控制、异常处理等功能。关键数据结构是存储定时任务的优先队列,通过比较执行时间实现任务调度。原创 2026-01-09 20:03:48 · 361 阅读 · 0 评论 -
线程池学习(六)实现工作窃取线程池(WorkStealingThreadPool)
工作窃取线程池(WorkStealingPool)是一种高效的多线程任务调度方案。其核心思想是:每个工作线程维护自己的双端任务队列,优先处理本地队列任务(LIFO策略);当线程空闲时,会随机窃取其他线程队列头部的任务(FIFO策略)。这种设计减少了线程间的锁竞争,提高了CPU利用率。实现上采用双端队列支持两端操作,本地线程操作队列尾部,其他线程窃取队列头部任务。通过线程局部存储记录队列索引,并采用随机窃取算法避免集中竞争。该方案特别适合CPU密集型、可分解的并行任务,如数据处理、递归计算等场景。相比传统线程原创 2026-01-07 17:24:15 · 759 阅读 · 0 评论 -
线程池学习(五) 单线程池(SingleThreadPool)
摘要:本文介绍了SingleThreadPool的设计与实现,该线程池具有严格FIFO执行顺序、自然线程安全等特点。核心实现包括同步队列(syncqueue)和单线程池(singlethreadpool)两个组件,使用条件变量和互斥锁保证线程安全。SingleThreadPool适用于需要顺序执行任务的场景,提供了execute和submit两种任务提交方式,支持停止控制和状态查询功能。与FixedThreadPool和CachedThreadPool相比,SingleThreadPool在简单场景和调试场原创 2026-01-06 22:32:12 · 505 阅读 · 0 评论 -
线程池学习(四)实现缓存线程池(Cached ThreadPool)
摘要:CachedThreadPool是一种动态调整线程数量的线程池实现。其核心机制是:当任务到来时优先复用空闲线程,若无空闲线程且未达上限则创建新线程;线程空闲超过60秒(默认)后自动销毁。实现要点包括:1)使用syncqueue管理任务队列;2)通过atomic变量跟踪线程状态;3)支持任务提交和返回值获取;4)动态扩缩容机制。相比FixedThreadPool,它适合处理大量短期异步任务,但需注意线程数量不受限可能导致资源耗尽。最佳实践推荐使用ThreadPoolExecutor进行更精细的控制,包括原创 2026-01-06 21:11:02 · 1120 阅读 · 0 评论 -
线程池学习(三) 实现固定线程池及优化(拒绝策略、改进addtask)
还要避免长时间去执行一个任务,会导致后面的任务大量堆积而得不到及时处理,对于耗时较长的任务可以考虑用单独的线程去处理。在调用者线程中执行该任务。该策略实现了一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将任务回退到调用者(调用线程池执行任务的主线程),由于执行任务需要一定时间,因此主线程至少在一段时间内不能提交任务,从而使得线程池有时间来处理完正在执行的任务。抛弃阻塞队列中最老的任务,相当于就是队列中下一个将要被执行的任务,然后重新提交被拒绝的任务。什么都不做,直接抛弃被拒绝的任务。原创 2026-01-05 23:15:36 · 816 阅读 · 0 评论 -
线程池学习(二)线程池详解
线程池是一种高效管理多线程任务的技术,通过预先创建和维护一组可复用线程来优化系统性能。其核心优势包括线程复用、并发控制、任务排队等,能显著降低线程创建销毁开销,提高响应速度。常见线程池类型包括固定线程池、缓存线程池、单线程池等,适用于不同场景。实现模式主要有领导者-跟随者模式(追求极致性能)和半同步/半异步模式(生产者消费者模式),前者通过动态角色切换实现无锁竞争,后者通过任务队列实现解耦。线程池通过同步队列管理任务分发,在保证线程安全的同时,需注意队列容量控制以防内存溢出。该技术广泛应用于高并发、定时任务原创 2026-01-04 22:01:00 · 1193 阅读 · 0 评论 -
线程池学习(一) 理解操作系统 进程 线程 协程及上下文切换
摘要:本文用公司部门类比操作系统中的进程和线程关系。进程相当于资源容器(部门),线程是实际执行单元(员工)。进程本身不执行代码,仅负责资源分配和隔离;线程使用进程资源完成具体任务。上下文切换开销因任务类型不同而异:进程切换开销最大(涉及内核态切换),线程次之,协程最小(用户态切换)。核心结论:进程确保资源隔离和稳定性,线程实现高效执行,二者缺一不可。在CPU密集型任务中应增加线程或进程,IO密集型任务则适合使用协程或增加线程。原创 2026-01-04 19:43:46 · 821 阅读 · 0 评论 -
C++ 日志4——多线程异步日志
本文介绍了一个高性能多线程异步日志系统的设计与实现。系统采用生产者-消费者模型,通过双缓冲技术解决多线程并发写入问题:前端线程负责生成日志到内存缓冲区,后端线程专门负责将日志写入文件。关键技术包括:1) 使用独立日志线程避免业务线程阻塞;2) 双缓冲交换机制减少锁竞争;3) 批量写入优化系统调用开销;4) 超时刷新保证日志及时性;5) 堆积保护防止内存耗尽。测试表明该系统能有效提升多线程环境下的日志性能,具有低延迟、高吞吐和线程安全等特点,适用于服务器等高性能场景。原创 2025-11-22 19:22:59 · 1171 阅读 · 0 评论 -
C++ 日志 3—— 日志系统的实施和测试
本文详细介绍了日志系统的设计与实现,包含五个核心组件:Timestamp(高精度时间管理)、LogMessage(单条日志构建)、Logger(用户接口)、AppendFile(底层文件IO)和LogFile(日志文件管理)。系统采用分层架构,通过RAII模式、流式API和回调机制实现高效、灵活的日志记录功能。关键技术包括:64KB缓冲区减少IO调用、条件检查优化性能、线程安全设计、自动滚动策略和唯一文件名生成。日志系统支持微秒级时间戳、多线程安全、按大小/时间滚动文件等特性,兼顾性能与可靠性,展现了模块化原创 2025-11-22 15:34:08 · 877 阅读 · 0 评论 -
C++日志 2——实现单线程日志系统
本文详细介绍了日志系统的设计目标与功能需求。系统定位为高效错误定位工具,具备六级日志级别、格式化输出、多线程支持等核心功能。采用前端-后端解耦架构,包含时间戳、日志流、日志对象等5个核心类,通过RAII管理资源生命周期,支持终端和文件两种输出方式。设计注重实用性(兼容Unix工具链)和性能(缓冲IO、微秒时间戳),提供日志滚动、运行时级别配置等高级特性,文件名格式确保全局唯一可追溯。整个系统体现了关注点分离、策略模式等设计哲学,为生产环境监控提供了可靠解决方案。原创 2025-11-18 19:10:08 · 1066 阅读 · 0 评论 -
C++日志 1——日志系统的概念与分类
日志是记录程序运行状态的关键工具,分为广义个人日志和项目开发日志两类。在项目开发中,日志主要有三大作用:调试程序、定位错误和数据分析。根据目的不同,日志可分为面向问题排查、告警提醒、测试调试等六类。日志级别按严重程度分为FATAL、ERROR、WARN、INFO、DEBUG和TRACE六个等级,其中FATAL为最严重错误需立即处理。日志记录应基于功能重要性而非异常与否确定级别,DEBUG和TRACE主要用于开发和测试环境。良好的日志系统是项目维护和分析的重要基础。原创 2025-11-18 19:02:18 · 980 阅读 · 0 评论 -
C++笔记 thread
本文深入剖析C++11 std::thread线程机制,包括:1)线程创建与管理基础;2)内存模型与线程安全问题;3)同步机制(互斥锁、条件变量)原理;4)原子操作与内存序;5)线程池实现;6)线程局部存储;7)异步编程模型;8)性能优化技巧如避免虚假共享。通过代码示例揭示了线程栈空间、共享数据竞争、同步原语等底层机制,并比较了不同同步方式的性能差异,为开发高效多线程程序提供技术参考。原创 2025-11-18 16:32:43 · 729 阅读 · 0 评论 -
C++笔记 剖析智能指针内部结构
本文深入解析C++智能指针的实现机制:unique_ptr通过移动语义和禁止拷贝实现独占所有权,仅封装裸指针;shared_ptr采用引用计数控制块实现共享所有权,包含对象指针和引用计数指针;weak_ptr共享控制块但不增加引用计数。文章还剖析了make_shared的合并分配优化、控制块结构、类型擦除删除器等关键技术,并通过性能测试比较了不同智能指针的开销。智能指针本质上是基于C++语言特性的精巧设计,并非黑魔法。原创 2025-11-18 15:56:12 · 1044 阅读 · 0 评论 -
C++笔记 智能指针
C++智能指针通过RAII机制自动管理内存,解决传统指针的内存泄漏、悬空指针等问题。主要类型包括:unique_ptr(独占所有权)、shared_ptr(共享所有权)和weak_ptr(打破循环引用)。智能指针提供自动释放、线程安全等特性,建议优先使用make_shared/make_unique创建对象,默认选择unique_ptr,仅在需要共享时使用shared_ptr。实际应用场景包括资源管理、缓存系统和观察者模式等。智能指针能显著提高代码安全性和可维护性,是现代C++开发的重要工具。原创 2025-11-18 15:50:47 · 967 阅读 · 0 评论 -
C++笔记 forward完美转发
C++完美转发技术解析 完美转发是C++11引入的核心特性,用于解决函数参数转发时丢失原始属性(左值/右值)的问题。其核心在于通过万能引用(T&&)和std::forward实现参数的零拷贝、原属性转发。关键点包括: 区分左值(具名变量)和右值(临时对象) 使用万能引用作为参数载体 引用折叠规则决定最终类型 std::forward按原始属性转发参数 在lambda中使用auto&&+forward实现高效转发 相比std::move的强制右值转换,std::forward能原创 2025-11-18 15:27:44 · 1070 阅读 · 0 评论 -
Lambda 内存大小与捕获机制详解
摘要: Lambda表达式在C++中的内存占用取决于捕获方式: 无捕获:闭包类为空,大小为1字节(标准要求)。 值捕获:存储变量副本,内存大小等于捕获变量总大小(含内存对齐)。例如,捕获int和char可能占用8字节(4+1+对齐填充)。 引用捕获:本质存储指针(64位系统8字节/个),与引用类型无关。多引用捕获大小为指针数量×8(含对齐)。 混合捕获:内存为值捕获和引用捕获的叠加(如int+string&占16字节)。 关键差异:值捕获保存独立副本,引用捕获仅存指针,两者内存机制完全不同。muta原创 2026-05-06 21:01:32 · 384 阅读 · 0 评论 -
C++笔记 Lambda表达式
C++11引入的Lambda表达式是一种匿名函数特性,允许内联定义临时函数,特别适用于STL算法等场景。其核心语法包括捕获列表、参数列表、返回类型和函数体,支持值捕获和引用捕获方式。Lambda解决了传统函数对象代码冗余问题,使代码更简洁清晰。文章详细讲解了Lambda的基本语法、捕获机制、可变Lambda、初始化捕获等特性,并展示了其在STL算法、回调函数、资源管理等场景的应用。同时介绍了C++14/17/20中的泛型Lambda、constexpr等新特性。最佳实践建议合理使用捕获方式,在性能关键路径考原创 2025-11-18 14:46:06 · 924 阅读 · 0 评论 -
C++笔记 bind函数模板
本文全面介绍了C++中的std::bind功能,包括其基本概念、语法和使用方法。主要涵盖:1)基本绑定语法和占位符使用;2)成员函数和重载函数绑定;3)嵌套绑定与STL算法集成;4)实际应用案例(回调系统、命令模式);5)性能优化和现代替代方案(lambda表达式)。文章强调std::bind在参数绑定、重排序和函数适配方面的优势,同时建议在C++14+中优先使用lambda,需注意生命周期管理和避免过度使用。适用于需要灵活函数适配和回调处理的场景。原创 2025-11-17 22:37:10 · 1237 阅读 · 0 评论 -
C++笔记 function函数包装器模板
摘要 本文全面介绍了C++中的std::function,它是一种通用函数包装器,可以存储、复制和调用各种可调用对象(普通函数、lambda表达式、函数对象、成员函数等)。文章详细展示了std::function的基本用法,包括包装不同类型的可调用对象、状态检查、错误处理等。通过多个实际应用场景(如回调系统、策略模式、事件处理)演示了std::function的强大功能,并探讨了高级特性如函数组合和返回值类型推导。最后提供了性能考量和最佳实践建议,并展示了一个完整的计算器系统实现示例。std::functi原创 2025-11-17 17:58:48 · 915 阅读 · 0 评论 -
C++笔记 仿函数(函数对象)
摘要:仿函数是C++中重载了()操作符的类或结构体,使对象能像函数一样调用。核心优势包括状态保持(可存储中间结果)、模板编程兼容性(支持泛型算法)和性能优化(编译器可内联)。STL内置算术、关系和逻辑三类仿函数,常用于sort、accumulate等算法。高级用法涉及适配器(bind)和组合技术。相比函数指针,仿函数具有更好的内联优化能力;相比Lambda,更适合复用场景。仿函数是C++泛型编程的重要工具,兼具灵活性、类型安全和高性能特性。原创 2025-11-17 16:36:54 · 703 阅读 · 0 评论 -
C++ STL bitset 位图
C++ bitset是一个高效处理固定大小位序列的STL容器类。它通过#include<bitset>引入,编译时确定位数,每位仅占1bit内存空间。支持整数、字符串等多种初始化方式,提供set()、reset()、flip()等位操作方法,以及各种位运算和类型转换功能。典型应用包括权限管理、质数筛选和状态标志系统。相比vector<bool>,bitset内存效率更高但大小固定。使用时需注意越界访问问题,[]运算符不检查边界而test()方法会抛出异常。bitset特别适合需要高性原创 2025-12-24 22:24:27 · 873 阅读 · 0 评论 -
STL——set
摘要:std::set是C++ STL中的关联容器,基于红黑树实现,具有元素唯一性和自动排序特性(默认升序)。核心特点包括:O(logn)时间复杂度的查找/插入/删除操作,不可直接修改元素值(需先删后插),支持高效的范围查询(lower_bound/upper_bound)。与vector和unordered_set相比,set在需要有序访问和范围查询时更具优势,但内存开销较大。典型应用场景包括自动去重排序、快速存在性检查和区间数据查询。使用时需注意其迭代器的const特性和自平衡树结构带来的性能特点。原创 2025-12-15 20:35:37 · 920 阅读 · 0 评论 -
STL_unordered_map
本文介绍了C++中unordered_map的核心概念、实现原理和使用方法。unordered_map是基于哈希表实现的无序关联容器,具有O(1)平均时间复杂度的查找、插入和删除操作。文章详细解析了其底层实现机制,包括哈希函数、桶数组和冲突处理方法,并提供了基本用法示例和性能调优建议。特别强调了自定义键类型需要提供哈希函数和相等比较函数,以及使用时需注意的陷阱,如[]运算符的副作用和迭代器失效问题。最后对比了unordered_map与其他容器的特性差异,并总结了其典型应用场景。原创 2025-12-15 20:49:58 · 650 阅读 · 0 评论 -
C++笔记——STL map
摘要:C++ STL中的map是一种基于红黑树实现的有序关联容器,存储键值对(key-value)且保证键的唯一性。主要特性包括自动排序(O(logn)操作复杂度)、不可修改键但可修改值。常用操作包括insert/emplace插入、operator[]/at访问、find查找和erase删除。map适用于需要有序键值对的场景,若无需排序可使用unordered_map(哈希表实现),允许重复键则用multimap。使用时需注意operator[]的自动插入特性,推荐用find或at进行安全访问。原创 2025-11-08 18:12:56 · 762 阅读 · 0 评论 -
C++笔记——STL list
本文全面介绍了C++标准库中的list容器。list是一种双向链表结构,其核心特性包括:任意位置O(1)时间复杂度的插入删除操作、稳定的迭代器(增删元素不影响其他迭代器)以及非连续的内存布局。与vector和deque相比,list在中间位置操作上具有明显优势,但缺乏随机访问能力。文章详细讲解了list的基本用法、特有操作、性能特点及内部实现原理,并给出了文本编辑器、LRU缓存等典型应用场景。最后总结了list的适用场景:当需要频繁的任意位置插入删除、稳定的迭代器或实现特定算法时,list是最佳选择;而当需原创 2025-11-06 22:48:28 · 1117 阅读 · 0 评论 -
C++笔记——STL deque
摘要:本文全面介绍了C++中的deque(双端队列)容器。作为vector的补充,deque支持高效的头尾操作(O(1)时间复杂度),采用分段数组实现而非连续内存。文章详细对比了deque与vector的差异,包括基本操作、容量管理、迭代器使用等,并通过性能测试展示其头部操作优势。典型应用场景包括滑动窗口、任务队列和撤销系统。最后给出选用建议:当需要频繁头尾操作时选择deque,强调尾部操作和内存连续性时选择vector。理解deque的实现原理有助于合理选用容器类型。原创 2025-11-06 18:08:36 · 1389 阅读 · 0 评论 -
C++笔记 STL lterator迭代器
摘要:迭代器是STL中用于遍历容器的统一接口,它封装了访问元素的细节,使不同结构的容器都能用相同方式操作。迭代器本质上是重载了指针操作符的类对象,分为5种类型:输入、输出、前向、双向和随机访问迭代器,功能依次增强。各容器对应不同迭代器类型,如vector支持随机访问,list仅支持双向。使用中需注意迭代器失效问题,可通过重新获取或erase()返回值避免。STL还提供插入迭代器、流迭代器等适配器扩展功能,并支持自定义迭代器实现。迭代器是泛型编程的核心,实现了算法与容器的解耦。原创 2025-11-10 18:53:37 · 804 阅读 · 0 评论 -
C++笔记 STL——vector
本文全面介绍了C++中的vector容器。vector是一种动态数组,支持随机访问(O(1))和自动扩容,元素在内存中连续存储。文章详细讲解了vector的创建方式、容量管理(size/capacity)、元素访问([]/at/front/back)、修改操作(push_back/insert/erase)等方法,并对比了push_back与emplace_back的效率差异。同时分析了迭代器使用及失效问题,指出可能导致迭代器失效的操作。性能方面,vector尾部操作高效(O(1)),中间操作较慢(O(n)原创 2025-11-06 17:25:38 · 1024 阅读 · 0 评论 -
C++流类库 字符串流
C++字符串流(sstream)提供了内存中的流操作功能,主要包括istringstream(输入)、ostringstream(输出)和stringstream(双向)三类。它们继承自标准IO流,支持<<、>>等操作符,常用于字符串格式化、类型转换和数据解析。ostringstream用于构建格式化字符串,istringstream用于解析字符串数据,stringstream支持双向操作。使用时需注意性能优化(如重用流对象)和错误处理(检查流状态)。字符串流比直接字符串操作更灵活,原创 2025-12-02 16:27:09 · 1131 阅读 · 0 评论 -
C++流类库 文件流操作
std::cout << "修改后 - ID: " << rec.id << ", 数据: " << rec.data << std::endl;std::cout << "ID: " << rec.id << ", 数据: " << rec.data << std::endl;os << "学号: " << id << ", 姓名: " << name << ", 分数: " << score;std::cerr << "无法打开源文件: " << source << std::endl;原创 2025-12-02 15:56:22 · 1248 阅读 · 0 评论 -
C++流类库 标准输入流的安全性与成员函数 ostream 成员函数与自定义类型的IO
std::cout << "实际读取了 " << std::cin.gcount() << " 个字符" << std::endl;std::cout << "你说的是: " << buffer << std::endl;std::cout << "你说的是: " << str << std::endl;原创 2025-12-02 14:47:01 · 1168 阅读 · 0 评论 -
C++流类库 概述及流的格式化输入/输出控制
/ mask 常用值: ios::basefield (dec|oct|hex), ios::adjustfield (left|right|internal), ios::floatfield (scientific|fixed)std::fixed, std::scientific, std::defaultfloat (恢复默认)std::cout << num << std::endl;std::setw(int n) // 设置域宽 (类似width(),只影响下一次IO)原创 2025-12-02 14:43:02 · 768 阅读 · 0 评论 -
C++异常处理 深入机制
本文深入探讨了C++异常处理机制的核心内容:1. 栈展开过程:异常抛出后,系统会沿着调用栈回溯寻找匹配的catch块,期间会自动析构局部对象,确保资源释放(RAII原则)。2. 异常对象生命周期:分析临时对象和局部对象抛出时的构造、拷贝和析构过程,推荐直接在异常存储区构造对象以减少开销。3. 捕获方式比较:详细说明按值捕获和引用捕获的区别,强调使用catch(const ExceptionType&)的优势,包括避免拷贝、支持多态等。4. 异常安全实践:通过RAII技术(智能指针、容器等)确保资源在原创 2025-11-27 19:33:54 · 620 阅读 · 0 评论 -
C++异常处理 进阶
本文深入探讨C++异常处理的高级主题。首先介绍了异常类的层次结构设计,强调派生类应置于基类前捕获的重要性,并展示了多态处理的优势。其次讲解了C++标准异常体系,包括logic_error和runtime_error等派生类的使用,以及如何自定义标准异常子类。然后对比了已废弃的动态异常规范和现代noexcept说明符的最佳实践。最后通过DataProcessor类的完整示例,演示了异常处理的最佳实践方案,包括RAII资源管理、合理的异常类设计、正确的捕获顺序和适当的noexcept使用规范。这些内容为构建健壮原创 2025-11-27 20:12:07 · 766 阅读 · 0 评论 -
C++异常处理 基础
本文介绍了C++异常处理的基础知识。首先对比了C语言错误处理方式(返回值、全局变量等)的局限性,阐述了C++异常机制的优势:强制处理、分离关注点、携带丰富信息和自动传播。重点讲解了异常处理的三个核心关键字:throw抛出异常、try包围可能出错的代码、catch捕获处理特定类型异常。通过除零错误和多种异常类型的实例演示,说明了如何自定义异常类、抛出异常以及按顺序匹配catch块的处理流程。异常处理将业务逻辑与错误处理分离,使代码更清晰易维护。原创 2025-11-27 19:13:55 · 286 阅读 · 0 评论
分享