- 博客(49)
- 收藏
- 关注
原创 【设计模式】创建型:单例模式
摘要: 单例模式是一种创建型设计模式,确保类只有一个实例并提供全局访问点,适用于配置管理器、日志系统等场景。基础实现需私有构造、静态实例和访问方法,并禁止拷贝。简单实现存在线程安全问题,可通过双重检查锁定(DCLP)优化,但仍可能因指令重排序导致未初始化访问。C++11的std::atomic结合内存屏障(如memory_order_acquire)可彻底解决该问题,确保线程安全与正确初始化。最终方案兼顾性能与可靠性,适用于多线程环境。
2025-10-31 10:47:47
952
原创 【设计模式】创建型:工厂模式
工厂模式是创建型设计模式的核心技术之一,主要用于解耦对象创建过程。文章从简单工厂模式入手,分析了直接使用new关键字创建对象导致的高耦合问题,进而提出工厂方法模式通过继承实现开闭原则,最后介绍了抽象工厂模式解决工厂类过多的问题。工厂模式将对象创建逻辑集中管理,有效降低了系统耦合度,提高了代码的可扩展性和维护性,是面向对象设计中实现开闭原则的重要手段。不同层级的工厂模式适用于不同复杂度的业务场景,开发者可根据实际需求选择合适的实现方式。
2025-10-31 10:47:13
416
原创 19 【C++11新特性】智能指针
像指针一样使用 T& operator*() { return _ptr; } T operator->() { return _ptr; } private: T* _ptr; }; } // 结论:管理权转移,不好用 int main() { myPtr::auto_ptr<Date> ap1(new Date); myPtr::auto_ptr<Date> ap2(ap1); // 管理权转移 ap1->_year = 2024; ap2->_year
2025-10-31 10:46:32
706
原创 18.5 【C++】内存泄漏
本文介绍了内存泄漏的概念、危害及解决方法。内存泄漏指程序未释放不再使用的内存,导致内存浪费,长期运行会影响系统性能直至崩溃。主要分为堆内存泄漏和系统资源泄漏两类。文章提供了检测工具推荐,并提出预防措施:良好的编码规范、智能指针管理资源、使用内存管理库及检测工具。最后总结内存泄漏解决方案分为事前预防和事后查错两种方式。
2025-10-31 10:46:09
248
原创 18【C++11 新特性】包装器
C++11包装器(function和bind)用于统一处理不同类型的可调用对象。function作为类模板,可以包装函数、仿函数和lambda表达式,解决模板实例化过多和容器存储问题。bind作为函数模板,能够调整参数顺序或绑定部分参数,生成新的可调用对象。两者配合使用可实现灵活的函数适配,如绑定静态成员函数时无需对象指针。这些特性提升了代码复用性和可维护性,是C++泛型编程的重要工具。
2025-10-31 10:45:26
420
原创 17【C++11 新特性】lambda表达式
C++11的lambda表达式是一种语法简化但功能强大的特性,用于替代函数指针和仿函数。文章首先通过C++98中商品排序的例子展示了传统仿函数实现的复杂性,然后引入lambda表达式实现更简洁的排序代码。详细解释了lambda表达式语法结构:捕捉列表mutable->返回值类型{函数体},并说明各部分功能及使用注意事项。重点阐述了捕捉列表的多种传值方式以及lambda表达式之间的不可赋值特性。最后通过反汇编分析揭示了lambda底层原理:编译器会将其转换为带有operator()的匿名类(仿函数),调
2025-10-31 10:44:36
722
原创 16 【C++11 新特性】可变模板参数
文章摘要 本文介绍了C++11中的可变模板参数特性,重点讲解了两种展开参数包的方法:递归函数方式和包展开表达式。通过示例代码展示了如何利用模板参数包处理不定数量的参数,并详细剖析了参数包传递的底层原理。文章还对比了不同展开方式的适用场景,包括如何配合逗号运算符使用包展开表达式,以及如何处理空参数包的情况。对于需要处理可变数量参数的C++模板编程场景,本文提供了实用的技术实现方案。
2025-10-31 10:43:34
618
原创 【设计模式】六大原则
摘要: 设计模式是解决特定问题的代码设计套路,提升代码复用性、可维护性等。其核心遵循六大设计原则: 单一职责:类/方法功能聚焦; 开闭原则:扩展开放,修改封闭; 里氏替换:子类可安全替换父类; 依赖倒置:高层与低层均依赖抽象; 迪米特法则:减少类间耦合; 接口隔离:接口最小化、精准化。 这些原则共同指导通过抽象构建框架,用实现扩展细节,是衡量代码质量的关键标准。设计模式则是原则在具体场景的实践应用。
2025-10-13 16:32:44
793
原创 15 【C++11 新特性】统一的列表初始化和变量类型推导
C++11标准带来了重大革新,包括140多项新特性和600多处缺陷修复。本文重点介绍了2个实用特性:1)统一的列表初始化语法;2)自动类型推导;。其中详细讲解了列表初始化的实现原理,包括多参数隐式转换和initializer_list机制,并通过自定义vector类展示了如何实现列表初始化功能。这些改进使C++在系统开发、库设计和编程效率方
2025-10-13 16:08:45
1170
1
原创 14 【C++】C++的异常
本文介绍了C++异常处理机制,包括异常的基本概念、使用方式、安全规范以及自定义异常体系。主要内容涵盖: 异常机制的引入背景:解决C语言在错误处理上的局限性,如构造函数错误处理、操作符重载错误等问题。 异常的核心组件:throw抛出异常、try保护代码块、catch捕获异常,以及异常匹配和栈展开原则。 异常使用要点:重新抛出异常处理资源释放,构造函数/析构函数中的异常安全问题,以及异常规范语法。 自定义异常体系:通过继承实现多态处理,建立统一的异常管理规范,提高代码可维护性。 文章通过代码示例展示了异常处理的
2025-09-25 14:52:11
733
1
原创 13 【C++】C++的类型转换
C++类型转换机制解析:从隐式转换到四种命名操作符 摘要:本文深入探讨C++类型转换机制,对比C语言隐式转换的缺陷,详细解析C++引入的四种命名类型转换操作符。static_cast用于相关类型的安全转换,reinterpret_cast实现底层比特重新解释,const_cast处理const限定符,dynamic_cast专用于多态类型检查。文章通过典型场景分析,如循环边界错误、变长数组和const修改陷阱,阐明C风格转换的潜在问题,并展示C++类型转换如何通过更强的类型检查和明确语义提升代码安全性,最后
2025-09-24 22:42:43
672
原创 12 【C++】多态
本文主要探讨C++多态的实现原理及其应用。C++多态通过虚函数机制解决C语言在大型项目中代码冗余、紧耦合等问题。多态需要满足两个条件:继承体系下通过基类指针/引用调用虚函数,且派生类必须重写基类虚函数。虚函数表(虚表)是实现多态的关键,每个含有虚函数的类都有一个虚表指针指向虚函数地址数组。派生类继承基类虚表,重写虚函数时会覆盖虚表中的对应项。文中还分析了虚函数重写的两个特例(协变和析构函数重写),并通过内存布局图示详细解释了虚表的工作机制。多态的实现使得不同类型对象调用同一函数时能产生不同行为,提高了代码的
2025-09-16 15:10:12
740
1
原创 11 【C++】继承
C++继承机制解析:从基础概念到实际应用 摘要:本文系统介绍了C++继承机制的核心概念与应用场景。继承作为面向对象编程的重要特性,解决了C语言在代码复用、抽象建模方面的局限性。文章首先阐述了继承的基本定义和访问权限控制规则,对比了protected与private的关键区别。通过代码示例详细说明了继承与组合的异同点,重点分析了继承特有的"is-a"关系和多态支持特性。同时探讨了继承体系中的作用域规则和对象切片问题,揭示了派生类对象向基类对象赋值的转换机制。本文还强调了继承与模板在代码复用
2025-09-15 15:47:02
820
1
原创 10 【C++】泛型编程
本文介绍了C++中的泛型编程概念,重点讲解了函数模板的使用。文章首先通过交换函数的例子说明函数重载的局限性,引出模板的必要性。然后详细阐述了函数模板的格式、实例化方式(隐式和显式),以及模板实例化的原理。最后讨论了模板参数的匹配原则,包括模板函数与普通函数的共存规则、匹配优先级等。文章指出泛型编程通过编写与类型无关的通用代码,提高了代码的复用性和可维护性,是C++解决复杂项目问题的重要手段之一。
2025-09-04 10:54:36
850
原创 08.5【C++ 初阶】实现一个相对完整的日期类--附带源码
本文实现了一个简单的日期类(Date),支持日期之间的基本运算操作。主要包括:构造函数初始化日期并验证合法性;获取指定月份天数;打印日期信息;重载各种比较运算符(==、<、<=等);实现日期加减天数运算(+=、+、-=、-等);支持自增自减运算符(++、--);计算两个日期之间的天数差。通过运算符重载和成员函数封装,使日期类能够直观地进行各种日期运算操作。类设计采用声明与实现分离的方式,合理使用const修饰符保证安全性。
2025-08-19 23:05:22
364
原创 宇树机器狗Go2的ROS2环境配置
本文介绍了在本地虚拟机中配置宇树科技机器狗Go2的ROS2开发环境的过程。通过网线连接机器狗与主机建立局域网通信。文章详细说明了安装ROS2、配置DDS通信环境的关键步骤,包括添加ROS2存储库、安装依赖项、编译cyclone-dds等,为后续通过ROS2节点控制机器狗运动奠定基础。所有操作均基于宇树科技官方提供的开发文档和GitHub资源。
2025-08-18 10:46:21
1793
2
原创 09 【C++ 初阶】C/C++内存管理
本文主要探讨C++内存管理相对于C语言的改进。C语言在动态内存管理上存在类型不安全、不支持构造/析构函数等问题,而C++通过new/delete运算符实现了面向对象特性支持。文章首先介绍了C/C++程序的内存分布(代码段、数据段、堆栈等),然后对比了C语言malloc/free和C++ new/delete的核心差异:new会自动调用构造函数,delete会自动调用析构函数,且new返回类型安全指针。通过示例代码展示了C++的RAII机制如何更安全地管理堆内存资源,有效解决了C语言中手动资源管理带来的内存泄
2025-08-09 23:50:02
1120
原创 08【C++ 初阶】类和对象(下篇) --- 类知识的额外补充
本文探讨了C++类的构造函数初始化、隐式类型转换及运算符重载等关键概念。首先指出构造函数体中的赋值并非真正的初始化,强调初始化列表对于const、引用和无默认构造成员变量的必要性。其次分析了内置类与自定义类之间的双向隐式类型转换机制,包括单参构造函数实现的隐式转换和类型转换运算符重载。最后补充了前置++和后置++运算符的重载实现方法。文章特别指出可通过explicit关键字禁用隐式转换,确保类型安全。这些内容深入解析了C++类设计的核心原则与实现细节。
2025-08-03 15:42:26
673
1
原创 07【C++ 初阶】类和对象(中篇) --- 类的默认成员函数
这篇文章摘要如下: C++类的构造函数与默认成员函数解析 本文深入探讨C++类中的构造函数及其特性,重点分析了6个默认成员函数的作用机制。文章首先回顾了C++通过封装解决C语言在大型项目中的结构性问题,进而引入构造函数的核心概念——通过自动初始化机制管理对象生命周期。详细讲解了构造函数的6大特性:类同名、无返回值、自动调用、可重载、默认构造唯一性以及必要性。特别强调了默认构造函数的自动生成规则和必需场景,如动态数组和STL容器使用场景。文章还从编译器行为角度解析了对象内存分配和初始化的底层原理,揭示了构造函
2025-07-30 15:37:55
790
2
原创 06【C++ 初阶】类和对象(上篇) --- 初步理解/使用类
C++面向对象编程与类的封装抽象 本文介绍了C++面向对象编程的核心概念和类的关键特性。主要内容包括: 面向对象思想:将系统划分为相互协作的对象,降低耦合度,贴近现实世界。 类的本质:类是C++实现面向对象的产物,是自定义的类型,包含数据属性和行为属性。 封装与抽象: 封装:将数据和操作封装在一起,形成独立单元 抽象:公开接口,隐藏实现细节,降低耦合 通过访问限定符(public/private)控制成员的可见性 类的实现细节: 成员变量存储在对象中,遵循内存对齐 成员函数存储在公共代码区,通过this指针
2025-07-14 21:00:10
755
原创 05【C++ 入门基础】内联、auto、指针空值
本文介绍了C++语言中的三个重要特性:内联函数、auto关键字和指针空值nullptr。内联函数通过消除函数调用开销提升性能,但需注意空间与时间的权衡;auto关键字简化了复杂类型声明,增强代码可读性;nullptr为C++提供了更安全的空指针表示。这些特性分别解决了函数调用效率、类型系统复杂性和指针安全性问题,体现了C++在性能与易用性上的平衡。文章还通过代码示例展示了这些特性的具体应用场景和使用注意事项,为开发者提供了实用参考。
2025-07-01 23:34:17
1119
原创 04【C++ 入门基础】引用
C++引用机制解析与使用指南 本文系统介绍了C++中引用的概念、特性及应用场景。引用是变量的别名,与实体共享内存空间,具有必须初始化、不可重绑定等特性,解决了指针的复杂性和安全性问题。主要应用包括:作为高效安全的输入/输出型参数,避免数据拷贝;作为函数返回值提升大对象返回效率。文章通过代码示例对比了传值与传引用的性能差异,并强调引用使用注意事项:不可返回临时变量、需遵守权限规则(只能缩小或平移权限)。引用机制显著提升了C++在大型项目中的开发效率和代码安全性。
2025-07-01 00:21:04
1030
原创 03【C++ 入门基础】函数重载
C++通过函数重载机制解决了C语言在面对大型项目时的局限性,允许同名函数根据参数类型、个数或顺序的不同实现不同功能。文章通过示例展示了函数重载的使用方法及注意事项,并深入分析了其实现原理:C++编译器在生成符号表时会考虑函数参数,使得重载函数能生成不同符号。同时介绍了extern "C"在混合编程中的重要作用,确保C/C++代码的兼容性。该机制显著提升了代码的可读性、可维护性和安全性。
2025-06-29 15:28:12
608
原创 02【C++ 入门基础】标准输入输出初识/缺省参数
本文介绍了C++标准输入输出和缺省参数的特性。标准输入输出(cin/cout)通过面向对象方式解决了C语言输入输出存在的类型不安全、内存不安全等问题。缺省参数则改善了C语言函数灵活性不足的情况,允许函数参数设置默认值。文章详细说明了全缺省和半缺省参数的使用方法及注意事项,包括参数必须从右往左缺省、不能同时在声明和定义中出现等规则。最后总结了这两项特性对C语言局限性的改进作用。
2025-06-27 21:53:31
723
原创 01【C++ 入门基础】命名空间/域
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。1.命名空间解决的是全局变量的重名问题。2.命名空间使用有三种方法(域作用限定符是关键)。3.“c”式的C语言库,是经过命名空间std封装的库。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2025-06-26 23:35:05
1114
原创 00【C++ 入门基础】前言
C++是基于C语言发展而来的多范式编程语言,兼具过程化、面向对象和泛型编程特性。它的诞生是为了解决C语言在大型工程中的局限性:抽象能力弱、代码复用困难、类型检查不完善和缺乏资源管理机制。从1979年的"C with classes"开始,C++经历了多个版本演进,包括引入虚函数、模板、STL等关键特性,到C++20已发展出模块、协程等现代特性。学习C++需要循序渐进,从基础语法到高效使用再到深入理解对象模型和模板元编程。虽然C++功能强大,但也带来更高的复杂度,开发者需要根据实际需求权衡
2025-06-25 23:18:42
731
原创 【数据结构】第十一站:归并排序和计数排序(附代码和注释)
本文介绍了两种排序算法:归并排序和计数排序。归并排序采用分治思想,通过递归分解数组、合并有序子数组实现排序,具有稳定的O(N logN)时间复杂度,适用于外部排序和链表排序。计数排序利用鸽巢原理直接确定元素位置,适合数值范围集中的场景,时间复杂度O(N+K)。文章详细讲解了两者的实现步骤和代码,并对比了不同排序算法的复杂度及稳定性。归并排序稳定但空间占用较大,计数排序高效但适用范围有限。最后提供了排序算法的性能总结表格,帮助读者全面理解各算法的特点和适用场景。
2025-06-24 17:36:53
609
原创 【算法百题】专题六_模拟
模拟算法,顾名思义,就是一种直接按照问题描述的步骤和规则进行逐步操作的解题方法.它不依赖复杂的数学推导或数据结构优化,而是忠实还原题目要求的处理流程,通过一步步执行指令来解决问题.模拟算法大部分考察的是代码能力.其核心在于:流程还原:将题目中的操作步骤转化为代码逻辑。状态跟踪:维护当前问题的状态(如字符串、数组等),并按照规则更新状态。无需优化:以直观方式实现,不追求效率,确保正确.我本人见的大部分模拟题好像都无可优化(或资历尚浅吧).模拟算法好像有点像暴力解法?
2025-03-17 21:12:21
682
原创 【算法百题】专题七_分治快排_专题八_分治归并
分治顾名思义,就是分而治之,分治是一个思路,并不是由暴力优化而来的,还是因为暴力解的重复比较太多,我们可以将大问题划分为小问题(当然不是无厘头的划分),每次分割后,子问题的规模呈指数级缩小(理想情况下减半),总操作次数从 O(n^2) 降至 O(nlogn).分治的思路,远不止这两种,将问题划分小也不总是针对一个数组的(动规也是分治思想的延伸),但是本专题,针对数组的划分,尽量理解"我们是一名老师,让孩子们站队"的例子.本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2025-03-17 21:08:07
913
原创 【算法百题】专题五_位运算
通过前面的学习,已经知道解一个题,首先从暴力解法入手,过程中尝试发现暴力解法的低效之处,和发现一些题目的规律(如滑动窗口题的指针单向移动性,二分题的二段性,前缀和题的目标可以用数学方法间接表示),从而着手优化:位运算的规律是: 问题有二进制层面的特性位运算优化方向的规律感觉起来比较模糊,一些题目的思路方向清奇,但注意万变不离其宗(预备知识).本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2025-03-04 00:12:51
715
原创 【算法百题】专题四_前缀和
我们的二分算法,是因为在暴力解的过程中发现二段性的规律优化而来的,而我们本章前缀和思想的规律是:有重复计算的部分,而题目所求的目标可以根据题目特性用数学方法转换,从而复用这些重复计算,降低时间复杂度.多说无益,还是以简单例题,理解前缀和思想.由暴力优化算法时选择优化方向要明确找到的规律,不然很可能根源就错了.当然不排除一个题有多种规律和优化思路.本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2025-03-04 00:12:18
968
原创 【算法百题】专题三_二分查找
二分的特点: 细节多,容易死循环,但是理解后,反而又是最简单的算法.所以我们的重点应该在于理解算法的原理.算法的原理解题的模版: (本文章不讨论,根本不需要.)模版又分为:a.朴素的二分模版 -------简单但有局限b.查找左边界的二分模板 -------万能但多细节c.查找右边界的二分模板 -------万能但多细节总是说"理解算法原理" "注意思考的过程"到底是什么?
2025-02-20 23:54:41
963
原创 【算法百题】专题二_滑动窗口
专题二_滑动窗口,滑动窗口,即从双指针暴力枚举法,利用单调性优化而成的特殊的双指针解法,可称“同向双指针”解法。滑动窗口,重点不在于用法,而在于思考的过程,由双层遍历优化成滑动窗口的思考过程.本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2025-02-20 23:54:22
799
原创 【c++、stl】stack和queue的模拟实现(附带源码和注释)
本篇对stl库中stack和queue进行模拟实现,我们当前实现的目的并不是创造比库中更好的容器,而是旨在加深我们对库的理解,加强我们代码实现能力,以及锻炼我们的代码编写能力。stack模拟本文对c++、stl库中stack和queue进行简单分析及代码的简单模拟实现,旨在加深理解。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。stack模拟queue模拟。
2024-02-06 22:29:23
1141
1
原创 【数据结构】第五站:队列(附源码)
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头对队列基本知识摘录以及其C语言代码的实现。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2024-02-06 22:09:40
487
1
原创 【算法百题】专题一_双指针
本文开始我将记录我对基础基础算法预计十八个专题、百道例题的学习历程和心得。双指针题目。本文完全是作者对个人算法经验的记录和累计,顺便进行知识分享,有任何错误请评论指点:)。
2024-01-19 18:39:06
994
1
原创 【数据结构】第十站:交换排序(附代码和注释)
本文介绍交换排序,包括冒泡排序和快速排序。完成了交换排序分析思路和实现,包括冒泡排序和快速排序,同时还分析了快速排序数组有序时的过度递归情况。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2023-11-29 23:43:32
422
1
原创 【数据结构】第九站:选择排序(附代码和注释)
本文开始介绍选择排序本文对选择排序进行详细的分析和代码注释。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。
2023-11-28 11:39:40
176
原创 【数据结构】第八站:排序概念与插入排序(附代码和注释)
开始介绍排序,如下图是我们常见的排序算法,本文介绍插入排序部分。希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。《数据结构(C语言版)》— 严蔚敏《数据结构-用面相对象方法与C++描述》— 殷人昆On1.25On1.25到O1.6∗n1.25O1.6∗n1.25来算。稳定性:不稳定。
2023-11-19 16:07:02
191
1
原创 【c++、stl】list的模拟实现(附带源码和注释)
本文对stl标准库中的list容器进行模拟实现,实现需要我们对初阶数据结构有所了解。如对不熟悉我们的基本模拟流程,可以先从我们的vector模拟实现开始:链接:vector的模拟实现(附带源码和注释)一、模拟前准备还是和vector实现时一样,我们先看stl库中的源码,了解基本实现模式。1.查看源码list是一个链表,先看它的节点结构体。本文对c++stl库中的双向带头循环链表list进行了模拟实现。本文章为作者的笔记和心得记录,顺便进行知识分享,有任何错误请评论指点:)。一、模拟前准备。
2023-11-15 23:11:58
449
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅