- 博客(113)
- 资源 (10)
- 收藏
- 关注
原创 ACS712工作原理(20A为例)、设计及PCB布线
概述ACS712 是 Allegro 公司新推出的一种线性电流传感器,该器件内置有精确的低偏置的线性霍尔传感器电路, 能输出与检测的交流或直流电流成比例的电压。 具有低噪声,响应时间快(对应步进输入电流,输出上升时间为5μ s),50 千赫带宽,总输出误差最大为 4%, 高输出灵敏度( 66mV/A~ 185 mV/A), 使用方便、性价比高、 绝缘电压高等特点, 主要应用于电动机控制、 载荷检测和管理、 开关式电源和过电流故障保护等,特别是那些要求电气绝缘却未使用光电绝缘器或其它昂
2022-04-12 11:25:31
48150
4
原创 Altium Designer 20相关操作及使用技巧
1、复制:选中后,按shift实现复制2、位号designator:R? C? U?3、多个引脚,阵列式操作。引脚序号可以修改主增量和次增量实现奇偶和差值4、镜像:在粘贴状态下按Y5、使用现有的原理图库:在已经有的原理图中,使用“生成原理图库”命令,可按照默认设置,就可以生成该原理图中的元件库,可以通过粘贴复制到自己的原理图库中,这样就方便使用;注意复制后对元件属性按照自己需要进行变更6、修改原理图框图大小,双击边沿,选择尺寸,比如从A4改为A37、快速设置修改封装(单个或多个一起):使用
2021-07-26 10:51:50
27101
原创 DC-DC电源芯片(VIPER22A)的BUCK电路使用说明
先贴电路图:DC-DC电源芯片BUCK方式的使用一般都是分三步:1、启动(start up)2、DC-DC电路工作(细分又是储能和放电两个小过程)3、反馈调节,让输出电压稳定在一个电压值(即我们说的电源电压)BUCK降压的基本作用可以去看看其他书籍,说到底就是用PWM去调制另外一个电压,大小由占空比来控制,我们在这里不在细说。我们先从上面说的第2步开始解释,这个是电路的基本拓扑(上图是非同步方式),由开关管(由VIPER22A充当),L3 、C46、D10四个器件组成:电流由VIPER22
2021-07-22 20:34:14
26807
7
原创 直流无刷电机无感检测电路原理
直流无刷电机无感检测方式的定义:无感就是靠检测悬浮相的感应电动势“过零点”。悬浮相:不通电的那一相感应电动势:运动中的导体切割磁感线产生过零点??以6步两两导通的第一次换向为例,如上图。在a图中,c相产生的感应电动势(右手定则)方向为X(由外往里),转过60°后,产生的感应电动势为.(由里向外),假如以由外到里为正方向,则感应电动势必然产生了一个由正到负的过程,即是“过零点”理论上的换向位置是在T1 T2 …T6时刻,往前推30°,都有某一相的过零点(AB相通电时C相有过零点事件,AC导
2021-07-02 08:58:41
13551
10
原创 C++中的namespace
无名命名空间的成员,本质是当前文件的全局变量 / 函数,但无法被其他文件通过extern访问,比static(C 语言的文件私有)更适合 C++ 的语法体系。直接引入某个命名空间的所有成员,后续可以像使用全局标识符一样直接用,适合小型程序 / 测试代码,但大型项目 / 库开发中要谨慎(可能再次引发命名冲突)。在没有命名空间的 C 语言中,所有全局标识符(变量、函数)都在全局命名空间中,一旦重名就会编译报错。(3)using namespace 命名空间名(引入整个命名空间,简化书写,谨慎使用)
2026-02-06 08:45:43
800
原创 C++中const修饰成员函数
const修饰成员函数时,要写在函数参数列表后、函数体前(有virtual则在virtual后),其核心作用是:保证该成员函数不会修改当前对象的任何非静态成员变量,且只能调用其他 const 成员函数。核心:const成员函数的this指针是 “指向 const 对象的 const 指针”,因此无法通过this修改成员变量 —— 这也是 const 函数不能修改非静态成员的底层原因。原因:普通成员函数 “可能修改对象”,而 const 成员函数承诺 “不修改对象”,因此不能调用有修改风险的普通成员函数。
2026-02-02 11:22:04
449
原创 C++中空指针访问成员函数
如果func内不使用this指针(不访问成员变量),仅执行固定逻辑,那么即使this是空指针,也能正常执行(因为没解引用this);空指针调用成员函数在语法上是允许的(编译器不报错),但逻辑上是错误的 —— 除非你明确知道函数内不访问成员变量,否则绝对不要这么写。成员函数的存储:所有非静态成员函数都存储在代码段(全局共享),不属于任何对象,对象的内存中只存成员变量;核心原因:成员函数存在于代码段,调用仅需传入this指针;空指针可以调用非静态、非虚、且不访问成员变量的成员函数(语法合法,运行不崩溃);
2026-02-02 11:11:20
247
原创 C++中的this指针
先明确核心需求:链式调用需要 “操作同一个对象”链式调用(如p.addAge(5).addAge(3))的本质是:第一次调用p.addAge(5)的返回结果,必须还是原来的 p 对象,这样才能接着调用addAge(3)。如果返回值不是原对象,链式调用就会操作 “临时对象”,达不到修改原对象的目的。为什么返回Person&(引用)?引用的本质:原对象的 “别名”
2026-02-02 11:02:57
259
原创 C++中的对象模型
多态实现:虚函数会为对象添加虚表指针(vptr),指向存储虚函数地址的虚表(vtable),重写虚函数本质是替换 vtable 中的函数地址;C++ 对象模型的本质是:将类的成员变量存储在对象的内存空间中,成员函数则存储在代码段(全局共享),通过this指针关联对象和成员函数。基础规则:对象内存仅包含非静态成员变量(含内存对齐填充),成员函数 / 静态成员不占对象内存;继承布局:子类内存 = 基类成员(含 vptr) + 子类成员,多继承会有多个 vptr;三、进阶场景 1:含虚函数的类(多态的底层实现)
2026-02-02 09:44:36
250
原创 C++中类的静态成员
可以把类想象成一个 “工厂”,普通成员是每个 “产品(对象)” 独有的属性 / 功能,而静态成员是工厂本身的属性 / 功能,所有产品共用。类的静态成员分为静态成员变量和静态成员函数,核心特征是:不属于某个具体的对象,而是属于整个类,所有对象共享这一份资源。工具函数封装:无需创建对象就能调用的通用功能(如数学计算、数据校验),封装成静态成员函数;核心记忆点:静态成员是 “类的资源”,普通成员是 “对象的资源”,这是两者最本质的区别。静态成员(变量 / 函数)属于整个类,而非单个对象,所有对象共享;
2026-02-02 09:29:00
350
原创 C++中类对象作为类成员
可以理解为 “先创建的后销毁”:比如你先打开冰箱(构造),再放东西(构造),销毁时要先拿走东西(析构),再关上冰箱(析构),符合资源管理的 “栈式” 逻辑。核心逻辑:构造 “从依赖到自身”(先初始化成员,再初始化自身),析构 “从自身到依赖”(先销毁自身,再销毁成员),且析构严格逆序构造,保证资源安全释放。先调用所有成员对象的构造函数(调用顺序 = 成员在类中声明的顺序,而非初始化列表的顺序);简单记:构造 “先成员后自身”,析构 “先自身后成员”,成员构造按声明序,析构按构造逆序。
2026-02-02 09:15:14
179
原创 c++中的函数模版
函数模板是泛型函数的蓝图,通过template <typename/class 类型参数>声明通用类型,编译器根据调用的实际参数实例化出具体类型的函数,核心支持单参数、多参数、默认参数三种形式,typename和class在此处完全等价(推荐用typename更语义化)。当普通函数和函数模板同名重载时,编译器按优先级从高到低选择,核心规则可总结为:匹配的普通函数 > 模板实例化函数 > 普通函数的隐式转换,且可通过函数名<类型>()强制调用模板。
2026-01-27 09:06:07
662
原创 c++中的多态
C++ 中的多态,这是 C++ 面向对象三大特性(封装、继承、多态)的核心,核心作用是让基类的指针 / 引用,调用子类的重写方法,实现 “一个接口,多种实现”,让代码更灵活、可扩展。当基类指针 / 引用调用虚函数时,程序运行时会通过对象的虚表指针(vptr) 找到对应的虚函数表,再根据函数索引找到实际要调用的函数地址,最终执行子类的重写方法。先明确 C++ 多态的核心分类:静态多态(编译时多态) 和动态多态(运行时多态),其中动态多态是 C++ 多态的核心,也是日常开发中最常用的,我们会重点讲解。
2026-01-26 15:48:32
562
原创 C++中的继承
继承是 C++ 面向对象三大特性(封装、继承、多态)的核心,核心价值是代码复用和层次化类设计。本文全面覆盖继承的语法、对象模型、构造析构、同名成员处理、多继承及菱形继承等关键知识点,并附注意事项和示例。当子类与基类有同名成员(属性 / 方法)时,默认访问子类成员,需通过作用域解析符:: 访问基类同名成员。静态成员属于类(而非对象),同名处理规则与普通成员一致,但有 2 种访问方式(对象 / 类名)。继承方式决定基类成员在子类中的访问权限,C++ 支持 3 种继承方式,默认是private。
2025-12-30 11:18:45
847
原创 c++中的函数调用运算符重载
在 C++ 中,函数调用运算符 () 的重载是一种特殊的运算符重载方式,允许自定义类的对象像函数一样被调用(这类对象也被称为 “函数对象” 或 “仿函数”)。相比普通函数,函数对象(仿函数)在需要 “带状态的函数逻辑” 或 “重载不同参数的函数行为” 时,优势尤为明显。operator() 是成员函数专属的重载运算符,全局函数无法重载(因为对象()的语法要求左操作数是类对象)。函数对象的核心优势是可保存状态(成员变量),这是普通函数无法做到的。加const后,常量对象也能调用该运算符。
2025-12-30 08:52:53
325
原创 c++中的关系运算符重载
若重载为全局函数,左 / 右操作数类型对称(如 operator==(int, Person) 和 operator==(Person, int))。= 基于 == 实现,>= 基于 < 实现,<= 基于 > 实现,减少代码重复。= 可基于 == 实现,>= 可基于 < 实现,避免重复代码。排序算法(如 std::sort)中,自定义类对象的排序规则(需重载 <);容器查找(如 std::find)中,判断元素是否相等(需重载 ==)。C++ 不会为自定义类默认生成 ==、< 等关系运算符(需手动重载)。
2025-12-30 08:39:01
390
原创 C++中的赋值运算符重载
在 C++ 中,赋值运算符(=) 是最常用的运算符之一,默认情况下编译器会为类生成一个「浅拷贝赋值运算符」,但当类包含指针、动态内存、文件句柄等资源时,浅拷贝会导致「双重释放」「内存泄漏」等问题,因此需要手动重载赋值运算符,实现深拷贝。2、默认浅拷贝的问题:编译器生成的默认赋值运算符仅拷贝成员变量的值(浅拷贝),若成员是指针,会导致两个对象指向同一块内存;1、必须重载为成员函数:赋值运算符(=)不能重载为全局函数(编译器强制要求),因为左操作数必须是当前类对象;二、重载语法(成员函数)
2025-12-28 21:28:34
593
原创 C++中的递增运算符重载
在 C++ 中,递增运算符(++) 分为前置递增(++obj) 和后置递增(obj++),两者语义不同,重载方式也有明显区别。递增运算符是单目运算符,通常重载为类的成员函数(更符合语义,因为操作数是类对象本身),也可重载为全局函数(极少用)。前置递增必须返回引用(MyInt&):若返回值,会生成临时对象,链式操作(++(++a))会修改临时对象,而非原对象;后置递增必须返回值(MyInt):若返回引用,会返回临时对象的引用(临时对象销毁后,引用悬空,导致未定义行为)。二、重载语法(成员函数方式,推荐)
2025-12-28 20:47:02
347
原创 C++中左移运算符重载
2、必须重载为全局函数 / 友元:若重载为成员函数,左操作数会被绑定为当前类对象(如 obj << cout),违反 cout << obj 的使用直觉,因此只能用全局函数,且需声明为类的友元(以访问私有成员);cout << c;若返回 ostream(值返回),会拷贝 cout(ostream 不支持拷贝),导致编译错误,必须返回 ostream&(引用)。3、返回值为 ostream&:支持链式输出(如 cout << obj1 << obj2 << endl);七、与右移运算符(>>)重载的配合。
2025-12-28 20:01:04
443
原创 C++中的加号重载运算符
当需要支持「左操作数不是当前类对象」的场景(如 int + Complex),成员函数重载无法实现(因为成员函数的左操作数必须是当前类对象),此时需用全局函数重载,若需要访问类的私有成员,可声明为友元。若需要 A + B 和 B + A 都生效,需分别重载两个全局函数(如 operator+(A, B) 和 operator+(B, A))。+= 是修改自身的运算符(左操作数被修改),通常先重载 +=,再基于 += 重载 +,减少代码冗余。三、特殊场景:重载 += 与 + 的配合。
2025-12-28 13:21:06
289
原创 C++中的友元
在 C++ 中,友元(Friend) 是一种打破类封装性的特殊机制,允许外部的函数、类或其他类的成员函数直接访问类的私有(private) 和保护(protected) 成员。友元声明位置:可在类的 private/protected/public 区域声明(效果一致),通常放在 private 区(强调 “特殊权限”)。友元声明需加作用域:错误!友元关系不可传递:若 A 是 B 的友元,B 是 C 的友元,不代表 A 是 C 的友元;友元关系单向性:若 A 是 B 的友元,不代表 B 是 A 的友元;
2025-12-28 10:25:45
351
原创 C++中的this指针
this指针通常存储在栈区(作为函数参数),或由编译器优化到寄存器中(提升访问效率),不属于对象的内存空间(sizeof(对象)不会包含this指针的大小)。this指针是非静态成员函数中一个隐式的、常量指针(类名* const this),由编译器自动添加到函数的参数列表中,指向当前调用该成员函数的对象。核心本质:this是编译器为非静态成员函数添加的隐式常量指针,指向当前调用函数的对象,存储在栈 / 寄存器中,不属于对象内存;this指针存在于非静态成员函数的作用域内,静态成员函数没有this指针;
2025-12-26 16:44:37
604
原创 c++的对象模型
C++ 中,类的非静态成员变量属于每个对象(存在对象的内存中),而成员函数(包括静态 / 非静态) 和静态成员变量属于整个类(存在全局 / 静态存储区,所有对象共享)。存储在全局 / 静态区,不属于任何对象,因此必须 “类内声明、类外初始化”(全局区的变量不能在类的局部作用域初始化);编译器会给空类对象分配 1 字节的占位内存,用于标识对象的存在(否则无法区分不同的空对象)。成员函数存在代码段,所有对象共享,对象只存数据(非静态成员变量)。对象只存 “数据”(非静态成员变量),不存 “代码”(成员函数);
2025-12-26 16:34:17
916
原创 C++中的静态成员
静态成员函数:无 this 指针,只能访问静态成员,可通过类名直接调用,适合实现无状态的工具方法;核心坑点:静态成员变量必须类外初始化,静态函数无法访问非静态成员(无 this 指针)。静态成员变量:类内声明、类外初始化,所有对象共享,存储在全局区,可通过类名直接访问;核心优势:在保持封装性的前提下实现类级别的共享,避免全局变量的命名冲突和封装缺失;静态成员:所有对象共享同一份,修改后所在这里插入代码片有对象都能看到变化。静态成员是属于整个类,而非类的某个具体对象的成员(包括变量和函数)。
2025-12-26 14:35:19
261
原创 c++中类对象作为类成员
当一个类的成员变量是另一个类的对象时,这个对象就称为成员对象,这种设计体现了 C++ 的「组合 / 聚合」设计思想(比如 “汽车” 类包含 “发动机” 类对象、“用户” 类包含 “地址” 类对象)。先拆整机,再毁组件;成员对象是 const / 引用类型:同理,const 成员对象、引用类型的成员对象,也必须在初始化列表中初始化(无法在函数体赋值)。权限限制:无法直接访问成员对象的private/protected成员(需通过成员对象的public方法间接访问);三、成员对象的初始化规则(结合初始化列表)
2025-12-26 11:22:28
376
原创 C++中的初始化列表
等拿到奶茶(进入函数体)再改参数,已经晚了。简单来说:无默认构造的自定义成员,“必须在创建时传参”,而初始化列表是唯一能在 “创建阶段(初始化阶段)” 传参的地方,函数体只能在 “创建后” 赋值,因此无法替代。初始化列表是构造函数的一部分,位于函数参数列表之后、函数体之前(以:分隔),用于在构造函数体执行前,直接初始化类的成员变量,而非在函数体内赋值。const 成员、引用成员、没有默认构造函数的自定义类型成员,必须在初始化阶段完成初始化,无法在赋值阶段处理 → 只能用初始化列表。
2025-12-26 10:52:25
715
原创 C++中深拷贝与浅拷贝的原理
只要类中包含new/delete管理的动态内存,就必须手动实现深拷贝(拷贝构造函数 + 赋值运算符重载),否则会触发浅拷贝的内存安全问题。浅拷贝是编译器默认的逐字节复制,仅复制指针地址,适用于无动态内存的简单类,但会导致多个对象共享堆内存,引发内存错误;深拷贝需要手动实现,为指针成员重新分配独立内存并复制内容,保证对象独立性,是处理动态内存类的必选方案;·对指针成员变量:仅复制指针的地址(而非指针指向的堆内存内容);不仅复制对象的成员变量,还会为指针成员重新分配独立的堆内存;2、代码示例(浅拷贝的问题)
2025-12-26 08:48:53
865
原创 c++中值传递时是如何触发拷贝构造函数的
1、触发条件:函数参数为类对象(值传递)时,编译器会自动调用拷贝构造函数,创建实参的副本作为形参。2、过程本质:值传递的 “复制” = 拷贝构造函数的调用 + 新对象(副本)的创建。3、优化建议:如果不需要修改原对象,用const 类名&(const 引用)传递参数,既不触发拷贝构造,又能防止函数内修改原对象。
2025-12-25 22:42:13
377
原创 C++中的引用
1、避免拷贝:尤其是大对象(如自定义类、数组),值传递会复制整个对象,引用仅传递别名,大幅节省内存、提升效率;2、可修改实参:通过非 const 引用可直接修改函数外部的实参,无需通过返回值传递修改结果。引用是变量的 “别名”,不能先定义、后绑定,这是和指针最核心的区别。普通左值引用(T&)不能绑定临时值(如函数返回值、表达式结果);3、无 “空引用”、无 “引用的引用”、无 “指向引用的指针”引用必须绑定有效变量,不存在nullptr引用;2、引用一旦绑定,无法更换绑定对象。1、禁止返回局部变量的引用。
2025-12-25 17:11:43
321
原创 c++内存分区模型
注意:必须用 delete/free 释放,否则导致内存泄漏;重复释放、释放野指针会触发程序崩溃。核心特点:手动管理、容量大(受物理内存限制)、速度慢、碎片化。存储内容:通过 new/malloc 动态分配的内存。
2025-12-25 15:46:29
308
原创 const修饰指针
int * const p —离p近,因此指针指向不能改变。巧记顺序:看到const翻译为常量;const int *p —常量指针。int * const p — 指针常量。3、const既修饰指针,又修饰常量。1、const修饰指针:—常量指针。2、const修饰常量:–指针常量。const离谁近,谁不能更改。近,因此指向的值不能修改。
2025-05-22 22:43:28
233
原创 RC充电时间的计算--示例
V0 为电容上的初始电压值;V1 为电容最终可充到或放到的电压值; Vt 为t时刻电容上的电压值。 则, Vt=“V0”+(V1-V0)* [1-exp(-t/RC)] 或, t = RC*Ln[(V1-V0)/(V1-Vt)] 求.
2021-11-29 21:36:58
6600
以FSB20CH60F为驱动的三相六步电机驱动,逆变桥同IGBT集成一体,体积小,使用方便
2022-04-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅