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

今天你学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++中的类与对象(日期类的实现)——实践与知识的碰撞❤

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…...

前端工程化(三)

如何使用 Webpack 优化产出代码&#xff1f; 使用 Webpack 优化产出代码可以通过以下几种方式&#xff1a; 压缩代码&#xff1a;在生产环境中&#xff0c;使用 UglifyJSPlugin 或 TerserPlugin 等插件对代码进行压缩&#xff0c;可以减少代码体积&#xff0c;提高加载速度。…...

SQLAlchemy: Python中的强大数据库工具

SQLAlchemy: Python中的强大数据库工具 SQLAlchemy是一个功能强大的Python库&#xff0c;广泛应用于数据库操作。它提供了一个灵活的数据库抽象层&#xff0c;可以帮助开发者轻松与关系型数据库进行交互。本文将介绍SQLAlchemy的核心组件、常用功能以及它的优势。 1. SQLAlch…...

scala的泛型特质的应用场景

//泛型特质的应用场景 //作比较找出最大值 //定义一个函数&#xff0c;用来求List元素中的最大值参考代码&#xff1a;object Test4 {def getMax[T](list:List[T])(implicit ev:T > Ordered[T]): T {list.reduce((a:T,b:T)> if(a>b) a else b)}def main(args: Array…...

【C++】重载运算与类型转换(七):成员访问运算符

14.7 成员访问运算符 在迭代器类和智能指针类常常用到解引用运算符&#xff08;*&#xff09;和箭头运算符&#xff08;->&#xff09;。以如下形式向 StrBlobPtr 类添加这两种运算符&#xff1a; class StrBlobPtr {public:std::string& operator*() const{ auto p …...

论文结论:GPTs and Hallucination Why do large language models hallucinate

GPTs and Hallucination 当一个主题有普遍共识&#xff0c;并且有大量语言可用于训练模型时&#xff0c;大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】&#xff0c;或者主题有争议&#xff0c;或是对主题没有明确共识的情况下&#xff0c;就…...

修改通过 Docker 部署的 WordPress 上传文件的大小

要修改通过 Docker 部署的 WordPress 上传文件的大小&#xff0c;你可以按照以下步骤操作&#xff1a; 进入 Docker 容器&#xff1a;首先&#xff0c;你需要进入 WordPress 容器内部。可以使用如下命令&#xff1a; docker exec -it wordpress /bin/bash其中wordpress是你的 W…...

微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列

参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子&#xff0c;但并不完整&#xff0c;根据上述代码&#xff0c;进行修改完善&#xff0c;实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...

信而泰网络测试仪校准解决方案

一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表&#xff0c;可以模拟网络终端产生流量&#xff0c;进行网络性能测试&#xff0c;对网络状态进行实时监测&#xff0c;分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针&a…...

聊聊在应用层面实现内网穿透功能是否可行

前言 最近接手了供方开发的网关项目&#xff0c;交接文档里面有个内网穿透的功能&#xff0c;一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网&#xff0c;这些公网的业务想访问内网的业务&#xff0c;但因为公网和内网没打通&#xff0c;导致…...

linux 20.04 安装sougou输入法 重启 可视化界面 无法点击

在Linux 20.04&#xff08;Ubuntu 20.04&#xff09;系统中安装搜狗输入法后&#xff0c;如果遇到重启后可视化界面无法点击的问题&#xff0c;这通常是由于搜狗输入法或其依赖的输入法框架&#xff08;如fcitx&#xff09;与系统的某些部分不兼容所导致的。以下是一些可能的解…...

springboot整合lua脚本在Redis实现商品库存扣减

1、目的 使用lua脚本&#xff0c;可以保证多条命令的操作原子性&#xff1b;同时可以减少操作IO&#xff08;比如说判断redis对应数据是否小于0&#xff0c;小于0就重置为100&#xff0c;这个场景一般是取出来再判断&#xff0c;再存放进行&#xff0c;就至少存在2次IO,用lua脚…...

lspci简介

lspci命令用于列出系统中所有pci设备信息,其输出信息包括设备的bdf地址(总线号、设备号和功能号)、设备类型、厂商信息等。 lspci命令的基本用法: lspci:列出所有pci设备的详细信息 参数: -v:显示详细信息,包括驱动程序、总线和端口等信息 -t:以属性结构显…...

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后&#xff0c;用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了&#xff0c;可以去maven官网下载补充。 如果run时提示程序包xx不存在&#xff0c;在项目目录右键Marven->Re…...

Mave下载、安装以及idea(2024)进行配置

目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具&#xff0c;也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…...

Spark SQL 执行计划解析源码分析

本文用于记录Spark SQL执行计划解析的源码分析。文中仅对关键要点进行提及&#xff0c;无法面面具到&#xff0c;仅描述大体的框架。 Spark的Client有很多种&#xff0c;spark-sql&#xff0c;pyspark&#xff0c;spark- submit&#xff0c;R等各种提交方式&#xff0c;这里以…...

51c嵌入式~单片机~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&a…...

【electron】electron forge + vite + vue + electron-release-server 自动更新客户端

基本信息 electron forge vue页面&#xff08;中文&#xff09;&#xff1a;https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面&#xff08;英文&#xff0c;中文版下面的tab无法点击&#xff09;&#xff1a;https://www.electronfor…...

FastAPI vs Flask 选择最适合您的 Python Web 框架

文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域&#xff0c;FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能&#xff0c;但是在某些方面有所不同。本文将比较 FastAPI…...

E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

我们在使用Ubuntu系统时经常性使用sudo apt install命令安装所需要的软件库&#xff0c;偶尔会出现如下问题&#xff1a; E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend)&#xff0c;是否有其…...

Spring Boot整合 RabbitMQ

文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…...

Spring Boot 进阶指南:深入核心与实战技巧

当你掌握了 Spring Boot 的基础开发流程后&#xff0c;可以进一步学习其高级功能和优化技巧&#xff0c;以便在复杂场景中高效开发和维护应用。本篇博客将带你深入探讨 Spring Boot 的核心机制&#xff0c;覆盖配置管理、高级特性以及性能优化等内容。 1. 深入理解 Spring Boot…...

淘宝详情网页爬虫:技术解析与实战指南

引言 淘宝作为中国最大的电商平台之一&#xff0c;拥有海量的商品数据。对于开发者来说&#xff0c;获取淘宝商品详情接口是一个常见的需求。本文将介绍如何使用Python编写爬虫&#xff0c;获取淘宝商品详情信息&#xff0c;并探讨在实际应用中可能遇到的挑战与解决方案。 环…...

远程桌面防护的几种方式及优缺点分析

远程桌面登录是管理服务器最主要的方式&#xff0c;于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码&#xff0c;悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全&#xff0c;攻击者可以利…...

WordPress后门插件Query Console 未授权RCE漏洞复现(CVE-2024-50498)

0x01 产品描述: ‌WP Query Console‌是一个为...

机器学习经典算法

机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...

Mac/Windows端长期破解myBase8方法(无需安装火绒)

提醒 不管哪个端&#xff0c;都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100&#xff0c;即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.&#xff0c;显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件&#xff0c;删除Fir…...

数据结构:原地移除所有数值等于 val 的元素,删除排序数组中的重复项,数组形式的整数加法

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素。 要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) { int sc…...

python3 re正则入门

Python 中的 re 模块是处理正则表达式的标准库&#xff0c;可以用来匹配字符串模式、提取子字符串、替换文本等。以下是 re 模块的基本用法和常见正则表达式模式入门。 1. 导入模块 在使用正则表达式之前&#xff0c;需要导入 re 模块&#xff1a; import re2. 常用函数 1&a…...

一个用于 SMB/CIFS 网络的 Java 库-JCIFS

1.引言 在网络通信中&#xff0c;服务器消息块&#xff08;SMB&#xff09;协议在计算机之间实现文件共享和通信方面发挥着重要作用。对于 Java 开发者来说&#xff0c;由于缺乏对该协议的内置支持&#xff0c;使用 SMB 可能会面临挑战。这时&#xff0c;JCIFS&#xff08;Jav…...

AI 编程入门:理解核心算法与数据结构基础

在踏上人工智能(AI)编程的奇妙之旅时,掌握核心算法与数据结构基础就像是为自己打造了一把开启知识宝库的万能钥匙。这些基础元素不仅是构建智能系统的基石,更是理解AI如何学习、推理和决策的关键所在。 一、线性回归:从数据中探寻线性关系的基础算法 线性回归是AI编程中…...

js:v-for循环中我希望再次循环七张图片,需要在v-for中嵌套一个v-for还是?

问&#xff1a; div classxxxx v-for(item,index) in data :keyindex div classimgDiv div classimgDivBox /div /div .imgDivBox { .background-img(/assets/images/top_01.png) } 这是现在设置的图片&#xff0c;但是现在我希望遍历一个数组然后遍历top01-top07&…...

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功

项目场景&#xff1a; 使用MAC电脑&#xff0c;以子账号&#xff08;非root&#xff09;的形式登录&#xff0c;连接堡垒机CLB&#xff08;传统型负载均衡&#xff09;&#xff0c;使用FileZilla&#xff08;SFTP&#xff09;进行FTP文件传输。 问题描述&#xff1a; MAC电脑…...

Spring Security授权案例集合

目录 授权前置内容权限表的设计建表和相关说明 用户权限配置内部关键类GrantedAuthority和SimpleGrantedAuthority关键类使用示例 资源访问控制方法一、配置类设置访问控制方法二、注解类设置访问控制&#xff08;优选&#xff09; 权限不足的处理方法 授权 前置内容 描述&am…...

自动化中关于文本的xpath定位

selenium中&#xff1a;//*[text()内容] appium中&#xff1a;//*[text热门] 如果是网页端元素&#xff0c;可以打开console&#xff0c;编写 $x("//div[1]") 判断自己写的xpath是否正确&#xff1b; 如果是appium&#xff0c;settings里面PLugins,下载XPathViewXS…...

数据结构 -- #栈和队列的定义和基本实现

文章目录 栈和队列的基本概念栈栈的顺序存储实现栈的链式存储实现(不带头结点) 队列队列的顺序存储实现队列的链式存储实现(带头结点)入队图解出队图解 总结 若没有相关知识基础&#xff0c;可以先看看下面文章哦&#x1f917;&#x1f447; 线性表 栈和队列的基本概念 栈 栈…...

共享GitLab中CICD自动生成的软件包

0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件&#xff0c;在下载固件时候&#xff0c;而无需打开网页&#xff0c;直接输入地址&#xff0c;弹出的对话框是将固件另存为。 或者进入CICD页面&#xff0c;找到job&#xff0c;在Download的标签上单击右键…...

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比&#xff01;VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…...

c# 协变与抗变

协变与抗变 1. 背景 一个简单的例子, public class Sharp {}public class Rectange : Sharp {}上面定义了两个简单的类,一个是图形类,一个是矩形类;它们之间有简单的继承关系:矩形是图形的一种。 接下来是常见的一种里氏替换写法: Sharp sharp = new Rectange();“子…...

Android Studio 创建虚拟设备的详细图文操作教程

本篇文章主要讲解 Android Studio 创建模拟器详细图文操作&#xff0c;包含了每一步的详细操作&#xff0c;便于理解和掌握对模拟的创建。 日期&#xff1a;2024年12月9日 作者&#xff1a;任聪聪 运行效果&#xff1a; 说明&#xff1a;创建运行后&#xff0c;点击右侧如下图…...

高级数据结构-树状数组

介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…...

Android SDK 平台工具版本说明

Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具&#xff0c;主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的&#xff0c;但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...

【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现快速排序算法。 测试说明 平台会对你编写的代码进行测试&#xff1a; 测试输入示例&#xff1a; 10 6 8 7 9 0 1 3 2 4 5 (说明&#xff1a;第一行是元素个数&a…...

Vue项目打包部署到服务器

1. Vue项目打包部署到服务器 1.1. 配置 &#xff08;1&#xff09;修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }&#xff08;2&#xff09;检查router下的index.js文件下配置的mode模式。   检查如果模式改…...

写作词汇积累:差池、一体两面、切实可行极简理解

差池 【差池】可以是名词&#xff0c;是指意外的事或错误。 【差池】也可以是形容词&#xff0c;是指参差不齐、差劲或不行。 1. 由于操作不当&#xff0c;导致这次实验出现了【差池】&#xff0c;我们需要重新分析原因并调整方案。&#xff08;名词&#xff0c;表示意外的事…...

【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明

参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分&#xff1a; EasyCwmp 核心&#xff1a;它包括 TR069 CWMP 引擎&#xff0c;负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel&#xff1a;它包…...

C++ STL学习

首先声明&#xff1a;本文内容全部来自bilibili的【【C】算法竞赛常用 STL 用法】 https://www.bilibili.com/video/BV1L8411y7th/?share_sourcecopy_web&vd_source6548350a40ddeb68e9c477994f630bf0这个视频&#xff0c;在此对up主表示感谢&#xff0c;大家也可以直接去看…...

【源码+文档+调试讲解】校园零售商城微信小程序

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园零售商城微信小程序的网络应用&#xff0c;在外国校园零售商城微信小程序已经是很普遍的方式&#xff0c;不过国内的校园零售商城微信小程序可能还处于起步阶段。校…...

BUUCTF Pwn bjdctf_2020_babystack2 题解

1.下载 checksec 64位 拖入IDA64 定位到main函数 以及后门函数 发现read需要读取输入——nbytes的数字来决定长度 同时nbytes是size_t类型 也就是无符号整型的 所以想到整数溢出漏洞 将nbytes设置为-1就会回绕&#xff0c;变成超大整数 从而实现栈溢出漏洞 exp&#xff1a…...