今天你学C++了吗?——C++中的类与对象(日期类的实现)——实践与知识的碰撞❤

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥
♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥
♥♥♥我们一起努力成为更好的自己~♥♥♥
♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥
♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥
✨✨✨✨✨✨ 个人主页✨✨✨✨✨✨
❤C++专栏中比较重要的类与对象知识现在已经更新完毕❤欢迎大家随时访问哦❤
类与对象——第一集
类与对象——第二集
类与对象——第三集
类与对象——第四集
类与对象——最后一集(日期类的实现)
在前面的博客内容中,我们已经学习了C++中类与对象的大部分知识,这一篇博客我们将会利用前面学习到的知识,来实现一个日期类~用实践检验我们学习的成果~准备好了吗~我们发车啦~🚗🚗🚗🚗🚗🚗
目录
实现一个怎么样的日期类?
定义一个日期类
构造函数
拷贝构造函数
打印日期
使用成员函数
流插入运算符重载
流提取运算符重载
赋值运算符重载
判断日期大小关系
等于
不等于
大于
大于等于
小于
小于等于
日期+=天数
日期+天数
日期-=天数
日期-天数
前置++
后置++
前置--
后置--
日期-日期
总代码
Date.h
Date.cpp
实现一个怎么样的日期类?
我们生活中经常会使用到日期,比如日期加天数,日期-日期,倒计时等等,这里我们要实现的日期类就是来实现这样一些具有实际意义的日期处理~像日期加日期这种是没有实际意义的,我们这里也就不会进行实现~
这里我们创建三个文件~
Date.h
定义日期类结构,对要提供的操作进行声明
Date.cpp
具体实现各种操作
test.cpp
进行各种操作的测试
定义一个日期类
我们这里实现的日期类是包含年、月、日的,所以我们给到的成员变量就有年、月、日,同时使用private访问限定符进行修饰,不希望只希望在这一个类里面访问成员变量~
#include<iostream>
using namespace std;
//定义日期类
class Date
{
private://成员变量 年、月、日int _year;int _month;int _day;//前面加一个下划线便于区分
public://成员函数};//不要忘记末尾的分号

其他文件就可以包含我们自己写的头文件
注意这里是我们自己写的头文件,所以包含头文件的时候应该是双引号" ",而不是尖括号<>


构造函数
我们不希望使用编译器生成的构造函数让日期是随机值,所以我们这里需要自己写构造函数~
同时在构造的同时,我们也可以检查日期是否合法~
//检查日期是否合法~
bool Date::CheckDate()const
{if (_month > 12 || _month < 1 || _day <= 0 || _day > GetMonthDay(_year,_month)){return false;}return true;
}
//Date::Date(int year = 0,int month = 0,int day = 0)//err
Date::Date(int year,int month,int day)//声明和定义不可以同时给缺省参数
//在声明里面给缺省参数
{_year = year;_month = month;_day = day;//检查日期是否合法if (!CheckDate()){cout << "日期非法!" << *this << endl;}
}
拷贝构造函数
拷贝构造函数可以用一个已经初始化的对象来初始化新创建的对象,事实上,这里没有涉及到资源管理,我们可以不显示写拷贝构造函数,直接使用编译器自动生成的拷贝构造函数也是没有问题的~
显示写拷贝构造函数
//拷贝构造函数——可以用来初始化新创建的对象
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}
补充:自定义类型传值传参和传值返回会产生临时对象,所以它们都会调用拷贝构造函数~
(C++规定自定义类型对象进行拷贝的行为必须调用拷贝构造)
打印日期
接下来我们先来一个简单的,也是我们以前练习过的打印日期~
我们给出两种方法,一个是成员函数,一个是流插入运算符重载~
使用成员函数
使用成员函数的好处是,每一个成员函数参数都隐含一个this指针,这样我们就可以直接获得当前对象年月日进行打印~
void Date::Print()const
//const 修饰this指针指向的内容,我们不希望内容被修改
{cout << _year << "年" << _month << "月" << _day << "日" << endl;
}
流插入运算符重载
》<< 流插入运算符有两个操作数,在这里一个是ostream类型,一个是Date类型,如果把它设计成成员函数,那么隐含的this指针在第一个参数,就不符合我们平常使用的习惯~所以我们可以把它设计为全局函数~
》但是全局函数又不可以访问类的私有成员了,前面我们提到过三种解决方案~~
1.使用友元函数
2.提供get成员函数,获取年月日
3.将年月日成员变量改为公有
这里我们使用友元函数来达到目的~
在类里面加上friend关键字说明这个函数是这个类的友元函数,可以访问私有成员~

类外面对这个友元函数进行声明,这个时候就不需要再加friend关键字了

在Date.cpp文件里面进行函数的定义~
ostream& operator <<(ostream& ou, const Date& d)
{ou << d._year << "年" << d._month << "月" << d._day << "日" << endl;return ou;//有返回值实现连续输出
}
注意:这个重载函数返回值实现我们进行连续输出的操作~同时这里返回值只能使用引用返回~输出流我们是不可以改变的~
流提取运算符重载
知道了流插入运算符重载,流提取运算符重载就十分容易了~
在类里面加上friend关键字说明这个函数是这个类的友元函数,可以访问私有成员~这里与流插入运算符重载不相同的是d不能加const修饰,因为我们本身输入是修改了内容的~

类外面对这个友元函数进行声明,这个时候就不需要再加friend关键字了

在Date.cpp文件里面进行函数的定义~这里还可以增加一个小细节就是检查日期是否合法~
istream& operator>>(istream& in, Date& d)
{while (1){in >> d._year >> d._month >> d._day;//检查日期是否合法if (d.CheckDate()){break;}else{cout << "日期非法,请重新输入!" << endl;}}return in;
}
赋值运算符重载
》对于自定义类型,使用赋值运算符重载可以让我们完成两个已经初始化对象的拷贝~
》注意与拷贝构造函数进行区分,拷贝构造函数是用一个已经初始化的对象来初始化一个新创建的对象~
》赋值运算符重载同样有返回值,这样就可以实现连续赋值~
// d1 = d2
//* this d
//这里需要修改*this
Date& Date::operator=(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return *this;//有返回值,实现连续赋值
}
判断日期大小关系
等于
等于这个很好判断,只需要年月日都是相等的,那么这两个日期就是相等的~
bool Date::operator==(const Date& d)const
{//年月日相等就相等return (_year == d._year)&& (_month == d._month)&& (_day == d._day);
}
不等于
这里有两个方法
》一个是直接写,只要年月日有一个不相同,那么这两个日期就不相等~
》一个是进行代码复用(更加推荐这个方式,减少代码量)这里日期不相等就是相等的否
bool Date::operator!=(const Date& d)const
{//1.直接写/*return (_year != d._year)|| (_month != _month)|| (_day != d._day);*///2.代码复用return !(*this == d);
}
大于
判断思路:先判断年,年大就大;年相等判断月,月大就大;月相等就判断日,日大就大
bool Date::operator>(const Date& d)const
{if (_year > d._year){return true;}//年相等判断月if (_year == d._year){if (_month > d._month){return true;}//月相等判断天else if(_month == d._month){if (_day > d._day){return true;}}}return false;
}
大于等于
这里使用代码复用就大大减少我们的代码量了~事实上,前面实现了判断大于和等于,接下来的代码判断都可以使用代码复用~
bool Date::operator>=(const Date& d)const
{//代码复用return (*this == d) || (*this > d);
}
小于
bool Date::operator<(const Date& d)const
{代码复用return !((*this == d) || (*this > d));
}
小于等于
bool Date::operator<=(const Date& d)const
{//代码复用return (*this < d) || (*this == d);
}
日期+=天数
》思路:加的天数先加在日上面得到总天数,判断总天数是否大于当前月份天数,比当前月份天数大就用总天数减去当前月份天数,月加加,再判断是否大于当前月份天数,如此循环~
》这里我们就需要提供一个获取日期天数的方法,这里我们直接把这个函数定义在类里面,这个函数就成为了内联函数,可以直接在调用的地方进行展开~

获取月份天数:
//获取月份天数
// 直接定义在类里面成为inline函数
int GetMonthDay(int y, int m)const
{static int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31, 30,31 };// 0 1 2 3 4 5 6 7 8 9 10 11 12if (m == 2 && ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0)))//闰年的二月29天{return 29;}return arr[m];
}
日期+=天数:
//使用引用返回,减少拷贝次数
Date& Date::operator+=(int day)
{//特殊处理,day<0,调用日期-=天数if (day < 0)//调用日期减天数{*this -= (-day);}else{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);_month++;//特殊处理:到下一年if (_month == 13){_year++;_month = 1;}}}return *this;
}
日期+天数
》思路:这里日期加天数,本身是没有变化的,我们可以创建一个临时对象进行+=天数,返回临时对象~
》这里临时对象不可以使用引用返回,因为出了这个作用域临时对象就会销毁,我们需要传值返回,调用拷贝构造~
这里返回不可以使用引用,局部对象出了作用域就销毁了,原来的对象存储的数据随机了
//返回对象会产生一个临时对象,调用拷贝构造
Date Date::operator+(int day)
{//创建一个临时对象Date tmp(*this);//特殊处理,day < 0if (day < 0){tmp -= (-day);}else{//代码复用tmp += day;}return tmp;
}
日期-=天数
》思路:先让日减去当前月天数,如果_day<0,就让_month-- (注意特殊处理_month==0的时候,_year--,_month=1),_day加上_month的天数,再次判断_day是不是小于0
Date& Date::operator-=(int day)
{if (day < 0){*this += (-day);}else{_day -= day;while (_day <= 0){--_month;if (_month == 0){_year--;_month = 12;}_day += GetMonthDay(_year, _month);}}return *this;
}
日期-天数
》与日期+天数类似,进行代码复用就可以了~
Date Date::operator-(int day)
{Date tmp(*this);//特殊处理,day < 0,调用+=天数if (day < 0){tmp += (-day);}else{//代码复用tmp -= day;}return tmp;
}
前置++
》前置++是先++再使用,事实上也就是当前日期本身+=1,我们一样可以使用代码复用~
Date& Date::operator++()
{*this += 1;return *this;
}
后置++
》这里像前面那样为了与前置++区分,这里参数会有一个int进行区分,没有什么特别的意义,只是为了好区分~
》后置++是先使用再++,所有我们需要使用一个临时对象来保存++之前的值进行返回~
Date Date::operator++(int)//后面加int与前置++区分
{Date tmp = *this;*this += 1;return tmp;
}
接下来的前置--和后置--有了这些基础,相信就是小菜一碟了~
前置--
Date& Date::operator--()
{*this -= 1;//本身-=1return *this;
}
后置--
Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}
日期-日期
日期-日期是一个比较有意义的计算,而日期+日期没有实际意义,这里就不进行实现了~
》日期-日期,我们可以直接让小日期走到大日期进行计数
》同时注意是前面的日期大,还是后面的日期大~使用一个flag进行标记~
//*this —— d
int Date::operator-(const Date& d)const
{int flag = 1;//标记,默认前面的日期大Date max = *this;Date min = d;if (*this < d){//后面的日期大,重新赋值max = d;min = *this;flag = -1;}int n = 0;//计数//让小日期走到大日期进行计数while (min != max){min++;//或者min += 1;n++;}return n * flag;
}
到这里,我们就实现了一个比较完整的日期类~如果小伙伴们有更好的想法~欢迎评论区留言或者私信小编哦❤
总代码
Date.h
#pragma once#include<iostream>
using namespace std;
//定义日期类
class Date
{
private://成员变量 年、月、日int _year;int _month;int _day;//前面加一个下划线便于区分
public://成员函数//构造函数Date(int year = 0, int month = 0, int day = 0);//全缺省参数//拷贝构造函数Date(const Date& d);//检查日期是否合法bool CheckDate()const;//获取月份天数// 直接定义在类里面成为inline函数int GetMonthDay(int y, int m)const{static int arr[13] = { 0,31,28,31,30,31,30,31,31,30,31, 30,31 };// 0 1 2 3 4 5 6 7 8 9 10 11 12if (m == 2 && ((y % 400 == 0) || (y % 4 == 0 && y % 100 != 0)))//闰年的二月29天{return 29;}return arr[m];}//显示日期//1.成员函数//后面加const不希望this指针指向的内容被修改void Print()const;//2.使用友元,流插入运算符重载,进行输出//日期d加const不希望内容被修改friend ostream& operator <<(ostream& ou, const Date& d);//流提取运算符重载//日期d不加const,输入本身修改了内容//输入后需要判断日期是否合法friend istream& operator>>(istream& in, Date& d);//日期操作运算符重载//赋值运算符重载Date& operator=(const Date& d);//日期相等==bool operator==(const Date& d)const;//只是判断,不希望日期被修改 *this 和 d//不相等!=bool operator!=(const Date& d)const;//大于>bool operator>(const Date& d)const;//>=bool operator>=(const Date& d)const;//<bool operator<(const Date& d)const;//<=bool operator<=(const Date& d)const;//日期+=天数——改变日期本身Date& operator+=(int day);//日期加天数,不改变本身Date operator+(int day);//日期-=天数——改变日期本身Date& operator-=(int day);//日期-天数,不改变本身Date operator-(int day);//前置++——先++再使用,本身发生变化Date& operator++();//后置++——先使用再++Date operator++(int);//后面加int与前置++区分//前置--Date& operator--();//后置--Date operator--(int);//日期减日期int operator-(const Date& d)const;};//不要忘记末尾的分号//>>和<<定义为全局函数,符合我们的使用习惯
//Date的友元函数,可以访问Date类里面的私有成员
ostream& operator <<(ostream& ou, const Date& d);//类外不需要再使用friend关键字istream& operator>>(istream& in, Date& d);
Date.cpp
#include"Date.h"//自己写的头文件使用""//Date::Date(int year = 0,int month = 0,int day = 0)//err
Date::Date(int year,int month,int day)//声明和定义不可以同时给缺省参数
//在声明里面给缺省参数
{_year = year;_month = month;_day = day;//检查日期是否合法if (!CheckDate()){cout << "日期非法!" << *this << endl;}
}//拷贝构造函数——可以用来初始化新创建的对象
Date::Date(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;
}//检查日期是否合法~
bool Date::CheckDate()const
{if (_month > 12 || _month < 1 || _day <= 0 || _day > GetMonthDay(_year,_month)){return false;}return true;
}void Date::Print()const
//const 修饰this指针指向的内容,我们不希望内容被修改
{cout << _year << "年" << _month << "月" << _day << "日" << endl;
}ostream& operator <<(ostream& ou, const Date& d)
{ou << d._year << "年" << d._month << "月" << d._day << "日" << endl;return ou;//有返回值实现连续输出
}istream& operator>>(istream& in, Date& d)
{while (1){in >> d._year >> d._month >> d._day;//检查日期是否合法if (d.CheckDate()){break;}else{cout << "日期非法,请重新输入!" << endl;}}return in;
}// d1 = d2
//* this d
//这里需要修改*this
Date& Date::operator=(const Date& d)
{_year = d._year;_month = d._month;_day = d._day;return *this;//有返回值,实现连续赋值
}
bool Date::operator==(const Date& d)const
{//年月日相等就相等return (_year == d._year)&& (_month == d._month)&& (_day == d._day);
}bool Date::operator!=(const Date& d)const
{//1.直接写/*return (_year != d._year)|| (_month != _month)|| (_day != d._day);*///2.代码复用return !(*this == d);
}bool Date::operator>(const Date& d)const
{if (_year > d._year){return true;}//年相等判断月if (_year == d._year){if (_month > d._month){return true;}//月相等判断天else if(_month == d._month){if (_day > d._day){return true;}}}return false;
}bool Date::operator>=(const Date& d)const
{//代码复用return (*this == d) || (*this > d);
}bool Date::operator<(const Date& d)const
{代码复用return !((*this == d) || (*this > d));
}bool Date::operator<=(const Date& d)const
{//代码复用return (*this < d) || (*this == d);
}//使用引用返回,减少拷贝次数
Date& Date::operator+=(int day)
{//特殊处理,day<0,调用日期-=天数if (day < 0)//调用日期减天数{*this -= (-day);}else{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);_month++;//特殊处理:到下一年if (_month == 13){_year++;_month = 1;}}}return *this;
}这里返回不可以使用引用,局部对象出了作用域就销毁了,原来的对象存储的数据随机了
//返回对象会产生一个临时对象,调用拷贝构造
Date Date::operator+(int day)
{//创建一个临时对象Date tmp(*this);//特殊处理,day < 0if (day < 0){tmp -= (-day);}else{//代码复用tmp += day;}return tmp;
}Date& Date::operator-=(int day)
{if (day < 0){*this += (-day);}else{_day -= day;while (_day <= 0){--_month;if (_month == 0){_year--;_month = 12;}_day += GetMonthDay(_year, _month);}}return *this;
}Date Date::operator-(int day)
{Date tmp(*this);//特殊处理,day < 0,调用+=天数if (day < 0){tmp += (-day);}else{//代码复用tmp -= day;}return tmp;
}Date& Date::operator++()
{*this += 1;return *this;
}Date Date::operator++(int)//后面加int与前置++区分
{Date tmp = *this;*this += 1;return tmp;
}Date& Date::operator--()
{*this -= 1;return *this;
}Date Date::operator--(int)
{Date tmp = *this;*this -= 1;return tmp;
}//*this —— d
int Date::operator-(const Date& d)const
{int flag = 1;//标记,默认前面的日期大Date max = *this;Date min = d;if (*this < d){//后面的日期大,重新赋值max = d;min = *this;flag = -1;}int n = 0;//计数//让小日期走到大日期进行计数while (min != max){min++;//或者min += 1;n++;}return n * flag;
}
♥♥♥本篇博客内容结束,期待与各位优秀程序员交流,有什么问题请私信♥♥♥
♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥
✨✨✨✨✨✨个人主页✨✨✨✨✨✨
相关文章:
今天你学C++了吗?——C++中的类与对象(日期类的实现)——实践与知识的碰撞❤
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
享元模式的理解和实践
在软件开发中,性能优化是一个永恒的话题。在追求高性能的过程中,减少内存的使用是一项重要的任务。享元模式(Flyweight Pattern)就是一种用于减少内存使用量的设计模式,它特别适用于存在大量重复对象的场景。本文将详细…...
Unreal Engine 中的UI界面开发
推荐的使用方式 轻量级 HUD:使用 Canvas 绘制简单的文本、调试信息或基础 UI(如准星、血量条等)。 复杂 UI:使用 UMG(Unreal Motion Graphics)和 Slate 进行布局和交互,避免手动管理 Canvas 绘制。 避免遮挡场景:仅绘制必要的内容,并利用透明度(如 FLinearColor(1, 1…...
Docker在Ubuntu和CentOS系统下的安装
目录 1. 各版本平台支持情况2. 在Ubuntu系统下安装docker3. 常见报错4. Docker的镜像源修改5. Docker目录修改6. 在CentOS系统下安装docker 1. 各版本平台支持情况 (1)平台支持情况如下: Server 版本 桌面版本 2. 在Ubuntu系统下安装docker…...
EXCEL 关于plot 折线图--频度折线图的一些细节
目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了,频度plot 4 做按某字段汇总,成为累计plot分布 5 修改上面显示效果,做成百分比累计plot频度分布 0 折线图有很多 这…...
Hive操作案例
目录 idea/dg远程连接导入数据建表数据导入 idea/dg远程连接 hive的详细安装不多展示,自行搜索即可。 依次启动zookeeper,hadoop 在zookeeper的节点上启动如下指令(我的是1个主节点和2个备用节点) 启动Hive的metastore࿰…...
C++ 内存管理和模板与STL
此篇目是之后各种C库的基础 目录 内存管理 内存分布 内存管理方式 new和delete operator new 与 operator delete函数 实现原理 定位new表达式(placement-new) 模板基础 泛型编程 模板 函数模板 类模板 STL 组成部分 内存管理 内存分布 int globalVar 1; //全局变量 静…...
JDK8新特性:Stream
JDK8最大的改变: 1. lambda表达式 2. Stream 1. Steam流的入门 什么是Stream? 也叫Stream流,是jdk8开始的一套API,用于操作集合或者数组中的数据 优点: Stream流大量结合了Lambda的语法风格来创建,提…...
前端传入Grule,后端保存到 .grl 文件中
前端传入Grule,后端保存到 .grl 文件中 通过简单的输入框,将Grule的部分拆解成 规则名称 规则描述 规则优先级 规则条件 规则逻辑Grule关键字 when Then 模拟了 if 判断的条件和逻辑部分 类似于 shell 和 ruby 之类的脚本语言,有 then 关键字…...
探索《Crypto Rumble》 游戏:经济模型篇
《Crypto Rumble》是一款基于 Zypher Network 游戏引擎打造的卡牌 RPG三消品类的 Web3 游戏,通过引人入胜的游戏设计以及轻量化的游戏玩法,《Crypto Rumble》不仅能够为玩家带来引人入胜的沉浸式游戏体验,同时基于 AI Bot 的游戏编辑器&#…...
【CSS in Depth 2 精译_072】第 12 章 CSS 排版与间距概述 + 12.1 间距设置(上):究竟该用 em 还是 px
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 ✔️ 12.1.1 使用 em 还是 px ✔️12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 文章目录 第 12 章 排版与间距…...
Elasticsearch对象映射
Spring Data Elasticsearch对象映射是将Java对象(域实体)映射到存储在Elasticsearchs中的JSON表示形式并返回的过程。内部用于此映射的类是MappingElasticsearchConverter。 元模型对象映射 基于元模型的方法使用域类型信息对Elasticsearch进行读写操作…...
Oracle 19c rac 补丁升级,从19.7 to19.22-集群
1. 补丁包概述 数据库环境 角色 数据库 IP地址 数据库版本 主机名 数据库名称 源端 RAC 172.30.21.166/167 19.7 hfcwdb66/hfcwdb67 hfdb 将以下补丁包上传到/soft下 上传到两个节点的soft目录下:p6880880_190000_Linux-x86-64.zip (更新o…...
机器学习--Kaggle的使用
机器学习–Kaggle的使用 打开Kaggle: Your Machine Learning and Data Science Community并点击Sign In登录账号 kaggle中自带了很多的数据集 在点击Datasets之后,单点Notebook,如果有适用的数据集可以单击Copy and Edit复制其Notebook,之后…...
客户服务新突破,天润融通助力电动车企业实现数智化转型
近年来,两轮电动车成为年轻人喜爱的出行新方式,借着这种潮流,许多新兴品牌迅速发展,并跻身行业头部。 但问题也随之而来,由于业务快速发展,各类服务问题也开始增多。 比如天润融通服务的一家头部两轮电动…...
力扣题目 - 2931.购买物品的最大开销
题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …...
智慧化工园区自动化在线监测,建立产业链路数字安全网
智慧化工升级国家政策推动安全风险频发 化工园区作为化工产业的核心集聚地,在全球经济中占据重要地位。为推动行业的高质量发展,国家相继发布了《“十四五”危险化学品安全生产规划方案》、《石化化工行业数字化转型实施指南》和《化工园区安全风险智能化…...
在Docker中运行MySQL的思考:挑战与解决方案
引言 在云计算和容器化技术日益普及的今天,Docker作为一种轻量级的容器化平台,已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而,并非所有应用都适合在Docker容器中…...
Linux中所有和$有关的操作
prog < file 命令在 Shell 编程中用于 输入重定向,它将文件的内容作为程序的输入。即,程序 prog 会从文件 file 中读取数据,而不是从标准输入(通常是键盘)读取数据。 基本语法: prog < file 解释&…...
github操作学习笔记(杂乱版)
git开源的分布式版本控制系统: 每次修改文件提交后,都会自动创建一个项目版本 查看git版本看有没有安装成功:git --version 把默认编辑器设置成vim:git config --global core.editor "vim" 1、设置昵称和邮箱ÿ…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
