C++——类和对象(中)完结

赋值运算符重载

运算符重载

C++ 为了增强代码的可读性引入了运算符重载 运算符重载是具有特殊函数名的函数 ,也具有其
返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字 operator 后面接需要重载的运算符符号
函数原型: 返回值类型  operator 操作符 ( 参数列表 )
注意:
不能通过连接其他符号来创建新的操作符:比如 operator@
重载操作符必须有一个类类型参数
用于内置类型的运算符,其含义不能改变,例如:内置的整型 + ,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少 1 ,因为成员函数的第一个参数为隐
藏的 this
.* :: sizeof ?: . 注意以上 5 个运算符不能重载。这个经常在笔试选择题中出现。
为了更好理解赋值运算符重载 下面用日期类实现运算符重载

日期类实现运算符重载

operator<运算符的实现

Date.h  Date.cpp test.cpp 三个文件实现

Date.h#include<iostream>using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print();bool operator<(const Date& d);private:int _year;int _month;int _day;
};Date.cpp#include"Date.h"Date::Date(int year, int month , int day)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "-" << _month << "-" << _day << endl;
}bool Date::operator<(const Date& d)
{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;}return false;
}test.cpp
#include"Date.h"void Test1()
{Date d1(2023, 11, 2);Date d2(2023, 11, 3);cout << (d1 < d2) << endl;}int main()
{Test1();return 0;
}

因为d1是自定义出来的对象,运算符不能识别自定义类型对象,只能识别内置类型,因此出现了运算符重载 operator+运算符。根据自己需要来定义返回值的不同 比如上面比较大小 返回真假即可 

operator==运算符实现

Date.h
#include<iostream>using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print();bool operator<(const Date& d);bool operator==(const Date& d);private:int _year;int _month;int _day;
};Date.cpp
#include"Date.h"Date::Date(int year, int month , int day)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "-" << _month << "-" << _day << endl;
}bool Date::operator<(const Date& d)
{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;}return false;
}bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}
test.cpp
#include"Date.h"void Test1()
{Date d1(2023, 11, 2);Date d2(2023, 11, 3);cout << (d1 < d2) << endl;cout << (d1 == d2) << endl;
}int main()
{Test1();return 0;
}

 当我们实现完前面两个运算符重载以后,剩余的<= >= != >统统可以复用来实现

operator> >= <= !=运算符实现 

Date.h
#include<iostream>using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print();bool operator<(const Date& d);bool operator==(const Date& d);bool operator>(const Date& d);bool operator!=(const Date& d);bool operator<=(const Date& d);bool operator>=(const Date& d);private:int _year;int _month;int _day;
};Date.cpp
#include"Date.h"Date::Date(int year, int month , int day)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "-" << _month << "-" << _day << endl;
}bool Date::operator<(const Date& d)
{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;}return false;
}bool Date::operator==(const Date& d)
{return _year == d._year&& _month == d._month&& _day == d._day;
}bool Date::operator>(const Date& d)
{return !(*this < d);
}
bool Date::operator!=(const Date& d)
{return !(*this == d);
}
bool Date::operator<=(const Date& d)
{return *this < d || *this == d;
}
bool Date::operator>=(const Date& d)
{return !(*this < d) || *this == d;
}test.cpp
#include"Date.h"void Test1()
{Date d1(2023, 11, 2);Date d2(2023, 11, 3);cout << (d1 < d2) << endl;cout << (d1 == d2) << endl;cout << (d1 > d2) << endl;cout << (d1 != d2) << endl;cout << (d1 <= d2) << endl;cout << (d1 >= d2) << endl;
}int main()
{Test1();return 0;
}

因为类成员作为函数成员重载时,第一个默认的形参为隐含的Date*const this指针,因此实现完两个运算符重载函数后,直接复用即可,简洁且高效。

日期类除了比较大小有意思之外 那么日期的相减 相加同样也有意义

那么在计算日期相减 相加 就需要知道某个月 包含的天数 某年是否为闰年

这个时候就需要我们的Getmonthday函数的定义

Getmonthday函数实现

Date.cpp
int Date::Getmonthday(int year, int month)
{assert(year >= 1 && month >= 1 && month <= 12);int arry[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;}return arry[month];
}

可以完美帮我们判断闰年 和所对应年 月的天数 方便正确计算 日期的相减相加

也不排除有人会在定义对象的时候给了2023 13 29 月和天显然是不合理的 因此我们需要在成员变量在初始化定义(构造函数)的时候 判断下赋的值正不正确

初始化对象后的判断日期类是否正确

Date.cpp
Date::Date(int year, int month , int day)
{_year = year;_month = month;_day = day;if (_year < 1 || _month < 1 || _month>12|| _day < 1 || _day>Getmonthday(_year, _month)){cout << "非法日期" << endl;Print();}
}test.cppvoid Test1()
{Date d1(2023, 11, 2);Date d2(2023, 13, 3);}int main()
{Test1();return 0;
}

operator+=运算符实现

d1+=50

Date.cpp
Date& Date::operator+=(int day)
{_day += day;while (_day > Getmonthday(_year, _month)){_day -= Getmonthday(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}test.cpp
void Test2()
{Date d1(2023, 11, 2);d1 += 50;d1.Print();}

我们怎么知道最后结果是正确的呢?去网上搜日期计算器就可以了。

 

先进行天数的相加,再判断天数是否大于Getmonthday函数里面月天数的大小,如果大于就先进行当前月天数的相减 然后再++月,再判断月的条件,因为返回类型为Date,出了作用域还在,因此用引用返回。

d1+50也有意义

operator+运算符实现

Date.cpp
Date Date::operator+(int day)
{Date tmp(*this);tmp += day;return tmp;}test.cpp
void Test2()
{Date d1(2023, 11, 2);/*d1 += 50;*/d1.Print();Date ret = d1 + 50;ret.Print();}

直接复用+=即可,因为是d1+50 d1本身不改变 先创建一个临时变量 用拷贝构造传this最初的值,再复用+=加上天数 返回tmp临时变量 因为tmp出了作用域不存在 固不用引用返回。

反观上面+=和+的运算符重载实现,-=和-的实现方法也类似

operator-=运算符实现

Date.cpp
Date& Date::operator-=(int day)
{_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += Getmonthday(_year, _month);}return *this;
}test.cpp
void Test2()
{Date d1(2023, 11, 2);/*d1 += 50;*/d1 -= 50;d1.Print();/*d1.Print();Date ret = d1 + 50;ret.Print();*/}

  

operator-运算符实现

Date.cpp
Date Date::operator-(int day)
{Date tmp(*this);tmp -= day;return tmp;
}test.cpp
void Test2()
{Date d1(2023, 11, 2);/*d1 += 50;*//*d1 -= 50;d1.Print();*//*d1.Print();Date ret = d1 + 50;ret.Print();*/Date ret = d1 - 50;d1.Print();ret.Print();}

那么C语言有前置++和后置++ 那么运算符重载自定义对象时怎么分辨呢?

C++之父为了区分前置++和后置++ 在后面++后面加了个int形参

d1++ ++d1 也有意义

operator++(前置)运算符实现

Date.cpp
Date& Date:: operator++()
{*this += 1;return*this;
}test.cpp
void Test2()
{Date d1(2023, 11, 2);/*d1 += 50;*//*d1 -= 50;d1.Print();*//*d1.Print();Date ret = d1 + 50;ret.Print();*//*Date ret = d1 - 50;d1.Print();ret.Print();*/++d1;d1.Print();++d1;d1.Print();}

因为前置++自己本身也会跟着随之改变 所以引用返回this本身。 

operator++(后置)运算符实现

Date.cpp
Date Date::operator++(int)
{Date tmp(*this);*this += 1;return tmp;
}test.cpp
void Test3()
{Date d1(2023, 11, 2);d1.Print();d1++;d1.Print();
}

operator--(前置)运算符实现

Date.cpp
Date& Date::operator--()
{*this -= 1;return *this;
}test.cpp
void Test3()
{Date d1(2023, 11, 2);/*d1.Print();d1++;d1.Print();*/--d1;d1.Print();--d1;d1.Print();
}

operator--(后置)运算符实现 

Date.cpp
Date Date::operator--(int)
{Date tmp(*this);*this -= 1;return tmp;
}test.cpp
void Test3()
{Date d1(2023, 11, 2);/*d1.Print();d1++;d1.Print();*//*--d1;d1.Print();--d1;d1.Print();*/d1.Print();d1--;d1.Print();}

 

既然日期-天数 日期-月 日期++都有意义 那么日期-日期也有意义

比如计算2023到2024年还有多少天

operator-(日期-日期)

Date.cpp
int Date::operator-(const Date& d)
{// 假设左大右小int flag = 1;Date max = *this; //this指向d1Date min = d; //d2// 假设错了,左小右大if (*this < d){max = d;min = *this;flag = -1;}int n = 0;while (min != max){++min;++n;}return n * flag;
}test.cpp
void Test4()
{Date d1(2023, 11, 2);Date d2(2024, 1, 1);cout << (d1 - d2) << endl;
}

但我们在+= 和-=忽略掉了一个问题 就是当给天数 给成负值怎么办?比如d1+=(-50)  d1+(-50)

 当我们用我们上面实现的+=时

d1+=50   d1=d1+(-50)  d1=2-50=-48

void Test4()
{Date d1(2023, 11, 2);//Date d2(2024, 1, 1);d1 += -50;d1.Print();//cout << (d1 - d2) << endl;
}

天数变成了负值 但那个日期计算器人家是能正常计算的

为了能够正确计算负天数,我们只需要加个一个判断条件即可 

 当天数小于0时  d1+=-50 变成了 d1=d1-(-50)      即d1+=50 d1=d1+50;

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-=(int day)
{if (day < 0){return *this += (-day);}_day -= day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += Getmonthday(_year, _month);}

日期类实现全部代码

Date.h

#include<iostream>
#include<assert.h>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1);void Print();int Getmonthday(int year, int month);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);Date operator+(int day)const;Date& operator-=(int day);Date operator-(int day)const;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"Date.h"Date::Date(int year, int month , int day)
{_year = year;_month = month;_day = day;if (_year < 1 || _month < 1 || _month>12|| _day < 1 || _day>Getmonthday(_year, _month)){cout << "非法日期" << endl;Print();}
}void Date::Print()const
{cout << _year << "_" << _month << "_" << _day << endl;
}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;}return false;
}bool Date::operator==(const Date& d)const
{return _year == d._year&& _month == d._month&& _day == d._day;
}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 || *this == d;
}
bool Date::operator>=(const Date& d)const
{return !(*this < d) || *this == d;
}
int Date::Getmonthday(int year, int month)
{assert(year >= 1 && month >= 1 && month <= 12);int arry[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;}return arry[month];
}
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+(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){--_year;_month = 12;}_day += Getmonthday(_year, _month);}return *this;
}
Date Date::operator-(int day)const
{Date tmp(*this);tmp -= day;return tmp;
}
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;
}int Date::operator-(const Date& d)const
{// 假设左大右小int flag = 1;Date max = *this; //this指向d1Date min = d; //d2// 假设错了,左小右大if (*this < d){max = d;min = *this;flag = -1;}int n = 0;while (min != max){++min;++n;}return n * flag;
}

test.cpp

#include"Date.h"//void Test1()
//{
//	/*Date d1(2023, 11, 2);
//	Date d2(2023, 13, 3);*/
//	
//	/*cout << (d1 < d2) << endl;
//	cout << (d1 == d2) << endl;
//	cout << (d1 > d2) << endl;
//	cout << (d1 != d2) << endl;
//	cout << (d1 <= d2) << endl;
//	cout << (d1 >= d2) << endl;*/
//}//void Test2()
//{
//	Date d1(2023, 11, 2);
//	/*d1 += 50;*/
//	/*d1 -= 50;
//	d1.Print();*/
//	/*d1.Print();
//	Date ret = d1 + 50;
//	ret.Print();*/
//	/*Date ret = d1 - 50;
//	d1.Print();
//	ret.Print();*/
//	/*++d1;
//	d1.Print();
//	++d1;
//	d1.Print();*/
//
//}//void Test3()
//{
//	Date d1(2023, 11, 2);
//	/*d1.Print();
//	d1++;
//	d1.Print();*/
//	
//	/*--d1;
//	d1.Print();
//	--d1;
//	d1.Print();*/
//	d1.Print();
//	d1--;
//	d1.Print();
//	
//}
void Test4()
{Date d1(2023, 11, 2);//Date d2(2024, 1, 1);d1 += -50;d1.Print();//cout << (d1 - d2) << endl;
}
int main()
{//Test1();//Test2();//Test3();Test4();return 0;
}

const成员

加上const后为什么不能打印出来呢?因为这里是权限的放大

从const Date*const this变成了 Date*const this 形成了权限的放大

那怎么解决呢?祖师爷决定在括号加上一个const(声明和定义后面都要加上)

当加个const以后 const就修饰了Date*const this变成了const Date*const this  const本质是修饰this

从权限的放大变成了权限的平移 就能打印了 

那么非const对象能调用const函数吗 ?

答案是可以的,因为Date*const this 变成了 const Date*const this 形成了权限的缩小

权限可以平移和缩小 但不能放大。

那么所有函数都能定义成const函数吗?是不可以的,当需要修改成员变量的成员函数,不能改成const。

但能定义成const的成员函数都应该定义成const

这样const对象和非const对象都可以调用(const权限的平移和const权限的缩小)

要修改成员变量的成员函数,不能定义成const

因此在日期类成员函数在不修改成员变量的成员函数后面都可以加上const

取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

 当屏蔽掉非const取地址操作函数,非const会去调用const取地址操作函数

这两个取地址操作符重载一般使用编译器默认生成的就可以。

只有特殊情况,才需要重载,比如想让别人获取到指定的内容! 

 不想让别人获取地址可以返回空指针nullptr或者返回自己编造的一个地址。

operator实现<<流插入

为什么不能打印出d1内容,因为<<不识别自定义类型对象 为什么可以识别内置类型呢?

因为C++已经头文件里面的库函数已经帮忙实现了

 为了实现识别自定义类型对象,自己照猫画虎实现一个即可。

Date.h 声明

Date.cpp 定义

但是它有一个问题,就是访问不了私有成员变量,我们暂且先取消掉private,把成员变量放开 

 

但出现了问题 cout<<d1打印不了  d1<<cout可以打印,这又是为什么呢?

 

因为双目操作数的运算符,规定第一个参数必须是左操作数(*this),第二个参数必须是右操作数

d1<<cout 转换  d1.operator<<(&d1,cout);  cout<<d1 第一个参数是cout 第二个是*this所以不行。

那么为了规定传参,流插入的实现只能在全局进行实现,因为成员函数Date对象默认占据第一个位置。

在全局实现又有两个问题,第一个不能访问私有成员变量,第二个不能支持连续插入

 

我们给流插入返回值就能解决连续cout的问题

 

那么访问不了私有成员变量怎么解决呢?这时候就要用到我们的友元函数 

  

友元函数就是在类里面成员函数 前面加个friend 表面是友元函数 我和你是好朋友,可以去你家里玩私有物品,比如游戏机 上厕所等。

那么流提取的实现与流插入相仿

operator实现>>流提取

 流本质是为了解决,自定义类型的输入和输出问题

printf scanf 无法解决自定义类型的输入输出问题面向对象 + 运算符重载解决.

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

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

相关文章

[GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过&#xff08;ctfshow web入门370&#xff09;-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ss…

【实战Flask API项目指南】之六 数据库集成 SQLAlchemy

实战Flask API项目指南之 数据库集成 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 在上一篇文章中&#xff0c;我们实现了…

【Linux笔记】Linux进程概念与进程状态

【Linux笔记】Linux进程概念与进程状态 一、什么是进程1.1、进程的概念1.2、进程的描述 二、关于进程的一些基本操作2.1、查看进程2.2、杀进程2.3、获取进程id2.4、创建进程 三、进程状态3.1、普适操作系统中的进程状态3.2、具体到Linux操作系统中的进程状态 四、僵尸进程和孤儿…

SpringMVC简单介绍与使用

目录 一、SpringMVC介绍 二、SpringMVC作用 三、SpringMVC核心组件 四、SpringMVC快速体验 一、SpringMVC介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称&#xff…

数据库概论

目录 什么是数据库数据库的概念模型层次模型网状模型关系模型 为什么要使用关系型数据库完整性约束结构化查询语言SQL基本语句 什么是数据库 考虑这些问题&#xff1a;当用户使用软件计算时&#xff0c;如果想要保存计算结果或者想选择不同的题目&#xff0c;是否要保存、读取…

多特征线性回归模型

一、预测目标和原始数据展示 (一)预测目标: 通过Economy..GDP.per.Capita.(GDP)和Freedom预测Happiness.Score (二)部分数据展示: 特征有很多&#xff0c;本文研究Economy..GDP.per.Capita.(GDP)和Freedom&#xff0c;也就是用Economy..GDP.per.Capita.(GDP)和Freedom预测Happ…

[计算机提升] Windows系统软件:娱乐类

3.3 系统软件&#xff1a;娱乐类 3.3.1 Windows Media Player&#xff1a;dvdplay Windows Media Player是Windows操作系统自带的多媒体播放软件&#xff0c;用于播放和管理电脑中的音频和视频文件。它提供了以下功能&#xff1a; 播放音频和视频文件&#xff1a;Windows Med…

OpenGL_Learn04

我这边并不是教程&#xff0c;只是学习记录&#xff0c;方便后面回顾&#xff0c;代码均是100%可以运行成功的。 1. 渐变三角形 #include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream> #include <cmath>void framebuffer_size_callba…

修改element组件库的el-input-number的图标

官方样式&#xff1a; 我希望组件的图标改成一对上下是三角形的图标&#xff1a; 直接复制以下代码&#xff1a; ::v-deep .el-icon-arrow-down:before {content: "\e790"; } ::v-deep .el-icon-arrow-up:before {content: "\e78f"; } 完成&#xff01…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper&#xff1a; https://arxiv.org/abs/2103.10385 Code&#xff1a; https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲&#xff0c;今天如果有这样两句评论&#xff1a; 1. 什么苹果啊&#xff0c;都没有苹果味&#xff0c…

ViT Vision Transformer超详细解析,网络构建,可视化,数据预处理,全流程实例教程

关于ViT的分析和教程&#xff0c;网上又虚又空的东西比较多&#xff0c;本文通过一个实例&#xff0c;将ViT全解析。 包括三部分内容&#xff0c;网络构建&#xff1b;orchview.draw_graph 将网络每一层的结构与输入输出可视化&#xff1b;数据预处理。附完整代码 网络构建 …

偶数矩阵判断【C语言作业】

题目 若一个布尔矩阵所有行和所有列的和都是偶数&#xff0c;则称为偶数矩阵。请编写一个程序&#xff0c;判断一个布尔矩阵是否是偶数矩阵。 要求&#xff1a; &#xff08;1&#xff09;输入:首先输入一个正整数n(n<100),代表该矩阵的大小&#xff0c;接下来是n行n列的矩…

第5天:基础入门-资产架构amp;端口amp;应用amp;CDNamp;WAFamp;站库分离amp;负载均衡

第5天&#xff1a;基础入门-资产架构&端口&应用&CDN&WAF&站库分离&负载均衡 #知识点&#xff1a;1. 资产架构-端口&目录&插件接口&多站点&多应用 2. 番外安全-域名&服务器本身&服务厂商&管理人员 3. 考虑阻碍-站库分离&am…

c++-AVL树

文章目录 前言一、AVL树1、AVL树概念2、AVL树模拟实现3、AVL树的旋转操作3.1 左单旋3.2 左单旋代码实现3.3 右单旋3.4 右单旋代码实现。3.5 什么时候调用左单旋和右单旋3.6 左右双旋3.7 左右双旋代码实现3.8 右左双旋3.9 右左双旋代码实现3.10 什么时候调用左右双旋和右左双旋 …

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

编写shell脚本,利用mysqldump实现MySQL数据库分库分表备份

查看数据和数据表 mysql -uroot -p123456 -e show databases mysql -uroot -p123456 -e show tables from cb_d 删除头部Database和数据库自带的表 mysql -uroot -p123456 -e show databases -N | egrep -v "information_schema|mysql|performance_schema|sys"编写…

Linux之sched_setscheduler调度策略总结(六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

设计模式第一课-单例模式(懒汉模式和饿汉模式)

单例模式 个人理解&#xff1a;单例模式实际就是通过类加载的方式获取到一个对象&#xff0c;并且保证这个对象在使用中只有一个&#xff0c;不允许再次被创建 一、懒汉模式 1、懒汉模式的基础写法 代码解释&#xff1a; &#xff08;1&#xff09;、编写LazySingleton类的…

Shiny Server和ShinyProxy是什么,有什么区别?

调研以及参与过多个生物公司的生信工具研发&#xff0c;不管是ShinyServer还是ShinyProxy都有一定研究&#xff0c;尤其是ShinyServer。如果仅是本地化测试想快速的搭建Shiny应用&#xff0c;我推荐用Shiny Server&#xff0c;如果多并发用户且更好的线上管理Shiny应用&#xf…

React Native 样式及其布局

React Native 样式及其布局 参考 https://reactnative.cn/docs/flexbox 一、样式 在 React Native 中&#xff0c;你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 …