- 博客(257)
- 收藏
- 关注
原创 08.引用
在 C++ 中,引用是一种别名机制,它为已存在的变量提供了一个新的名称。引用与指针类似,但更安全且易于使用。引用是一个变量的别名,它必须在声明时初始化,并且一旦绑定到一个变量后,就不能再绑定到其他变量。
2025-11-13 19:35:32
797
1
原创 07.指针
可以通过指针间接访问内存内存编号是从0开始记录的,一般用十六进制数字表示可以利用指针变量保存地址指针,它存储了一个内存地址。指针可以指向其他变量或对象的内存地址,通过指针,可以直接访问和操作内存中的数据。
2025-11-13 19:33:43
747
原创 06.函数
函数是一段可重用的代码块,用于执行特定的任务。函数可以提高代码的模块化、可读性和可维护性。C++ 函数包括函数声明、函数定义和函数调用。返回类型:函数返回值的类型(如intvoid等)。函数名:函数的名称,用于调用函数。参数列表:函数接受的输入参数(可选)。函数体:函数的具体实现代码。语法返回类型 函数名(参数列表) {// 函数体语句return 返回值;// 如果返回类型不是 void返回类型 :一个函数可以返回一个值。在函数定义中函数名:给函数起个名称。
2025-11-13 19:33:12
646
原创 05.判断和循环
总结:与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间。总结:和if语句比较,三目运算符优点是短小整洁,缺点是如果用嵌套,结构不清晰。注意:在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环。:在if语句中,可以嵌套使用if语句,达到更精确的条件判断。如果表达式1的值为真,执行表达式2,并返回表达式2的结果;如果表达式1的值为假,执行表达式3,并返回表达式3的结果。中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环。
2025-11-13 19:30:46
978
原创 04.复合类型
数组是存储相同类型元素的连续内存数据结构。数组的大小在声明时固定,不能动态改变。数组元素通过索引访问,索引从0开始。数组可以作为函数参数传递,通常以指针的形式传递。动态数组使用new和delete进行内存管理。标准库中的std::array和比原生数组更安全、更灵活。在 C++ 中,联合体(Union)是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。联合体的所有成员共享同一块内存空间,因此联合体的大小等于其最大成员的大小。
2025-11-13 19:30:04
954
原创 03.运算符
起源:数学与逻辑的抽象。运算符的概念源于数学(+, -, *, /, =)和形式逻辑(&&, ||,!编程语言将这些符号引入,用于操作变量、常量和表达式,执行特定的计算或逻辑功能。运算符的优先级决定了表达式中运算的顺序。优先级高的运算符先执行。()(括号)++--(自增、自减)(乘法、除法、取模)(加法、减法)<<>>(左移、右移)<=>=(关系运算符)==!(相等性运算符)(位运算符)&&||(逻辑运算符)+=-=等(赋值运算符)在 C++ 中,sizeof。
2025-11-13 19:29:30
568
原创 02.数据类型
隐式转换由编译器自动完成,显式转换需要程序员明确指定。const_cast。优先使用 C++ 风格转换,避免不必要的转换,谨慎使用const_cast。
2025-11-13 19:28:37
750
原创 01.C++基础语法
C++是一种通用的、高效的编程语言,广泛应用于系统编程、游戏开发、嵌入式系统、高性能计算等领域。它是C 语言的扩展,同时支持面向过程编程和面向对象编程(OOP)。事实上,任何合法的 C 程序都是合法的 C++ 程序。C++ 由于 1980 年代初期在贝尔实验室开发,最初被称为“C with Classes”。注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。// 变量void print() { // 函数" << endl;
2025-10-09 19:29:10
735
原创 03.接口vs抽象类比较
不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。首先来看一下,在 Java 这种编程语言中,我们是如何定义抽象类的。下面这段代码是一个比较典型的抽象类的使用场景(模板设计模式)。Logger 是一个记录日志的抽象类,FileLogger 和 MessageQueueLogger 继承 Logger,分别实现两种不同的日志记录方式:记录日志到文件中和记录日志到消息队列中。
2025-08-06 15:57:28
911
原创 02.面向对象的特性
面向对象编程是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石。封装、抽象、继承、多态。理解面向对象编程及面向对象编程语言两个概念,其中最关键的一点就是理解面向对象编程的四大特性。四大特性分别是:封装、抽象、继承、多态。关于面向对象编程的特性,也有另外一种说法,那就是只包含三大特性:封装、继承、多态,不包含抽象。为什么会有这种分歧呢?抽象为什么可以排除在面向对象编程特性之外呢?
2025-07-24 11:21:15
1068
原创 01.面向对象设计思想
面向过程和面向对象是两种不同的编程范式。通过一个通俗的案例,可以清晰地展示它们的区别。计算矩形的面积和周长。什么是 UML?我们是否需要 UML?面向对象分析、设计、编程,我们就不得不提到另外一个概念,那就是 UML(Unified Model Language),统一建模语言。很多讲解面向对象或设计模式的书籍,常用它来画图表达面向对象或设计模式的设计思路。实际上,UML 是一种非常复杂的东西。它不仅仅包含我们常提到类图,还有用例图、顺序图、活动图、状态图、组件图等。
2025-07-23 12:25:05
1089
原创 01.数组深入浅出分析
数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。数组的初始化。Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。数据排成像一条线一样的结构。每个线性表上的数据最多只有前后两个方向。除了数组,链表、队列、栈也是线性表结构。非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。
2025-05-20 10:23:44
725
原创 12.项目重构演进之路
文章摘要 本文探讨了项目重构的演进之路,从整体概述到具体实践,详细阐述了重构的背景、要求、目的及设计目标。重构旨在提高代码质量,包括可读性、可扩展性和可维护性,同时避免过度设计。文章指出,重构应分为大型重构和小型重构,前者涉及系统、模块等顶层设计,后者则针对代码细节。重构时需制定计划,分阶段进行,并借助单元测试确保代码逻辑正确。此外,文章还介绍了重构的技术手段,如编写测试用例、mock业务数据、发现代码bug和优化编码方式,以及如何避免重构失败和进行架构设计思考。通过这些实践,项目可以逐步优化,提高整体质量
2025-05-20 10:03:34
1052
原创 11.多用组合和少继承
在面向对象编程中,组合优于继承的原则被广泛推崇。组合通过将对象作为成员变量来复用功能,避免了继承带来的类层次复杂性和维护困难。
2025-05-09 17:45:31
977
原创 10.接口而非实现编程
除此之外,很多人在定义接口的时候,希望通过实现类来反推接口的定义。先把实现类写好,然后看实现类中有哪些方法,照抄到接口定义中。如果按照这种思考方式,就有可能导致接口定义不够抽象,依赖具体的实现。这样的接口设计就没有意义了。不过,如果你觉得这种思考方式更加顺畅,那也没问题,只是将实现类的方法搬移到接口定义中的时候,要有选择性的搬移,不要将跟具体实现相关的方法搬移到接口中,比如 AliyunImageStore 中的 generateAccessToken() 方法。
2025-04-24 19:56:46
682
原创 09.接口vs抽象类比较
不同的编程语言对接口和抽象类的定义方式可能有些差别,但差别并不会很大。首先来看一下,在 Java 这种编程语言中,我们是如何定义抽象类的。下面这段代码是一个比较典型的抽象类的使用场景(模板设计模式)。Logger 是一个记录日志的抽象类,FileLogger 和 MessageQueueLogger 继承 Logger,分别实现两种不同的日志记录方式:记录日志到文件中和记录日志到消息队列中。
2025-04-14 19:33:02
1046
原创 08.面向对象的特性
封装、抽象、继承、多态。实际上,面向对象这个概念包含的内容还不止这些。当谈论面向对象的时候,经常会谈到的一些概念和知识点,为学习后面的几节更加细化的内容做一个铺垫。如果你看了之后,对某个概念和知识点还不是很清楚,那也没有关系。在后面的博客中,会花更多的篇幅,对讲到的每个概念和知识点,结合具体的例子,一一做详细的讲解。来看封装特性。封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。这句话怎么理解呢?
2025-03-24 18:25:29
719
原创 07.迪米特原则介绍
迪米特法则的英文翻译是:Law of Demeter,缩写是 LOD。不过,它还有另外一个更加达意的名字,叫作最小知识原则,英文翻译为:The Least Knowledge Principle。关于这个设计原则,我们先来看一下它最原汁原味的英文定义:把它直译成中文: 每个模块(unit)只应该了解那些与它关系密切的模块(units: only units “closely” related to the current unit)的有限知识(knowledge)。
2025-03-19 19:08:04
920
原创 06.依赖倒置原则介绍
依赖倒置问题思考:“依赖倒置”这个概念指的是“谁跟谁”的“什么依赖”被反转了?“倒置”两个字该如何理解?学习该原则目标:搞懂该原则作用,掌握实现方式,并且应用到实际案例项目中。依赖倒置的定义:高层模块不应该依赖底层模块,应该依赖于抽象。换句话说,设计中应当依赖于接口或抽象类,而不是依赖于具体实现。依赖倒置原则思想:通过依赖抽象层次(如接口、抽象类),可以让高层模块不依赖具体的实现细节,从而使得系统更具扩展性和灵活性。
2025-03-11 18:56:17
1185
原创 05.接口隔离原则介绍
问题:接口臃肿在电商系统中,如果我们为用户设计了一个包含所有操作的接口,会导致接口臃肿,增加了实现类的复杂性。客户端在实现时必须实现所有方法,即使它们中的某些方法在当前场景中不需要使用。解决方式:将大接口拆分成多个小接口,每个接口只包含相关的方法。这样可以提高代码的可维护性和灵活性,减少不必要的依赖。如何理解“接口隔离原则”?理解“接口隔离原则”的重点是理解其中的“接口”二字。这里有三种不同的理解。如果把“接口”理解为一组接口集合,可以是某个微服务的接口,也可以是某个类库的接口等。
2025-03-06 19:40:49
1248
原创 04.里式替换原则介绍
里氏替换原则与开闭原则的关系里氏替换原则与开闭原则密切相关。开闭原则强调对扩展开放、对修改关闭,而里氏替换原则则确保子类能够正确地替换父类,使得扩展在不修改现有代码的情况下进行。在电商交易系统中,遵循里氏替换原则可以确保我们在扩展支付方式、引入新的支付逻辑时,不会破坏已有系统的稳定性。例如,我们可以添加新的支付方式,而不影响原有的支付逻辑。里式替换原则是用来指导,继承关系中子类该如何设计的一个原则理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。
2025-03-05 12:27:30
1105
原创 03.开闭原则详细介绍
如何理解“对扩展开放、对修改关闭”?添加一个新的功能,应该是通过在已有代码基础上扩展代码(新增模块、类、方法、属性等),而非修改已有代码(修改模块、类、方法、属性等)的方式来完成。关于定义,我们有两点要注意。第一点是,开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。第二点是,同样的代码改动,在粗代码粒度下,可能被认定为“修改”;在细代码粒度下,可能又被认定为“扩展”。问题思考:开闭原则的主要用途是什么?如何才能做到对外拓展开放,对内修改关闭?
2025-02-13 09:40:15
1149
原创 02.单一职责原则详解
单一责任原则(Single Responsibility Principle,SRP)是面向对象设计中的一条重要原则。这个原则的英文描述是这样的:A class or module should have a single responsibility。一个类或者模块只负责完成一个职责(或者功能)。也就是说,一个模块或类应该只负责一个特定的职责或功能,通过将功能分解到不同的模块或类中,可以使系统更加灵活、可维护和可扩展。从字面上理解,不难。
2024-12-26 09:45:18
1132
原创 16.迭代器模式设计思想
迭代器模式为遍历集合中的元素提供了一种通用接口。其核心思想是,将集合的遍历逻辑与集合对象的实现分离。通过迭代器,客户端代码无需关心集合的底层实现方式(如数组、链表等),就能顺序地访问集合的每一个元素。迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。它用来遍历集合对象。这里说的“集合对象”也可以叫“容器”“聚合对象”,实际上就是包含一组对象的对象,比如数组、链表、树、图、跳表。
2024-11-25 09:32:02
1001
原创 15.模版模式设计思想
在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?如何保证架构逻辑的正常执行,而不被子类破坏?这个时候可以用模版模式!模板方法模式是类的行为模式。模板模式(Template)将定义的算法抽象成一组步骤,在抽象类种定义算法的骨架,把具体的操作留给子类来实现。
2024-11-20 08:45:04
1148
原创 14.策略者模式设计思想
策略模式是一种行为型设计模式,用于定义一系列可互换的算法,并使它们可以独立于使用它们的客户端而变化。本文档详细介绍了策略模式的基础概念、原理、结构及应用案例,包括折扣计算、文件排序等实际场景,帮助读者深入理解策略模式的实现和优势。此外,并提供了相关代码示例。适合初学者和有一定经验的开发者参考。更多内容定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式属于对象的行为模式。
2024-11-14 20:22:11
1203
原创 13.观察者模式设计思想
观察者模式(Observer Pattern)的定义:定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。01.观察者模式基础主要解决什么问题呢?一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。模式动机:建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。定义:定义对象间一对多依赖关系,当一个对象状态发生改变,其依赖对象都会收到通知并自动更新。02.观察者模式实现。
2024-11-13 09:42:05
920
原创 11.组合模式设计思想
本文详细介绍了组合模式的设计思想和实现方法,涵盖组合模式的基础概念、实现步骤、实例演示、实现方式、优缺点分析等内容。通过具体的代码案例,展示了如何使用组合模式来处理具有层次结构的对象,如文件系统和购物清单,使客户端可以一致地处理单个对象和组合对象。文章还探讨了透明式和安全式组合模式的区别,并提供了设计建议和适用场景。适合初学者和有一定经验的开发者阅读。定义:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。01.组合模式基础。
2024-11-08 19:16:43
1080
原创 10.桥接模式设计思想
本文介绍了桥接模式的设计思想和实现方法。桥接模式通过将抽象部分与实现部分分离,使它们可以独立变化,解决了多层继承带来的复杂性和耦合性问题。文章详细讲解了桥接模式的由来、定义、应用场景和实现步骤,并通过具体实例演示了如何在支付场景中使用桥接模式。此外,还讨论了桥接模式的优缺点及其适用环境,提供了丰富的代码示例和进一步学习的资源链接。桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2024-11-06 19:49:08
961
原创 09.外观模式设计思想
外观模式设计思想:为了解决软件系统中的复杂性和耦合性问题,外观模式提供了一组统一的接口,简化客户端与子系统的交互。主要内容包括外观模式的基础、实现、实例演示、应用场景、优缺点及适用环境。通过创建外观类,将复杂系统的内部实现细节隐藏起来,只暴露出简化的接口给客户端,从而降低耦合度,提高系统的可维护性和可扩展性。门面模式,也叫外观模式,英文全称是 Facade Design Pattern。
2024-11-05 17:13:51
760
原创 08.装饰者模式设计思想
装饰者模式是一种设计模式,用于在不修改原始类的情况下动态地给对象添加新功能。本文档详细介绍了装饰者模式的基础概念、实现方法、应用场景及优缺点。通过具体的咖啡示例和Java I/O流中的应用,展示了装饰者模式的灵活性和实用性。此外,还探讨了半透明装饰者模式的概念及其在实际开发中的应用。适合初学者和有一定经验的开发者学习。装饰者模式又名包装(Wrapper)模式。装饰者模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰者模式动态地将责任附加到对象身上。
2024-11-04 08:48:24
886
原创 07.适配器模式设计思想
适配器模式是一种结构型设计模式,用于将不兼容的接口转换为可兼容的接口,使原本不能一起工作的类可以协同工作。本文详细介绍了适配器模式的基础、实现方式(类适配器和对象适配器)、应用场景(如封装有缺陷的接口、统一多个类的接口、替换依赖的外部系统等)以及优缺点。通过具体案例(如读卡器适配、播放器适配)和实际开发中的应用(如数据库适配器、日志框架适配器),帮助读者深入理解和应用适配器模式。将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
2024-10-31 09:01:00
577
原创 06.动态代理设计模式
本文详细介绍了动态代理设计模式,包括其必要性、概念、实现方式及案例分析。动态代理允许在运行时动态创建代理对象,增强代码复用性和灵活性,减少类膨胀。文章通过对比静态代理,深入解析了动态代理的实现机制,如基于接口和类的动态代理,以及其在Retrofit中的应用。同时,讨论了动态代理的优势和潜在问题,如性能开销和调试难度。最后,提供了丰富的学习资源链接,帮助读者进一步理解和掌握动态代理。动态代理的概括代理类是在运行时生成的。
2024-10-30 12:13:42
1353
原创 05.静态代理设计模式
静态代理定义是什么?代理模式(Proxy Pattern) :为了隐藏与保护目标对象,给某一个对象提供一个代理,并由代理对象控制对原对象的引用。01.静态代理模式基础由来和背景:在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。比如以下场景就适合用代理模式个人,通过中介来找房东发布的租房。乘客,通过火车站来购买铁路局的车票。客户,通过VPN代理来翻墙查阅国外资料。
2024-10-24 22:53:16
959
原创 04.原型模式设计思想
本文详细介绍了原型模式的设计思想,包括其定义、应用场景、实现原理及优缺点。通过邮件复制的例子,阐述了原型模式如何通过克隆现有对象来创建新对象,从而提高性能和减少代码复杂度。文章还对比了原型模式与工厂模式的区别,并讨论了深克隆和浅克隆的实现方式。最后,总结了原型模式在特定场景下的应用价值和局限性。
2024-10-22 20:17:56
1168
原创 03.建造者模式设计思想
本文详细介绍了建造者模式的设计思想及其应用场景。主要内容包括建造者模式的由来、定义、适用场景及思考,通过实例讲解了如何使用建造者模式解决复杂对象的创建问题。文章还对比了建造者模式与工厂模式的区别,并分析了建造者模式的优缺点。最后,提供了多个相关资源链接,帮助读者深入理解和应用设计模式。建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2024-10-21 20:16:32
1085
原创 02.工厂模式设计思想
考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观。如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
2024-10-17 09:39:01
1147
原创 01.单例模式设计思想
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
2024-10-14 20:37:31
1143
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅