【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑

作者:chlorine

专栏:c++专栏

赋值运算符重载(+)(+=)(++):实现完整的日期类(上)

我走的很慢,但我从不后退。

【学习目标】

  • 日期(- -= --)天数重载运算符
  • 日期-日期 返回天数
  • 对日期类函数进行优化(不符合常理的日期,负数,const成员)
  • c++中重载输入cin和输出cout运算符
  • const成员

首先我要对上面一篇类和对象(上)进行补充,上一篇主要内容

  • '=' 赋值运算符重载
  • '<'  '='  '>'  '<='  '>='  '!=' 重载运算符
  • '前置++' '后置++’ 重载运算符

相信大家对于operator的运用以及重载运算符有了一定的了解。本次博客我会继续深化赋值运算符重载的内容,并对各函数进行优化处理。


目录

🔑'—' '-='重载运算符

🔑前置--,后置-- 

 🔑日期-日期=天数

🔑+=(-=)负数 (优化)

🔑C++中重载输入cin和输出cout运算符

🌈重载输入cin运算符>> 

🌈重载输入cout运算符<<

🔑不符合常理的日期(优化)

🔑const成员(优化)

🌈const对于+=和+ 

🌈const对于d1<d2?和d1>d2

🕶️完整代码

🚩Date.h

🚩Date.cpp

🚩test.cpp


🔑'—' '-='重载运算符

我们不只局限于对未来的计算,虽然以前的日子已经一去不复返。如果我们想知道100天是哪一天?该如何操作呢?上面的图片今天是2023年11月18日,一百天前是2023年8月10日,这是该如何计算呢?

11月已经被-100了,这里要+上的是10月份的天数。

计算过程如图所示。我们可以根据上面思路进行写代码。

主要思路:先将日-100,然后如果是负数就进入循环 ,月份-1,就可以得到在此基础上的上一个月的天数,然后我们还要考虑一个情况,就是如果月份=0,我们就要追溯到上一年的12月开始。代码如下:

Date &Date::operator-=(int day)
{
    _day-=day;
    while(_day<=0)
   {
       --_month;
      if(_month==0)
      {
        _month=12;
        --_year;
      }    
     _day+=GetMonthDay(_year,_month);
   }
   return *this;
}

 那么-重载运算符和+重载运算符一个道理,不能改变原来的值,就创建一个临时变量tmp,保留d1原来的值,然后返回tmp.

依旧使用-复用-=的方法.

Date Date::operator-(int day)
{
	Date tmp(*this);
	tmp -=day;
	return tmp;
}

🔑前置--,后置-- 

前置--后置--和前置++后置++的用法是一样的

  • 前置--:返回的减之后的值。
  • 后置--:返回的减之前的值,需要用拷贝构造创建 一个临时变量tmp来保存原来的值。并且后置--重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递  。
//前置--返回的是减之后的值
Date& Date::operator--()
{
	*this -= 1;
	return *this;
}

//后置--返回的是减之前的值
Date Date::operator--(int)
{
	Date tmp = *this;
	*this -= 1;
	return tmp;
}

 🔑日期-日期=天数

我想计算一下自己的生日和今天相差多少天?我该如何用代码实现呢?

 第一种思路:

  • 我们可以与小的日期和大的日期的年份设置成一样的,然后就可以利用 《月和日对齐,利用年判断润平年,闰年一年多少天,平年一年的多少天,相加)
  • 然后算出了2003-10-29~~~2023-10-29相差多少天,然后 《年对齐,利用获得每个月的天数进行相加》

思路的俩个步骤,比较于直接减方便多了。

第二种思路:

  • d1-d2   我们先假设d1是小min日期,d2是大max日期,如果我的猜测不对,就将min赋值给d2,max赋值给d1。我们要用flag=1或-1来记录,如果(小-大就得乘以-1)(大-小就得乘以1)
  • 小的数如果一直++是可以与大的数持平的,我们就进行一个循环直到min=max的时候结束,过程中min一直++,用n来记下min一直+的次数,n的值就是天数。

代码如下:

int Date::operator-(const Date& d)
{
	Date max = *this;
	Date min = d;
	int flag = 1;
	if (*this<d)
	{
		min = *this;
		max = d;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return n*flag;
}

计算机的效率是可以完成循环多次的。 


🔑+=(-=)负数 (优化)

图中不管是+还是-都是成立的对于day是正是负都是可以计算的。 

day+= -100;

 大家有没有想过如果day是负数呢?上面的代码运行的结果是什么呢?

这时候我们该如何优化呢?

 d1+= -day 是不是相当于 d1-=day?   那么就可以复用-=重载运算符。

这样对嘛,d1+= -100,本来是看以前的日子的,怎么算到2024了?这里我们就要考虑到数学的知识了。 *this是d1 ,d1-=day ,day是-100,那么负负得正, 就成了d1+=day,所以我们需要在day前面加个负号,即d1-= -day。 -day=100,所以 d1-=100 与 d1+=-100 等式成立。

Date& Date::operator+=(int day)
{
	if (day < 0)
	{
		return *this -= day;
	}
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month >= 13)
		{
			++_year;
			_month = 1;
		}
	}
	return *this;
}

​ 

同理:d1-= -100,看100天后的日期,那么就相当于负负得正,d1+=100,那么用到-=函数里就是  d1+=-day.

Date& Date::operator-=(int day)
{
	if (day < 0)
	{
		return *this += -day;
	}
	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month== 0)
		{
			_month = 12;
			--_year;
		}
		_day+= GetMonthDay(_year, _month);
	}
	return *this;
}

 


🔑C++中重载输入cin和输出cout运算符

c++系统实现了一个庞大的类的库,如下图所示。其中ios为基类,其他类都直接或间接派生自ios类.

  • cin和cout可以直接输入和输出内置类型(如int、double等)和部分标准自定义类型(如string等),原因是标准库已经将所有这些类型的输入和输出重载了,直接使用即可。

  •  对于我们自定义的类型,如果想直接使用cin、cout来输入输出,需要自己重载>>和<<,否则不能直接使用。

在C++中,标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载,使其能够用于不同数据的输入输出,但是输入输出的对象只能是 C++内置的数据类型(例如 bool、int、double 等)和标准库所包含的类类型(例如 string、complex、ofstream、ifstream 等)。如果自己定义了一种新的数据类型,需要用输入输出运算符去处理,那么就必须对它们进行重载。本节以Date类为例来演示输入输出运算符的重载。

cout << _year << "-" << _month << "-" << _day << endl;//输出形式
cin>>_year>>_month>>_day; //输入形式

cout是ostream类的对象,cin是istream类的对象,要想达到这个目标,就必须以全局函数(友元函数)的形式重载<<和>>,否则就要修改标准库中的类,这显然不是我们所期望的。

🌈重载输入cin运算符>> 

全局函数的形式重载>>,

//cin重载
istream& operator>>(istream& _in, Date& d)
{
	_in >> d._year >> d._month >> d._day;
	return _in;
}

注意:运算符重载函数中用到了Date类的private 成员变量,必须在Date类中将该函数声明为友元函数,如下例所示:

friend istream & operator>> (istream &_in,Date &d);


🌈重载输入cout运算符<<

同样地,也可以模仿上面的形式对输入运算符>>进行重载,让它能够输出,请看下面的代码:

//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{
	_out << d._year << "-" << d._month << "-" << d._day << endl;
	return _out;
}

ostream表示输出流,cout是ostream类的对象。由于采用了引用的方式进行参数传递,并且也返回了对象的引用,所以重载后的运算符可以实现连续输出。

为了能够直接访问Date类的private成员变量,同样需要将该函数声明为complex类的友元函数
friend ostream & operator<< (ostream &out, complex &A);


友元函数的声明:


我们有没有观察到

​ 

​ 

为什么输入重载里面的参数不加,而输出相反。

——输入年月日,如果输入流不能修改,那么就没办法进行输入了,输出在输入之后了,它保留着日期,是不能被修改的。

在这之前加coonst也是编译不过的,因为流入和流出的过程取它们其中的值也是需要改变它的状态值,所以输出输入都是不能加const的。 提取完了之后要改变其中内部的状态值的。

输入输出重载运算符代码如下:

//cin重载
istream& operator>>(istream& _in, Date& d)
{
	_in >> d._year >> d._month >> d._day;
	return _in;
}

//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{
	_out << d._year << "-" << d._month << "-" << d._day << endl;
	return _out;
}


 我们继续优化吧~


🔑不符合常理的日期(优化)

这个日期符合常理嘛?显然是不符合的。所有的对象是构造出来的,所以我们再构造的时候加一些检查~

  • 第一种:直接打印出“非法日期”
  • 第二种:直接断言报错(暴力法)

既然输出流对于不合理的日期进行了检查,那么输入呢?

输入非法日期之后,是可以直接通过的,那我们就得给流输入进行检查。

//cin重载
istream& operator>>(istream& _in, Date& d)
{
	//第一种写法
	_in >> d._year >> d._month >> d._day;
	if (d._month > 0 && d._month < 13
		&& d._day>0 && d._day <= d.GetMonthDay(d._year, d._month))
	{
	}
	else
	{
		//cout << "非法日期" << endl;
		assert(false);
	}
	return _in;

	//第二种写法:
		int year, month, day;
		_in >> year >> month >> day;
	if (month > 0 && month < 13
		&& day>0 && day <= d.GetMonthDay(year, month))
	{
		d._year = year;
		d._month = month;
		d._day = day;
	}
	else
	{
		//cout << "非法日期" << endl;
		assert(false);
	}
}

一共俩种写法,第二种更灵活。


🔑const成员(优化)

const 修饰的 成员函数 称之为 const 成员函数 const 修饰类成员函数,实际修饰该成员函数 隐含的 this 指针 ,表明在该成员函数中 不能对类的任何成员进行修改。

如何让权限平移或者缩小呢?我们只需要给Date*this改成const Date*this就可以了。

我们不能动this的类型,因为它是隐含的是无法动的,那么如何将类型改成const使权限不放大呢?所以祖师爷就直接再函数后面加个const就可以了。

这里加个const 修饰的是*this。const Date* this我们之前就复习了const,这里const修饰的类型是Date,修饰的内容是*this。

重点:成员函数后面加const以后,普通和const对象都可以调用(权限的平移和权限的缩小)。


🌈const对于+=和+ 

那我们所写的所有成员函数都能加个const嘛?

——当然不是,要修改的对象成员变量函数不能加

比如+=成员函数后面加个const。

_day===》this->day,const修饰的是this指向的内容,指向的内容都不能修改如何+=呢?——肯定不行。那么+呢?

+不会改变我自己,我们上面说了成员函数后面加const以后,普通和const对象都可以调用(权限的平移和权限的缩小)。(只要不改变成员变量都可以加)

所以我们看看还有什么可以加const?


🌈const对于d1<d2和d1>d2?

 

为什么d1<d2可以,d2<d1不可以呢?

这里就考虑到了权限的放大缩小平移问题了,d2是const显然传过去就是权限的放大,当然是不可以的。所以最好的方式就是给这些成员函数都加const。

结论:只要成员函数内部不修改成员变量,就应该加const,这样const对象和普通对象都可以调用。

这些成员函数都可以后面加const,因为按上面的结论,就是不修改内部成员变量。


🕶️完整代码

🚩Date.h

#pragma once
#include<iostream>
#include<assert.h>
using namespace std;
class Date
{
	//友元函数的声明
	friend ostream& operator<<(ostream& _out, const Date& d);
	friend istream& operator>>(istream& _in, Date& d);
public:

	int GetMonthDay(int year, int month)
	{
		int array[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
		if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)))
		{
			return 29;
		}
		else
		{
			return array[month];
		}
	}
	void print() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
	Date(int year = 2003, int month = 10, int day = 5);
	Date& operator=(const Date& 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;
	bool operator!=(const Date& d)const;

	//日期+天数
	Date operator+(int day) const;
	Date& operator+=(int day);
	// 日期-天数
	Date operator-(int day)const;//自己不能改变。但是返回之后的结果
	Date& operator-=(int day);
	//前置++
	Date&operator++();
	//后置++
	Date operator++(int);
	//前置--
	Date& operator--();
	//后置--
	Date operator--(int);
	//日期-日期
	int operator-(const Date& d)const;

private:
	int _year;
	int _month;
	int _day;
};

🚩Date.cpp

#include<iostream>
using namespace std;

#include"Date.h"



Date::Date(int year, int month, int day)
{
	if (month>0&&month<13
	&&day>0&&day<=GetMonthDay(year,month))
	{
		_year = year;
		_month = month;
		_day = day;
	}
	else
	{
		//cout << "非法日期" << endl;
		assert(false);
	}
}

//赋值运算符重载
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
{
	if (_year > d._year)
	{
		return true;
	}
	else if (_year == d._year && _month > d._month)
	{
		return true;
	}
	else if (_year == d._year && _month == d._month && _day >d._day)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool Date::operator>=(const Date& d)const
{
	return *this > d || *this == d;
}

bool Date::operator<(const Date& d)const
{
	return !(*this>=d);
}

bool Date::operator<=(const Date& d)const
{
	return !(*this > d);
}

bool Date::operator!=(const Date& d)const
{
	return !(*this == d);
}



+=复用+
//Date& Date::operator+=(int day)
//{
//	*this = *this + day;
//	return *this;
//}
//
//Date Date::operator+(int day)
//{
//	Date tmp(*this);
//	tmp._day += day;
//	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;
//}

//+复用+=
Date Date::operator+(int day)const
{
	Date tmp(*this);
	tmp += day;
	return tmp;
}

//d1+=100
Date& Date::operator+=(int day)
{
	if (day < 0)
	{
		return *this -= -day;
	}
	_day += day;
	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		++_month;
		if (_month >= 13)
		{
			++_year;
			_month = 1;
		}
	}
	return *this;
}

//前置++返回的是加之后的值
Date &Date::operator++()
{
	*this += 1;
	return *this;
}

//后置++返回的是加之前的值
Date Date::operator++(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;
}

Date Date::operator-(int day)const
{
	Date tmp(*this);
	tmp -=day;
	return tmp;
}

Date& Date::operator-=(int day)
{
	if (day < 0)
	{
		return *this += -day;
	}
	_day -= day;
	while (_day <= 0)
	{
		--_month;
		if (_month== 0)
		{
			_month = 12;
			--_year;
		}
		_day+= GetMonthDay(_year, _month);
	}
	return *this;
}

int Date::operator-(const Date& d)const
{
	Date max = *this;
	Date min = d;
	int flag = 1;
	if (*this<d)
	{
		min = *this;
		max = d;
		flag = -1;
	}
	int n = 0;
	while (min != max)
	{
		++min;
		++n;
	}
	return n*flag;
}

//cin重载
istream& operator>>(istream& _in, Date& d)
{
	//第一种写法
	_in >> d._year >> d._month >> d._day;
	if (d._month > 0 && d._month < 13
		&& d._day>0 && d._day <= d.GetMonthDay(d._year, d._month))
	{
	}
	else
	{
		//cout << "非法日期" << endl;
		assert(false);
	}
	return _in;

	//第二种写法:
		int year, month, day;
		_in >> year >> month >> day;
	if (month > 0 && month < 13
		&& day>0 && day <= d.GetMonthDay(year, month))
	{
		d._year = year;
		d._month = month;
		d._day = day;
	}
	else
	{
		//cout << "非法日期" << endl;
		assert(false);
	}
}

//cout重载
ostream& operator<<(ostream& _out, const Date& d)
{
	_out << d._year << "-" << d._month << "-" << d._day << endl;
	return _out;
}

🚩test.cpp

#include"Date.h"

void TestDate1()
{
	Date d1(2003, 10, 5);
	Date d2(2003, 11, 5);
	int ret=d1 > d2;
	int ret2 = d1 == d2;
	int ret3 = d1 < d2;
	int ret4 = d1 >= d2;
	cout << ret3 << endl;
}

void TestDate2()
{
	Date d1(2003, 11, 14);
	Date d2=d1 +100;//运用拷贝构造创建一个临时变量tmp,将*this的值给tmp,*this的值不改变,tmp值改变,
	//从而导致了d1+day,d1不变,tmp改变。返回d1原来的值。
	//d1 +=100;
	//d1 += 100;
	d2.print();
	/*d1++;
	d1.print();
	++d1;
	d1.print();*/
}

void TestDate3()
{
	Date d1(2023, 11, 17);
	Date d2=d1 -100;
	d2.print();
}

void TestDate4()
{
	Date d1(2023, 11, 17);
	//d1--;//后置--返回的是之前的值、
	--d1;//前置--返回的是之后的值
	d1.print();
}

void TestDate5()
{
	Date d1(2023, 11, 17);
	Date d2(2003, 10, 29);
	cout << d1-d2<< endl;
	cout << d2 - d1<< endl;
}

void TestDate6()
{
	Date d1(2023, 11, 17);
	d1.print();
	/*d1 += -100;
	d1.print();*/
	d1 -= -100;
	d1.print();
}

void TestDate7()
{
	//Date d1(2023, 11, 17);
	//d1 += 100;
	流插入
	//cout << d1;
	//operator<<(cout, d1);
	Date d1(2023, 11, 17);
	Date d2(2003, 10, 29);
	cin >> d1 >> d2;
	cout << d1 << d2;

	/*Date d4(2023, 13, 1);
	cout << d4;*/

}

void TestDate8()
{
	Date d4(2023,13,1);
	cin>>d4;
	cout << d4;
}

void TestDate9()
{
	Date d1(2023, 11, 17);

	const Date d2(2023, 11, 17);
	d1 < d2;
	d2 < d1;


	//d1 + 100;//d1普通对象
	//d2 + 100;//const对象
}

int main()
{
	//TestDate1();
	//TestDate2();
	//TestDate3();
	//TestDate4();
	//TestDate5();
	//TestDate6();
	//TestDate7();
	//TestDate8();
	TestDate9();
	return 0;
}

我走的很慢,但我从不后退。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C/C++数据结构之中缀表达式转换为后缀表达式,删除堆栈元素

在这篇博客中&#xff0c;我们将深入分析一个使用C编写的栈和表达式计算程序。该程序不仅实现了基本的栈操作&#xff0c;还提供了中缀表达式转后缀表达式和删除堆栈中的元素等实用功能。通过逐一讲解每个函数的功能&#xff0c;我们将更全面地理解这个程序的实现。 资源获取&a…

python算法例15 合并数字

1. 问题描述 给出n个数&#xff0c;将这n个数合并成一个数&#xff0c;每次只能选择两个数a、b合并&#xff0c;合并需要消耗的能量为ab&#xff0c;输出将n个数合并成一个数后消耗的最小能量。 2. 问题示例 给出[1&#xff0c;2&#xff0c;3&#xff0c;4]&#xff0c;返回…

【漏洞复现】通达oa 前台sql注入

漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…

比亚迪刀片电池与特斯拉4680电池比较

1 电池材料 比亚迪刀片电池采用的磷酸铁锂LFP&#xff08;LiFePO4&#xff09;&#xff0c;特斯拉的4680电池采用的三元锂。 磷酸铁锂&#xff1a;循环寿命长&#xff0c;安全性能好&#xff0c;价格低廉&#xff0c;但是能量密度低&#xff0c;导电性能差&#xff0c;低温表现…

【机器学习算法】机器学习:支持向量机(SVM)

转载自&#xff1a; 【精选】机器学习&#xff1a;支持向量机&#xff08;SVM&#xff09;-CSDN博客 1.概述 1.1&#xff0c;概念 支持向量机&#xff08;SVM&#xff09;是一类按监督学习方式对数据进行二元分类的广义线性分类器&#xff0c;其决策边界是对学习样本求解的最…

window系统vscode 编译wvp前端代码

下载代码 wvp-GB28181-pro: WEB VIDEO PLATFORM是一个基于GB28181-2016标准实现的网络视频平台&#xff0c;负责实现核心信令与设备管理后台部分&#xff0c;支持NAT穿透&#xff0c;支持海康、大华、宇视等品牌的IPC、NVR、DVR接入。支持国标级联&#xff0c;支持rtsp/rtmp等…

应用场景丨迭代市政综合管廊监测系统建设

市政综合管廊是指在城市地下建造的隧道空间&#xff0c;将市政、电力、通讯、燃气、给排水等各种管线集于一体&#xff0c;实施统一规划、设计、建设和管理。综合管廊有利于解决反复开挖路面、架空线网密集、管线事故频发等问题&#xff0c;是保障城市运行的重要基础设施和“生…

CAS源码工程搭建记录

CAS源码工程搭建 1.下载2.gradle下载源改为阿里云&#xff0c;解决下载慢的问题3.解决保存 1.下载 git clone -b 5.3.x https://gitee.com/mirrors/CAS.git如果下载的是压缩包&#xff0c;导入工程会保存&#xff0c;因为builder.gradle的第20行开始有取git信息&#xff0c;如…

【Web】PHP反序列化的一些trick

目录 ①__wakeup绕过 ②加号绕过正则匹配 ③引用绕过相等 ④16进制绕过关键词过滤 ⑤Exception绕过 ⑥字符串逃逸 要中期考试乐(悲) ①__wakeup绕过 反序列化字符串中表示属性数量的值 大于 大括号内实际属性的数量时&#xff0c;wakeup方法会被绕过 &#xff08;php5-p…

汽车级低压差稳压器LDO LM317BD2TR4G原理、参数及应用

LM317BD2TR4G主要功能特性分析 &#xff1a; LM317BD2TR4G 低漏 (LDO) 线性电压稳压器是一款可调 3 端子正向 LDO 电压器&#xff0c;能够在 1.2 V 至 37 V 的输出电压范围内提供 1.5 A 以上的电流。此电压稳压器使用非常简便&#xff0c;仅需两个外部电阻即可设置输出电压。另…

sentinel 网关

网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。 这样的架构&#xff0c;会存在…

组合模式 rust和java的实现

文章目录 组合模式介绍实现javarsut 组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计…

Java20新增特性

版本介绍 Java 20是在2023年3月21日发布的&#xff0c;发布公司是甲骨文。这是标准Java的最新升级&#xff0c;提供了一系列的新特性和改进&#xff0c;以帮助开发者更高效地编写和维护代码。 版本特性 以下是一些Java 20的新特性&#xff1a; 局部变量类型推断 &#xff1a…

vscode 推送本地新项目到gitee

一、gitee新建仓库 1、填好相关信息后点击创建 2、创建完成后复制 https&#xff0c;稍后要将本地项目与此关联 3、选择添加远程存储库 4、输入仓库地址&#xff0c;选择从URL添加远程存储仓库 5、输入仓库名称&#xff0c;确保仓库名一致

春秋云境靶场CVE-2022-28512漏洞复现(sql手工注入)

文章目录 前言一、CVE-2022-28512靶场简述二、找注入点三、CVE-2022-28512漏洞复现1、判断注入点2、爆显位个数3、爆显位位置4 、爆数据库名5、爆数据库表名6、爆数据库列名7、爆数据库数据 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。…

【vue实战项目】通用管理系统:首页

前言 本文为博主的vue实战小项目系列中的第三篇&#xff0c;很适合后端或者才入门的小伙伴看&#xff0c;一个前端项目从0到1的保姆级教学。前面的内容&#xff1a; 【vue实战项目】通用管理系统&#xff1a;登录页-CSDN博客 【vue实战项目】通用管理系统&#xff1a;封装to…

【Unity小技巧】图片使用的一些常见问题

文章目录 前言Button不规则按钮点击空白区域不响应点击事件1. 设置资源参数2. 代码设置按钮Image的alphaHitTestMinimumThreshold3. 解释&#xff1a;4. 效果 Unity Image 原图比例控制方法一 Preserve Aspect1. 设置勾选Preserve Aspect&#xff08;保持长宽比&#xff09;&am…

QCheckBox样式表

1、QCheckBox选择器和指示器类型 选择器类型描述QCheckBoxQCheckBox 的默认选择器。QCheckBox::indicatorQCheckBox 的指示器,即复选框的标记部分。QCheckBox::indicator:checkedQCheckBox 选中状态下的指示器。QCheckBox::indicator:uncheckedQCheckBox 未选中状态下的指示器…

leetcode系列(双语)003——GO无重复字符的最长子串

文章目录 003、Longest Substring Without Repeating Characters个人解题官方解题扩展 003、Longest Substring Without Repeating Characters 无重复字符的最长子串 Given a string s, find the length of the longest substring without repeating characters. 给定一个字符…

深信服AC密码认证(外部认证:LDAP认证)

拓扑图 搭建好自己AD域服务器&#xff0c;我搭建的服务器域名叫做liyanlongyu.com&#xff0c;如何搭建这里我就不做演示了 一.在AC中添加自己AD域服务器 二.添加LDAP认证策略 验证&#xff1a; 未认证发现&#xff0c;无法上网 点击网页&#xff0c;弹出认证页面 认证后&…