当前位置: 首页 > news >正文

C++类和对象:构造函数、析构函数、拷贝构造函数

引言

        介绍:C++类和对象:构造函数、析构函数、拷贝构造函数

       _涂色_博主主页

        C++基础专栏

 一、类的默认成员函数

        先认识一下类中的默认成员函数:

        默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,不写的情况下编译器会默认生成以下 6 个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后卖面再讲解。

从两个方面去学习:

• 第一:我们不写时,编译器默认生成的函数的行为是什么,是否满足我们的需求。

• 第二:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?

整体思维图: 

二、构造函数

        构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化 对象。构造函数的本质是要替代Date类中写的Init函数的功能,构造函数自动调用的 特点就完美的替代的了Init。

使用默认构造函数创建d1:

使用默认构造函数创建d2,然后用Init函数初始化想要的初始值:

#include<iostream>
using namespace std;class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << this->_year << "/" << this->_month << "/" << this->_day << endl;}private:int _year;int _month;int _day;
};
int main()
{//使用默认构造函数创建d1Date d1;d1.Print();//使用默认构造函数创建d2,然后用Init函数初始化想要的初始值Date d2;d2.Init(2025, 1, 1);d2.Print();return 0;
}

 

 可以看出编译器自己默认的构造函数不满足初始化,所以咱们可以自己写构造函数,这时,编译器就调用咱们写的构造函数。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型, 如:int / char / double / 指针等,自定义类型就是我们使用 class / struct等关键字自己定义的类型。

构造函数的特点:

1. 函数名与类名相同。

2. 无返回值。(返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)

3. 对象实例化时系统会自动调用对应的构造函数。

4. 构造函数可以重载。

5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再生成。

6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有⼀个存在,不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造总结一下就是不传实参就可以调用的构造就叫默认构造。

7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是否初始 化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始 化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,后面来讲解。

#include<iostream>
using namespace std;class Date
{
public://void Init(int year, int month, int day)//{//	_year = year;//	_month = month;//	_day = day;//}//1. 无参构造// 注意:如果通过⽆参构造函数创建对象时,对象后⾯不⽤跟括号,否则编译器⽆法// 区分这⾥是函数声明还是实例化对象Date(){_year = 1;_month = 1;_day = 1;}//2. 带参构造函数 Date(int year, int month, int day){_year = year;_month = month;_day = day;}//3.全缺省构造函数/*Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << this->_year << "/" << this->_month << "/" << this->_day << endl;}private:int _year;int _month;int _day;
};
int main()
{Date d1(2025, 1, 1);d1.Print();return 0;
}

 

对第7点的解释: 看下面代码

#include<iostream>
using namespace std;typedef int STDataType;
class Stack
{
public:Stack(int n = 4){cout << "Stack(int n = 4)" << endl;_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}~Stack() //这个是析构函数,下面会讲{cout << "~Stack()" << endl;free(_a);_a = nullptr;_capacity = _top = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;
};
// 两个栈实现一个队列
class Myqueue
{
private:// 自定义类型// 编译器默认生成的MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化Stack _pushst;Stack _popst;
};int main()
{Myqueue q;Stack st;return 0;
}

三、析构函数

        析构函数与构造函数功能相反,析构函数不是完成对  对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。析构函数的功能类比我们之前 Stack 实现的 Destroy 功能,而像Date没有 Destroy,其实就是没有资源需要释放,所以严格说Date是不需要析构函数的。

析构函数的特点:

1. 析构函数名是在类名前加上字符~。

2. 无参数无返回值。(这里跟构造类似,也不需要加void)

3. 一个类只能有一个析构函数。若未显式定义,系统会自动动生成默认的析构函数。

4. 对象生命周期结束时,系统会自动调用析构函数。

5. 跟构造函数类似,我们不写编译器自动生成的析构函数对内置类型成员不做处理,自定类型成员会调用他的析构函数。

6. 还需要注意的是我们显示写析构函数,对于自定义类型成员也会调用他的析构,也就是说自定义类型成员无论什么情况都会自动调用析构函数。

7. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,如Date;如果默认生成的析构就可以用,也就不需要显示写析构,如MyQueue;但是有资源申请时,⼀定要自己写析构,否则会造成资源泄漏,如Stack。

8. 一个局部域的多个对象,C++规定:后定义的先析构。

#include<iostream>
using namespace std;typedef int STDataType;
class Stack
{
public:Stack(int n = 4){cout << "Stack(int n = 4)" << endl;_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}~Stack() {cout << "~Stack()" << endl;free(_a);_a = nullptr;_capacity = _top = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;
};
// 两个栈实现一个队列
class Myqueue
{
private:// 自定义类型// 编译器默认生成的MyQueue的构造函数调用了Stack的构造,完成了两个成员的初始化Stack _pushst;Stack _popst;
};int main()
{Myqueue q; //调用两次Stack的构造和析构Stack st;  //调用一次Stack的构造和析构return 0;
}

四、拷贝构造函数

        如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数叫做拷贝构造函数,也就是说拷贝构造是一个特殊的构造函数。

拷贝构造的特点:

1. 拷贝构造函数是构造函数的⼀个重载。

2. 拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。拷贝构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引用,后面的参数必须有缺省值(一般就一个参数)。

通过代码来理解一下:

#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1){cout << "Date(int year = 1, int month = 1, int day = 1)" << endl;_year = year;_month = month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << this->_year << "/" << this->_month << "/" << this->_day << endl;}~Date()// 析构函数{cout << "~Date()" << endl;}
private:int _year;int _month;int _day;
};
void Func(Date a)
{//......
}
int main()
{Date d1;d1.Print();//比如这里应该函数Func(),需要将d1传过去Func(d1);//这里传d1的时候,就需要拷贝构造函数,将d1拷贝给形参a//假如拷贝构造函数的实现是:/*Date(const Date  d){_year = d._year;_month = d._month;_day = d._day;}*///拷贝函数又需要使用拷贝构造函数,将d1拷贝给形参d,这里又需要调用拷贝构造函数,\所以拷贝构造函数的参数是形参的话,就会陷入死循环,一直调用拷贝构造函数//所以,使用引用,可以杜绝这样一直调用拷贝构造函数。//正确使用拷贝构造函数:Date d1(2025, 4, 24);  // 构造Date d2(d1);           // 拷贝构造Date d4 = d1;          // 拷贝构造
}

3. C++规定:自定义类型对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参 和 传值返回都会调用拷贝构造完成。

4. 若未显式定义拷贝构造,编译器会自动生成拷贝构造函数。自动生成的拷贝构造对内置类型成 员变量会完成值拷贝 / 浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用他的拷贝构造。

5. 像Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的拷贝构造就可以完成需要的拷贝,所以不需要我们显示实现拷贝构造。

        像Stack这样的类,虽然也都是内置类型,但是 _a 指向了资源,编译器自动生成的拷贝构造完成的值拷贝 / 浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝 (对指向的资源也进行拷贝)。

        像MyQueue这样的类型内部主要是自定义类型 Stack成员,编译器自动生成的拷贝构造会调用Stack的拷贝构造,也不需要我们显示实现 MyQueue的拷贝构造。

这里还有一个小技巧,如果一个类显示实现了析构并释放资源,那么他就需要显示写拷贝构造,否则就不需要。

看代码感受一下:

#include<iostream>
using namespace std;typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}Stack(const Stack& s){cout << "Stack(Stack& s)" << endl;_a = (STDataType*)malloc(sizeof(STDataType) * s._capacity);if (nullptr == _a){perror("malloc申请空间失败");return;}memcpy(_a, s._a, sizeof(STDataType) * s._top);_top = s._top;_capacity = s._capacity;}void Push(const STDataType& x){// 扩容_a[_top] = x;_top++;}int Top(){return _a[_top-1];}~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;
};
Stack& Fun()
{Stack s;s.Push(1);s.Push(2);s.Push(3);s.Push(4);return s;
}class MyQueue
{
private:Stack _pushst;Stack _popst;
};int main()
{int main()
{Stack st1;st1.Push(1);st1.Push(2);// Stack不显⽰实现拷⻉构造,⽤⾃动⽣成的拷⻉构造完成浅拷⻉// 会导致st1和st2⾥⾯的_a指针指向同⼀块资源,析构时会析构两次,程序崩溃Stack st2 = st1;MyQueue mq1;// MyQueue⾃动⽣成的拷⻉构造,会⾃动调⽤Stack拷⻉构造完成pushst / popst// 的拷⻉,只要Stack拷⻉构造⾃⼰实现了深拷⻉,他就没问题MyQueue mq2 = mq1;return 0;
}
}

6. 传值返回会产生一个临时对象调用拷贝构造,传值引用返回,返回的是返回对象的别名(引用),没有产生拷贝。但是如果返回对象是一个当前函数局部域的局部对象,函数结束就销毁了,那么使用引用返回是有问题的,这时的引用相当于⼀个野引用,类似一个野指针一样。传引用返回可以减少拷贝,但是一定要确保返回对象,在当前函数结束后还在,才能用引用返回。

来看个例子感受一下:

#include<iostream>
using namespace std;typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}Stack(const Stack& s){cout << "Stack(Stack& s)" << endl;_a = (STDataType*)malloc(sizeof(STDataType) * s._capacity);if (nullptr == _a){perror("malloc申请空间失败");return;}memcpy(_a, s._a, sizeof(STDataType) * s._top);_top = s._top;_capacity = s._capacity;}void Push(const STDataType& x){// 扩容_a[_top] = x;_top++;}int Top(){return _a[_top-1];}~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;
};
Stack& Fun()
{Stack s;s.Push(1);s.Push(2);s.Push(3);s.Push(4);return s;
}int main()
{cout << Fun().Top() << endl;//问:还能返回这个栈顶的元素吗?//答:不可以了,因为返回的是s的别名,出了Fun函数,s就析构销毁了,所以程序会崩溃//那块地方已经被还给内存了。return 0;
}

相关文章:

C++类和对象:构造函数、析构函数、拷贝构造函数

引言 介绍&#xff1a;C类和对象&#xff1a;构造函数、析构函数、拷贝构造函数 _涂色_博主主页 C基础专栏 一、类的默认成员函数 先认识一下类中的默认成员函数&#xff1a; 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。⼀个类…...

【FAQ】HarmonyOS SDK 闭源开放能力 — PDF Kit

1.问题描述&#xff1a; 预览PDF文件&#xff0c;文档上所描述的loadDocument接口&#xff0c;可以返回文件的状态&#xff0c;并无法实现PDF的预览&#xff0c;是否有能预览PDF相关接口&#xff1f; 解决方案&#xff1a; 1、执行loadDocument进行加载PDF文件后&#xff0c…...

Spring Boot 3 + Undertow 服务器优化配置

优化背景 当你的application需要支持瞬时高并发的时候&#xff0c;tomcat已经不在是最优的选择&#xff0c;我们可以改为Undertow&#xff0c;并对其进行优化。 Undertow 是一个轻量级的、高性能的Java Web 服务器&#xff0c;由JBoss 开发并开源。它是基于非阻塞&#xff08;…...

网易游戏 Flink 云原生实践

摘要&#xff1a;本文整理自网易游戏实时计算&数据湖平台负责人林小铂老师和网易游戏大数据开发工程师陈宇智老师&#xff0c;在Flink Forward Asia 2024 云原生专场的分享。主要分为四个部分&#xff1a; 1、背景 2、架构演进 3、实践挑战 4、总结和展望 01.背景 Flink 在…...

使用迁移学习的自动驾驶汽车信息物理系统安全策略

信息物理系统 (CPS) 是一种新兴系统,它通过信息通信基础设施,实现控制系统、传感器、执行器和周围环境等物理组件之间有效的实时通信与协作 (C&C)。自动驾驶汽车 (AV) 是大量采用 CPS 方法的领域之一,旨在通过降低能源消耗和空气污染来改善智慧城市中的人们生活。因此,…...

《算法导论(第4版)》阅读笔记:p11-p13

《算法导论(第4版)》学习第 8 天&#xff0c;p11-p13 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1.precious (1)precious: pretium(“value, worth, price”) adj. of great value(宝贵&#xff0c;珍贵)。 (2)示例 Computing t…...

Qt 编译 sqldrivers之psql

编译postgres pgsql驱动 下载驱动源码修改配置文件编译 下载驱动源码 // 源代码下载 https://download.qt.io/archive/qt/5.15/5.15.2/submodules/驱动目录:qtbase-everywhere-src-5.15.2\src\plugins\sqldrivers 修改配置文件 打开pro文件 右键点击添加库 此处的为debu…...

查看单元测试覆盖率

文章目录 1、POM文件配置2、编写单元测试3、执行单元测试4、查看单元测试覆盖率 1、POM文件配置 pom文件配置jacoco插件 <!-- 生成JaCoCo覆盖率数据插件 --> <plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artif…...

ASP.NET Core 中实现 Markdown 渲染中间件

文章目录 前言一、核心功能二、实现步骤1&#xff09;安装依赖包2&#xff09;创建中间件类3&#xff09;中间件扩展方法4&#xff09;在Program.cs配置5&#xff09;模板文件示例6&#xff09;*.md文件示例7&#xff09;缓存优化8&#xff09;使用示例 三、注意事项总结 前言 …...

AI学习路径

一、AI入门与系统课程 &#xff08;1&#xff09;《开启AI革命&#xff1a;7天从小白到大神》 简介&#xff1a;保姆级教学&#xff0c;覆盖AI基础知识、机器学习、深度学习、自然语言处理&#xff08;NLP&#xff09;、大语言模型&#xff08;LLM&#xff09;等&#xff0c;…...

基于Kubernetes的Apache Pulsar云原生架构解析与集群部署指南(下)

文章目录 k8s安装部署Pulsar集群前期准备版本要求 安装 Pulsar Helm chart管理pulsarClustersBrokersTopic k8s安装部署Pulsar集群 前期准备 版本要求 Kubernetes 集群&#xff0c;版本 1.14 或更高版本Helm v3&#xff08;3.0.2 或更高版本&#xff09;数据持久化&#xff…...

B站搜索关键词全攻略:掌握B站搜索关键词的运作机制

在拥有超过7亿月活用户的B站&#xff0c;每天都有海量视频涌入平台。无论是普通用户还是内容创作者&#xff0c;掌握B站搜索关键词的运作机制&#xff0c;都能极大提升平台体验和内容价值。本文将从用户和创作者双重视角&#xff0c;深入解析B站搜索关键词的应用技巧和优化策略…...

Windows系统安装Cursor与远程调用本地模型QWQ32B实现AI辅助开发

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

DBeaver查询PostgreSQL的只读模式

问题 DBeaver查询PostgreSQL数据表时&#xff0c;注意到经常会出现“Detect unique identifiers" 这个阶段&#xff0c;几乎需要花费10s时间&#xff0c;想着挺浪费时间的。 问题解决办法 把”读取数据表元数据(唯一键)"这个复选框选项去掉&#xff0c;再进行查询…...

C++内存管理与模板初阶详解:从原理到实践

目录&#xff1a; 一、C/C内存管理1. 内存区域划分2. 动态内存管理3. 底层原理&#xff1a;operator new/delete4.new和delete的实现原理5. 定位new&#xff08;了解即可&#xff09; 二、模板初阶1. 泛型编程2. 函数模板实例化隐式实例化&#xff1a;编译器自动推导类型显式实…...

02-GBase 8s 事务型数据库 客户端工具dbaccess

dbaccess概述 数据库产品通常会提供一个命令行客户端工具。 数据库厂商 命令行客户端 Oracle sqlplus MySQL mysql Marladb mysql GBase 8s dbaccess Kingbase ES ksql DM8 disql dbaccess 是 GBase 8s 数…...

【kubernetes】通过Sealos 命令行工具一键部署k8s集群

一、前言 1、sealos安装k8s集群官网&#xff1a;K8s > Quick-start > Deploy-kubernetes | Sealos Docs 2、本文安装的k8s版本为v1.28.9 3、以下是一些基本的安装要求&#xff1a; 每个集群节点应该有不同的主机名。主机名不要带下划线。所有节点的时间需要同步。需要…...

【Pandas】pandas DataFrame abs

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值 pandas.DataFrame.abs() pandas.DataFrame.abs() 方法用于返回 DataFrame 中每个元素的绝对值。该方法适用于包含数值型数据的 DataFrame&#xff0c;对…...

如何在 C# 和 .NET 中打印 DataGrid

DataGrid 是 .NET 架构中一个功能极其丰富的组件&#xff0c;或许也是最复杂的组件之一。写这篇文章是为了回答“我到底该如何打印 DataGrid 及其内容”这个问题。最初即兴的建议是使用我的屏幕截图文章来截取表单&#xff0c;但这当然无法解决打印 DataGrid 中虚拟显示的无数行…...

使用DEEPSEEK快速修改QT创建的GUI

QT的GUI&#xff0c;本质上是使用XML进行描述的&#xff0c;在QT CREATOR的界面编辑处&#xff0c;按CTRL2 切换到代码视图&#xff0c;CTRL3切换到编辑器视图。 CTRL2 切换到代码视图 CTRL3 切换到编辑器视图 鼠标左键点击代码视图中&#xff0c;按CTRLA → CTRLC复制XML代码…...

前端面试宝典---JavaScript import 与 Node.js require 的区别

import 和 require 来自不同的规范&#xff1a; import 是 ES6&#xff08;ECMAScript 2015&#xff09;模块系统的一部分&#xff0c;是 JavaScript 语言的标准语法 require 是 CommonJS 规范的一部分&#xff0c;最初为 Node.js 环境设计 加载方式&#xff1a; require() …...

C++入门小馆 :多态

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

极简远程革命:打破公网桎梏,重塑数字生活新体验

简远程革命&#xff1a;节点小宝&#xff0c;让家庭与职场无缝互联 ——打破公网桎梏&#xff0c;重塑数字生活新体验 引言&#xff1a;当公网IP成为过去式 在2025年的今天&#xff0c;80%的家庭仍因缺乏公网IP而深陷远程访问困境。NAS玩家为端口映射焦头烂额&#xff0c;家长…...

Linux 网络管理 的实战代码示例

涵盖网络接口配置、连接测试、防火墙管理、数据包捕获、服务监控等核心场景。每个示例均附带详细注释和操作说明,帮助您深入理解 Linux 网络管理的实战技巧。 1. 网络接口配置与管理 1.1 使用 ip 命令管理网络接口 ip 是现代 Linux 系统中管理网络的主要工具,功能比 ifcon…...

OPCUA,OPCDA与MODBUS学习笔记

MODBUS与OPC之间的关系是什么&#xff1f; 前言 OPC协议&#xff08;OLE for Process Control&#xff0c;即过程控制的OLE&#xff09;是一种标准化的通信协议&#xff0c;旨在帮助不同厂商的设备、控制系统和软件之间进行数据交换。OPC协议的目标是提供一种统一的接口&…...

千星计划小程序开发方案

千星计划小程序开发方案 &#xff08;基于2025年行业实践与系统需求&#xff09; 一、核心功能架构 1.‌用户管理模块‌ 用户分层管理&#xff1a;普通用户、达人、合伙人三级身份体系&#xff0c;支持身份升级审核与权限配置 实名认证与资质审核&#xff1a;对接公安系统…...

【RAG技术全景解读】从原理到工业级应用实践

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1f6a8; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f50d; 一、技术原理剖析&#x1f4d0; 核心概念图解&#x1f4a1; 核心作用讲解⚙️ 关键技术模块说明⚖️ 技术选型对比 &…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网

1、在WIN10/11下安装驱动程序&#xff1a;Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具&#xff1a;QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口&#xff0c;最小的那一个】 AT命令&#xf…...

室内无人机自主巡检解决方案-自主方案

室内无人机自主巡检解决方案-自主方案 AIBOX-基于离线地图的LIO室内3D空间位置服务...

SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用

SpringCloud中Nacos服务注册中心 LoadBalancer服务负载均衡使用 前言Nacos工作流程nacos安装docker安装window安装 运行nacos微服务集成nacos高级特性1.服务集群配置方法效果图模拟服务实例宕机 2.权重配置3.环境隔离 如何启动集群节点本地启动多个节点方法 LoadBalancer集成L…...

视频编解码学习9之照相机历史

照相机的发展历史可以追溯到19世纪初&#xff0c;至今已有200多年。以下是照相机技术演进的主要阶段和里程碑&#xff1a; 1. 早期探索阶段&#xff08;1820s-1880s&#xff09; 1826年&#xff1a;法国人尼埃普斯&#xff08;Nicphore Nipce&#xff09;用沥青感光法拍摄《窗…...

物流无人机自动化装卸技术解析!

一、自动化装卸技术模块的技术难点 1. 货物多样性适配 物流场景中货物包装类型、尺寸、材质差异大&#xff0c;如农产品、医疗物资、工业设备等&#xff0c;要求装卸模块具备高度柔性化设计。例如&#xff0c;单元货物需视觉识别系统进行单个抓取&#xff0c;而整托货物需大…...

图形渲染+事件处理最终版

基于之前做的项目图形移动处理-CSDN博客添加了相机&#xff0c;透视投影&#xff0c;鼠标控制图形旋转。虽然个人感觉这个项目用的是一个二维的三角形&#xff0c;给他加透视投影和相机意义不大&#xff0c;因为透视投影是近大远小&#xff0c;我这个程序设置了放大缩小的限制&…...

前端三大件---CSS

目录 一、CSS 概述 二、引入 CSS 的三种方式 2.1 内联样式 2.2 内部样式表 2.3 外部样式表 三、CSS 选择器 3.1 ID 选择器 3.2 class 选择器 3.3 标签选择器 3.4 通配选择器 3.5 分组选择器 3.6 层级选择器 3.7 属性选择器 3.8 伪类选择器 3.9 同辈选择器 四、…...

蓝桥杯FPGA赛道第二次模拟题代码

一、顶层文件 module test( input wire sys_clk, input wire sys_rst, input wire [3:0]key_in, output reg [7:0]led,output wire scl, inout wire sda,//i2c的信号output wire [7:0]sel, output wire [7:0]seg//数码管的驱动 );wire [23:0] data ; reg [31:0] dsp_dat…...

keep the pipe Just full But no fuller - BBR 与尘封 40 年的求索

推荐一部短视频 Keep the pipe just full, but no fuller&#xff0c;作者就是大名鼎鼎的 L. Kleinrock&#xff0c;现代分组交换网的奠基人&#xff0c;这里有关于他这个人的介绍&#xff1a; https://www.lk.cs.ucla.edu/index.html https://en.wikipedia.org/wiki/Leonard…...

《React Native热更新实战:用Pushy打造无缝升级体验》

《React Native热更新实战:用Pushy打造应用“空中加油”,实现无缝升级体验》 写在前面:当你的APP需要"空中加油"时… 想象一下这样的场景:凌晨2点,你的React Native应用刚上线就爆出重大BUG,用户差评如潮水般涌来,应用商店审核至少需要3天…此刻你多么希望能…...

【开源解析】基于Python的智能文件备份工具开发实战:从定时备份到托盘监控

&#x1f4c1;【开源解析】基于Python的智能文件备份工具开发实战&#xff1a;从定时备份到托盘监控 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0…...

第四章:基于langchain构造一个完整RAG系统

文章目录 引言一、RAG的基本原理1.1 什么是RAG&#xff1f;1.2 RAG的应用场景 二、RAG系统的构建步骤2.1 环境准备2.2 加载和处理文档2.2.1 文档加载2.2.2 文本分割 2.3 构建嵌入模型2.4 创建向量存储与检索器2.5 检索与生成2.5.1 检索相关文档2.5.2 生成答案 三、完整代码示例…...

uniapp|实现多终端视频弹幕组件、内容轮询、信息表情发送(自定义全屏半屏切换、弹幕启用)

基于UniApp框架实现跨终端视频弹幕组件的开发,结合CSS3动画与setInterval轮询机制,完成弹幕从右向左的动态滚动效果,针对交互需求,设计弹幕启用开关、全屏/半屏模式切换功能,并利用cover-view组件解决原生层级覆盖问题。 目录 ​引言视频弹幕的交互价值与多终端适配需求Un…...

数据结构(四)——栈的应用—数制转换

利用栈进行数制转换&#xff1a; 十进制转换八进制&#xff1a;先将十进制数除以八得到余数&#xff0c;余数入栈&#xff0c;然后将得到的商继续除以八&#xff0c;直到商为零 #include <stdio.h> #include <stdlib.h>#define MAXSIZE 100//数制转换//定义链表节…...

flinksql bug : Max aggregate function does not support type: CHAR

这个问题是flink中 CHAR 存在语义歧义&#xff0c;主要涉及到位数的关系&#xff0c;这里不做多讨论。 这个问题已经有人提了pr&#xff0c;新版本可以关注是否有解决 这个报错发生在 max(测试字段) &#xff0c;这个测试字段如果是char 就会报错不支持 解决办法&#xff1a…...

解决社区录音应用横屏状态下,录音后无法播放的bug

最近看到社区有小伙伴反映&#xff0c;社区录音应用横屏时&#xff0c;录音后无法播放的问题。现分享解决办法。 社区录音应用的来源&#xff1a;https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-5.0.2-Release/code/SystemFeature/Media/Recorder …...

【MySQL】存储引擎 - InnoDB详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

软件工程之形式化说明技术深度解析

按照形式化的程度&#xff0c;可以把软件工程使用的方法划分成非形式化、半形式化和形式化3种。用自然语言描述需求规格说明书&#xff0c;是典型的非形式化方法。用数据流图或实体-联系图建立模型&#xff0c;是典型的半形式化方法。 所谓形式化方法&#xff0c;是描述系统性…...

Nacos源码—6.Nacos升级gRPC分析一

大纲 1.Nacos 2.x版本的一些变化 2.客户端升级gRPC发起服务注册 3.服务端进行服务注册时的处理 4.客户端服务发现和服务端处理服务订阅的源码分析 1.Nacos 2.x版本的一些变化 变化一&#xff1a;客户端和服务端的交互方式由HTTP升级为gRPC Nacos 1.x服务端会提供一系列的…...

使用 React 实现语音识别并转换功能

在现代 Web 开发中&#xff0c;语音识别技术的应用越来越广泛。它为用户提供了更加便捷、自然的交互方式&#xff0c;例如语音输入、语音指令等。本文将介绍如何使用 React 实现一个简单的语音识别并转换的功能。 功能概述 我们要实现的功能是一个语音识别测试页面&#xff0…...

2.5 点云数据存储格式——大型点云传输格式

通常,进行大型点云数据传输时,一般采用一种后缀为bin的文...

Windows系统下使用Kafka和Zookeeper,Python运行kafka(一)

下载和安装见Linux系统下使用Kafka和Zookeeper 配置 Zookeeper Zookeeper 是 Kafka 所依赖的分布式协调服务。在 Kafka 解压目录下,有一个 Zookeeper 的配置文件模板config/zookeeper.properties,你可以直接使用默认配置。 启动 Zookeeper 打开命令提示符(CMD),进入 K…...

数据结构(三)——栈和队列

一、栈和队列的定义和特点 栈&#xff1a;受约束的线性表&#xff0c;只允许栈顶元素入栈和出栈 对栈来说&#xff0c;表尾端称为栈顶&#xff0c;表头端称为栈底&#xff0c;不含元素的空表称为空栈 先进后出&#xff0c;后进先出 队列&#xff1a;受约束的线性表&#xff0…...