今天你学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;
}


♥♥♥本篇博客内容结束,期待与各位优秀程序员交流,有什么问题请私信♥♥♥

♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥

✨✨✨✨✨✨个人主页✨✨✨✨✨✨


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

负载均衡和tomcat

一、负载均衡 1.相关概念 nginx的反向代理<-->负载均衡 负载均衡 将四层或者是七层的请求分配到多台后端的服务器上&#xff0c;从而分担整个业务的负载。提高系统的稳定性&#xff0c;也可以提供高可用&#xff08;备灾&#xff0c;其中的一台后端服务器如果发生故障…

【蓝桥杯每日一题】推导部分和——带权并查集

推导部分和 2024-12-11 蓝桥杯每日一题 推导部分和 带权并查集 题目大意 对于一个长度为 ( N ) 的整数数列 ( A 1 , A 2 , ⋯ , A N A_1, A_2, \cdots, A_N A1​,A2​,⋯,AN​ )&#xff0c;小蓝想知道下标 ( l ) 到 ( r ) 的部分和 ∑ i l r A i A l A l 1 ⋯ A r \su…

【C++】判断能否被 3, 5, 7 整除问题解析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;老师代码实现与分析老师代码逻辑分析优点缺点 &#x1f4af;学生代码实现与分析学生代码逻辑分析优点缺点 &#x1f4af;改进与优化优化代码实现优化…

[计算机网络]IP地址推行的“书同文,车同轨”

硬件地址无法直接转换的故事 在很久很久以前&#xff0c;网络世界就像一个庞大的帝国&#xff0c;各个村落&#xff08;网络&#xff09;都有自己的语言&#xff08;硬件地址&#xff09;。每个村落都有自己的规则和习惯&#xff0c;村里的每户人家&#xff08;设备&#xff0…

深度优先搜索(DFS)与回溯法:从全排列到子集问题的决策树与剪枝优化

文章目录 前言&#x1f384;一、全排列✨核心思路✨实现步骤✨代码✨时间和空间复杂度&#x1f381;1. 时间复杂度&#x1f381;2. 空间复杂度 &#x1f384;二、子集✨解法一&#xff1a;逐位置决策法&#x1f381;步骤分析&#x1f381;运行示例&#x1f381;代码 ✨解法二&a…

egg初始搭建

前言 egg.js 是由阿里开源的面向企业级开发的 Node.js 服务端框架&#xff0c;它的底层是由 Koa2 搭建。 Github&#xff1a;https://github.com/eggjs/egg&#xff0c;目前 14.8K Star&#xff0c;egg 很适合做中台。 安装 首先&#xff0c;你要 确保 Node 已经配置环境变量…

Python中的all/any函数和操作符and/or

操作符直观易读适用简单逻辑&#xff0c;函数紧凑方便适宜多条件处理。 (笔记模板由python脚本于2024年12月12日 22:19:10创建&#xff0c;本篇笔记适合有一定编程基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff…

论文学习——多种变化环境下基于多种群进化的动态约束多目标优化

论文题目&#xff1a;Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化&#xff08;Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省) 任务书

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省 任务书 模块一网络平台搭建与设备安全防护任务1&#xff1a;网络平台搭建 &#xff08;50分&#xff09;任务2&#xff1a;网络安全设备配置与防护&#xff08;250分&#xff09; 模块二网络安全事件响应、数字取证…

国标GB28181-2022平台EasyGBS如何实现无插件也能让RTSP在网页端播放?

在流媒体技术日新月异的今天&#xff0c;实时流传输协议&#xff08;RTSP&#xff09;作为视频监控、在线直播等领域的重要支撑&#xff0c;正经历着前所未有的变革。曾经&#xff0c;RTSP在网页端播放面临着诸多挑战&#xff0c;如浏览器兼容性问题、安全性考量以及视频流处理…

EXCEL 关于plot 折线图--频度折线图的一些细节

目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了&#xff0c;频度plot 4 做按某字段汇总&#xff0c;成为累计plot分布 5 修改上面显示效果&#xff0c;做成百分比累计plot频度分布 0 折线图有很多 这…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 &#xff0c;否则为 0 ) and表示(全为1时才为1&#xff0c;否则为0) and表示(全为1时才为1&#xff0c;否则为0)&#xff0c;逻辑或用|或 o r 表示 ( 有 1 就为 1 &#xff0c;都为 0 才为 0 ) or表示…

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数&#xff0c;比如寻找瓶颈值的场景&#xff0c;需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…

iPhone苹果相册视频怎么提取音频?

在数字时代&#xff0c;视频已成为我们记录生活、分享故事的重要方式。然而&#xff0c;有时候我们只想保留视频中的音频部分&#xff0c;比如一段动人的背景音乐或是一段珍贵的对话。那么&#xff0c;苹果相册视频怎么提取音频呢&#xff1f;本文将介绍三种简单且实用的方法&a…

阿里云数据库MongoDB版助力极致游戏高效开发

客户简介 成立于2010年的厦门极致互动网络技术股份有限公司&#xff08;以下简称“公司”或“极致游戏”&#xff09;&#xff0c;是一家集网络游戏产品研发与运营为一体的重点软件企业&#xff0c;公司专注于面向全球用户的网络游戏研发与运营。在整个产业链中&#xff0c;公…

前端成长之路:HTML(4)

前文提到&#xff0c;在HTML中&#xff0c;表格是为了展示数据&#xff0c;表单是为了提交数据。表单标签是十分重要的标签&#xff0c;在网页中&#xff0c;需要和用户进行交互&#xff0c;收集用户信息等&#xff0c;此时就需要使用表单。表单可以将前端收集到的用户输入的信…

axios请求之参数拼接

URL 查询参数传递数据 优点&#xff1a; 简洁性: URL 查询参数的方式比较简洁&#xff0c;适合传递少量的数据。缓存友好: 查询参数可以被浏览器缓存&#xff0c;适合 GET 请求&#xff0c;但对于 POST 请求&#xff0c;浏览器通常不会缓存。 缺点&#xff1a; 数据大小限制: U…

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护

10.6 大型网站系统架构演化实例 大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;主要解决这类问题。 1. 单体架构 特点: 所有资源&#xff08;应用程序、数据库、文件&#xff09;集中在一台服务器上。适用场景: 小型网站&am…

【Java学习笔记】Collections 工具类

一、基本介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作 二、排序操作&#xff1a;&#xff08;均为 static 方法) 三、查找、替换

Mac备忘录表格中换行(`Option` + `Return`(回车键))

在Mac的ARM架构设备上&#xff0c;如果你使用的是Apple的原生“备忘录”应用来创建表格&#xff0c;换行操作可以通过以下步骤来实现&#xff1a; 在单元格中换行&#xff1a; 双击你想要编辑的单元格你可以输入文本&#xff0c;按Option&#xff08;⌥&#xff09; Enter来插…