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

C++ 类和对象(中篇)

类的6个默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。

构造函数:

定义:构造函数是一个特殊的成员函数,名字与类名相同,创建类 类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。

特性:

1.不是开空间创建对象,而是初始化对象。

2. 函数名与类名相同。

3. 无返回值。

4. 对象实例化时编译器自动调用对应的构造函数。

5. 构造函数可以重载


#include <iostream>
#include <assert.h>using namespace std;class Date
{
private:int _year;int _month;int _day;public://1.无参构造函数Date(){}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}
};int main()
{Date d1; // 调用无参构造函数Date d2(2015, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象Date d3();return 0;
}

根据不同的初始化需求,去选择构造函数:

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

class Date
{
private:int _year;int _month;int _day;void MPrintf(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
};int main()
{
// 没有定义构造函数,对象也可以创建成功,因此此处调用的是编译器生成的默认构造函数Date d1;d1.MPrintf();return 0;
}

7.无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参 构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

默认成员函数分为:

为什么默认构造函数只能有一个?

回答:

当同时有无参构造函数和全缺省构造函数时,在实例化过程中编译器无法判断选择哪一种构造函数。

//为什么默认构造函数只能有一个?
class Date
{
private:int _year;int _month;int _day;public://1.无参构造函数Date(){}// 2.全缺省构造函数Date(int year=2018, int month=1, int day=1){_year = year;_month = month;_day = day;}void MPrintf(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
};int main()
{   // 调用无参构造函数Date d1; //全缺省构造函数--注释1.无参构造函数Date d2(1111);d2.MPrintf();Date d3(2222, 2);d3.MPrintf();Date d4(3333, 3, 3);d4.MPrintf();return 0;
}

此时编译器是无法确定选择哪一种默认构造函数;

全缺省构造函数结果:

8.默认构造函数多用于自定义类型

对于自定义类型(复杂情况)我们会用构造函数的默认生成,更方便

class Time
{
public:
//默认构造Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};
class Date
{private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

调试结果:

对于内置类型,默认构造函数时不进行内容的改变,只保留随机值。

对于自定义类型,我们设置了他的默认成员函数,随机值进行了改变,在以后多次使用tmie类型是,他的初始化内容都会改变成自己一开始设置的初始化内容。

内置和自定义混合的,可以给内置缺省

此处不是初始化(空间没有创造就不能算是初始化,只能算是声明缺省值)

解释:默认构造没有参数传递,使用其原本的缺省值

由此得出:

默认生成构造函数:

1.内置类型成员不做处理

2.自定义类型成员,会去调用它的默认构造(不用传参数的构造)

建议:每个类都提供一个默认构造函数(内置类型->缺省构造)

析构函数:

定义:与构造函数功能相反,析构函数不是完成对象的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作

特征:

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

2. 无参数无返回值。

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

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

拷贝构造函数:
 

定义:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。(将已近实例化好的类型对象拷贝给将要实例化的新的对象的构造函数

特征:

1. 拷贝构造函数是构造函数的一个重载形式。

2. 拷贝构造函数的参数只有一个必须使用引用传参,使用传值方式会引发无穷递归调用。

为什么只传一个参数?

回答:其在结构体内部,本身还有一个隐形的This指针。

必须使用引用的原因?

回答:避免出现使用传值方式会引发无穷递归调用。--在拷贝时先准备启用拷贝构造函数,传值时会调用拷贝构造函数。这样会形成无穷递归调用。(不理解直接记成:拷贝构造函数必用引用


使用const的原因?

回答:在传递过程中,将可读可写的修改成const(只读)模式。将其权限缩小,避免因为自己思路的问题而导致原本值的改变。

3. 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。

代码:

#include <iostream>using namespace std;class Date
{
public://构造函数-全缺省Date(int year = 2018, int month = 1, int day = 1){_year = year;_month = month;_day = day;}拷贝构造函数//Date(const Date& d)//{//	_year = d._year;//	_month = d._month;//	_day = d._day;//}void Mprintf(){cout << _year << "/" << _month<<"/" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Mprintf();Date d2(d1);d2.Mprintf();return 0;
}

结果:

通过两次运行结果对比发现貌似这个拷贝构造函数有无都一样?

其实不然,C语言本身是对一些内置类型(int char等)在编译器的底层是有类似拷贝构造函数的结构的。

但是,面对一些自定义类型,或者申请有申请空间的情况,C语言不能满足需求

那就需要我们自己写专门针对自己的类的类型的拷贝构造函数

如以下代码:

//开辟一个字符串空间
class String
{
public:String(const char* str = "jack"){_str = (char*)malloc(strlen(str) + 1);strcpy(_str, str);}//析构函数~String(){cout << "~String()" << endl;free(_str);}
private:char* _str;
};
int main()
{String s1("hello");String s2(s1);
}

此时拷贝的运行结果就是错误。

什么情况下用拷贝构造函数:
自己实现了析构函数释放空间,就需要实现拷贝构造函数;

拷贝构造应用场景:

获取x天后的日期:

//拷贝构造应用场景
class Date
{
public://构造函数--全缺省Date(int year = 2018, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//打印函数void Mprintf(){cout << _year << "/" << _month << "/" << _day << endl;}int GetMonthDay(int year,int month){assert(month > 0 && month < 13);//正常情况下当前月数返回的天数,月从1开始,所以多加一位占位int monthArray[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//闰年2月天数情况if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400) == 0)){return 29;}else{return monthArray[month];}}//x天后的日期Date GetAfterXDay(int x){//因为不想改变初始日期所以使用拷贝Date tmp = *this;tmp._day += x;while (tmp._day > GetMonthDay(tmp._year, tmp._month)){tmp._day -= GetMonthDay(tmp._year, tmp._month);++tmp._month;if (tmp._month == 13){tmp._year++;tmp._month = 1;}}return tmp;}private:int _year;int _month;int _day;
};int main()
{Date d1(2222, 2, 2);//d1.GetAfterXDay(100)调用类d1里的GetAfterXDay函数//返回一个Date类型的对象再拷贝到(Date d2=返回值)d2中Date d2 = d1.GetAfterXDay(100);d1.Mprintf();d2.Mprintf();return 0;
}

赋值运算符重载

运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)(对于比较类,不需要更改值,常用const修饰)

用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义

.* 、:: 、sizeof 、?: (三目运算符)、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

公共成员:

要在类外调用还得将声明对象的private改成public

class Date
{
public:Date(int year = 1111, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//private:int _year;int _month;int _day;
};
//d1与d2位置分别对应==的两端,不能修改
//参数和操作数(函数形参位置)是成正比的
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}
int main()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);cout << (d1 == d2) << endl;//d1==d2会自动call对于函数地址//改变成->operator==(d1,d2)进行比较
}

为什么要在输出是加括号:

回答:因为<< 和== 优先级不同cout << d1 == d2 << endl;只会先识别cout << d1

成员函数:

class Date
{
public:Date(int year = 1111, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
//因为是成员函数,所以有其自身的this
// 完全展开后:bool operator==(Date* this, const Date& d2)bool operator==(const Date& d2){return _year == d2._year&& _month == d2._month&& _day == d2._day;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);d1 == d2;//因为是成员函数,其内部自身有隐藏this所以值传递一个值d1.operator==(d2);cout << (d1 == d2) << endl;cout << d1.operator==(d2) << endl;
}

并不局限于==除了.*    、   ::     、    sizeof     、   ?: (三目运算符)   、  .  这5个外都可以用operator(运算符)更改

运算符重载的复用:

代码:

//运算符重载的复用
class Date
{
public:Date(int year = 1111, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//因为是成员函数,所以有其自身的this// 完全展开后:bool operator==(Date* this, const Date& d2)bool operator==(const Date& d2){return _year == d2._year&& _month == d2._month&& _day == d2._day;}//复用!!//由于已知了==,根据==就能写出!=(> < >= <=(小于或等于)同理)bool operator!=(const Date& d){return !(*this == d);//相等1再!->false//不等0再!->true}
private:int _year;int _month;int _day;
};int main()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);cout << (d1!=d2) << endl;//显示1,truereturn 0;
}

赋值运算符重载 =

主要特点:

1. 参数类型

2. 返回值

3. 检测是否自己给自己赋值

4. 返回*this

5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

赋值运算使用:

常用域自己实现了析构函数释放空间,就需要使用自己编写的赋值运算符重载;

class Date
{
public:Date(int year = 1111, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Mprintf(){cout << _year << "/" << _month<<"/" << _day << endl;}
private:int _year;int _month;int _day;
};class String
{
public://拷贝String(const char* str = ""){_str = (char*)malloc(strlen(str) + 1);strcpy(_str, str);}//析构~String(){cout << "~String()" << endl;free(_str);}void Mprintf(){cout << _str << endl;}
private:char* _str;
};int main()
{Date d1(2222, 9, 26);Date d2(3333, 9, 27);String s1("hello");String s2("world");d1.Mprintf();d2.Mprintf();s1.Mprintf();s2.Mprintf();//编译器生成的默认赋值重载函数已经可以完成字节序的值拷贝了d1 = d2;s1 = s2;//报错//此时,自己没有写赋值重载函数,当s2赋值给s1后//s1和s2同时指向相同的一块空间(s2开出的)//后序清理资源,清理s2的时候,s1所指向的空间也会改变//所以错误,编译器不通过d1.Mprintf();s1.Mprintf();return 0;
}

连续赋值

有返回值用于支持这里的连续赋值,保持运算符的特性

eg.i=j=k;连续赋值的顺序是先j=k后返回j再i=j;

所以由于以上连续赋值的可能性,也要考虑赋值运算符重载的连续赋值的可能。


class Date
{
public:Date(int year = 1111, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Mprintf(){cout << _year << "/" << _month<<"/" << _day << endl;}//d3=d2=d1//返回的是赋值的左操作数所以返回*this//返回后该操作数的生命周期还存在所以用引用返回Date& operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;return *this;}
private:int _year;int _month;int _day;
};int main()
{Date d1(1111, 1, 1);Date d2(2222, 2, 2);Date d3(3333, 3, 3);d1.Mprintf();//1111,1,1d1 = d2 = d3;d1.Mprintf();//3333,3,3return 0;
}

自己给自己赋值

有时不小心的操作可能会造成自己给自己赋值的情况

所以还需要在自己写的赋值情况中加入if判断

总结:

赋值重载和拷贝构造区别:

赋值重载是多个已近定义出来的对象

拷贝构造是一个已经实例化的对象初始化另一个未实例化的对象

在使用引用返回时,不能盲目的为了追求使用引用返回而使用静态变量static

静态变量static在整体函数调用中,只会初始化他的第一次,再次走到static内一步时,不会再初始化,而是使用其之前的值;

相关文章:

C++ 类和对象(中篇)

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#xff0c;都会自动生成下面6个默认成员函数。 构造函数&#xff1a; 定义&#xff1a;构造函数是一个特殊的成员…...

可视化场景(9):智慧看板,可能是最直观的数据展示

10年经验的大数据可视化和数字孪生老司机&#xff0c;该领域的专家&#xff0c;是您可信赖的技术合伙人&#xff0c;分享该领域的项目和作品&#xff0c;欢迎互动交流。 hello&#xff0c;我是贝格前端工场&#xff0c;本期分享可视化大屏在安全生产与设备运维场景的应用&#…...

加密算法(二)

1、SHA-256加密算法&#xff1a; package com.arithmetic.encryption; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; //使用java.security.MessageDigest类来进行SHA-256摘要的计算。 //通过getInstance("SHA-256")方法获取…...

大创项目推荐 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…...

IP知识详解

IP基本认识 IP 在 TCP/IP 参考模型中处于第三层&#xff0c;也就是网络层。 网络层的主要作用是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点&#xff08;end to end&#xff09;通信。 网络层与数据链路层有什么关系呢&#xff1f; IP 的作用是主机之间通信…...

设计模式:适配器模式

定义 适配器模式&#xff08;Adapter Pattern&#xff09;&#xff0c;也称为包装器&#xff08;Wrapper&#xff09;模式&#xff0c;是一种结构型设计模式&#xff0c;它允许不兼容的接口之间进行交互。适配器模式通过包装一个已有的类&#xff0c;提供一个与原系统兼容的接…...

大语言模型落地的关键技术:RAG

1、什么是RAG&#xff1f; RAG 是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff09;的简称&#xff0c;是当前最火热的大语言模型应用落地的关键技术&#xff0c;主要用于提高语言模型的效果和准确性。它结合了两种主要的NLP方法&#xff1a;检索&#xff…...

ffmpeg Android 笔记

目录 没有示例项目 编译好的.a文件 ffmpegandroid 延时有220ms rk官方有例子 ffmpeg Android 笔记 没有示例项目 编译好的.a文件 FFmpeg-Android/ffmpeg-android-aarch64-34/lib at main yhbsh/FFmpeg-Android GitHub ffmpegandroid 看到了音频解码器 FFmpegAndroid/a…...

本地创建新分支并提交gitee

初始化本地仓库 git init链接远程仓库 git remote add origin https://gitee.com/xxxxxxxxxxx提交本地代码(进行commit提交) git add . git commit -m "分支名"创建分支 git branch 分支名选择刚刚创建的分支 git checkout 分支名查看所选中的分支 git branch …...

[蓝桥杯 2019 国 C] 数正方形

[蓝桥杯 2019 国 C] 数正方形 题目描述 在一个 N N N \times N NN 的点阵上&#xff0c;取其中 4 4 4 个点恰好组成一个正方形的 4 4 4 个顶点&#xff0c;一共有多少种不同的取法&#xff1f; 由于结果可能非常大&#xff0c;你只需要输出模 1 0 9 7 10^9 7 1097 的…...

Redis: 配置文件详解(Redis.conf)

文章目录 一、Units二、INCLUDES三、NETWORK四、GENERAL五、SECURITY六、LIMITS 一、Units 单位&#xff0c;配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感 二、INCLUDES 包含&#xff0c;多…...

学习vue3第十四节 Teleport 内置组件介绍

<Teleport></Teleport> 作用目的&#xff1a; 用于将指定的组件或者元素传送到指定的位置&#xff1b; 通常是自定义的全局通用弹窗&#xff0c;绑定到 body 上&#xff0c;而不是在当前元素上面&#xff1b; 使用方法&#xff1a; 接收两个参数 to: 要将目标传…...

mybatis模糊查询查不到数据

排除SQL语句本身存在错误,字段名称不匹配,编码格式问题后,若使用%方式查询,一开始使用单引号查询不到数据&#xff0c;把改成"&#xff0c;可以查询到数据 疑问&#xff1a;看别人的代码&#xff0c;使用单引号也可以查询到数据&#xff0c;原因未知...

Python语法总结:not(常出现错误)

0、not是什么 在python中not是逻辑判断词&#xff0c;用于布尔型True和False之前 a not Ture # a False b not False # b True1、not的用法 &#xff08;1&#xff09;判断语句 if not a:# 如果a是False&#xff0c;执行的语句&#xff08;2&#xff09;判断元素是否在…...

深入理解WebSocket:实时双向通信的利器

一、介绍 1.1 基础概念介绍 单工通信&#xff1a;数据传输只允许在一个方向上传输&#xff0c;只能一方发送数据&#xff0c;另一方接收数据并发送。半双工&#xff1a;数据传输允许两个方向上的传输&#xff0c;但在同一时间内&#xff0c;只可以有一方发送或接收数据。全双…...

Gateway是什么?(SpringCloudAlibaba组件)

1、网关介绍 **网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连&#xff0c;是最复杂的网络互连设备&#xff0c;仅用于两个高层协议不同的网络互连。**网关的结构也和路由器类似&#xff0c;不同的是互连层。网关既可以用于广域网互连&#xff0c;也可…...

阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验

在数字化快速发展的今天&#xff0c;智能化和个性化已经成为购物体验中不可或缺的元素。为了满足消费者日益增长的购物需求&#xff0c;阿里巴巴中国站不断推陈出新&#xff0c;其中拍立淘API的新功能——图片秒搜商品&#xff0c;无疑为智能化个性化购物体验开创了新的篇章。 …...

蚓链为移动实体经济加油!

在当今数字化时代&#xff0c;数据已成为企业宝贵的资产之一。如何利用数据资产为可移动实体经济创造更多的增值机会呢&#xff1f;蚓链将为你揭示 11种行之有效的方法&#xff01; 1. 个性化服务&#xff1a;根据客户数据&#xff0c;提供量身定制的产品和服务&#xff0c;满…...

MySQL 核心模块揭秘 | 12 期 | 创建 savepoint

回滚操作&#xff0c;除了回滚整个事务&#xff0c;还可以部分回滚。部分回滚&#xff0c;需要保存点&#xff08;savepoint&#xff09;的协助。本文我们先看看保存点里面都有什么。 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&…...

SpringMVC --- 老杜

1、什么是SpringMVC&#xff1f; SpringMVC是一个基于Java实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的及部分&#xff0c;…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...