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

C++类的引入

C++中类的前身

1> 面向对象三大特征:封装、继承、多态

2> 封装:将能够实现某一事物的所有万事万物都封装到一起,包括成员属性(成员变量),行为(功能函数)都封装在一起,我们称之为类。并向外部提供公共的接口,用户可以通过该接口来控制该类实例化的对象。

3> 只需将C++中的结构体的struct改成class就是类的定义

4> 类的定义格式

class 类名 { 访问权限: 成员; };

类的说明

1> 类中的访问权限有三种:public、protected、private

public:该权限下的成员,可以在类内、子类中以及类外被访问

protected:该权限下的成员,可以在类内、子类中被访问,类外不能被访问

private:该权限下的成员只能被类内访问,类外、子类中都不能被访问

在类中,默认的访问权限是private

2> 类中可以有成员属性和成员函数,一般成员属性设置成私有、成员变量设置成公共的

3> 类中的成员函数可以访问类中所有权限下的成员,包括私有成员

4> 每种访问权限,可以在类中出现多次,每个访问权限从关键字开始,到下一个关键字为止或者整个类体结束。

5> 一般将同一权限下的所有成员放在一起

6> 如果非要在类外对私有成员或受保护的成员进行读取或者写入,需要在类内提供相关公共的接口来完成

7> 类的访问权限是针对于类体而言,而不是针对于类对象而言

#include <iostream>using namespace std;//定义一个 Person 类
class Person
{
public:string name = "张三";char sex;             //性别private:int age = 18;protected:int money;public://定义展示函数void show(){cout<<"name = "<<name<<endl;          //公共权限下的成员,类内可以被访问cout<<"sex = "<<sex<<endl;            //公共权限下的成员,类内可以被访问cout<<"age = "<<age<<endl;            //私有权限下的成员,类内可以被访问cout<<"money = "<<money<<endl;        //受保护权限下的成员,类内可以被访问}//定义设置年龄函数void set_age(int a){if(a<0){cout<<"设置失败"<<endl;return;}age = a;}//定义获取年龄的函数int get_age(){return age;}};int main()
{//class Person p1;       //使用类定义一个变量Person p1;              //使用类,定义一个变量   ---> 使用Person类实例化一个对象p1.name = "二狗";           //类中公共权限下的成员,类外可以被访问p1.sex = 'M';               //类中公共权限下的成员,类外可以被访问//p1.age = 18;               //类中私有权限下的成员,类外无法被访问//p1.money = 1000000;          //类中受保护的成员,类外无法被访问p1.show();                //类中公共权限下的成员,类外可以被访问//设置年龄p1.set_age(118);cout<<"p1.age = "<<p1.get_age()<<endl;return 0;
}

练习:定义一个矩形(Rectangle)类,拥有私有成员属性:宽度(width)、高度(hight)

公共成员函数:

初始化函数:void init(int w, int h)

获取宽度函数:get_w();

设置宽度函数:set_w(int w);

获取高度函数:get_h();

设置高度函数:set_h(int h);

获取周长函数:get_perimeter();

获取面积函数:get_area();

在主程序中实例化对象,并测试下相关函数

#include <iostream>using namespace std;class Rectangle            //定义一个矩形类
{//私有成员属性
private:int width;       //矩形的宽度int hight;        //矩形的高度
public://初始化函数void init(int w,int h){if(w<=0 || h<=0){cout<<"初始化失败"<<endl;return;}width=w;hight=h;}//设置宽度函数void set_w(int w){width=w;}//设置高度函数void set_h(int h){hight=h;}//获取宽度int get_w(){return width;}//获取周长int get_peri(){return 2*width+2*hight;}//获取面积int get_area(){return width*hight;}
};int main()
{Rectangle r1;       //实例化一个矩形对象r1.init(3,5);         //初始化矩形cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;//重新设置矩形的宽度r1.set_w(10);cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;return 0;
}

练习:在上面的案例上面加一个功能:比较两个矩形框是否相等 bool judge()

判断两个矩形相等的原则:width==width && heigh==heigh

全局函数版本: bool judge(Rectangle r1, Rectangle r2);

#include <iostream>using namespace std;class Rectangle            //定义一个矩形类
{//私有成员属性
private:int width;       //矩形的宽度int hight;        //矩形的高度
public://初始化函数void init(int w,int h){if(w<=0 || h<=0){cout<<"初始化失败"<<endl;return;}width=w;hight=h;}//设置宽度函数void set_w(int w){width=w;}//设置高度函数void set_h(int h){hight=h;}//获取宽度int get_w(){return width;}//获取周长int get_peri(){return 2*width+2*hight;}//获取面积int get_area(){return width*hight;}//获取矩形框高度int get_h(){return hight;}//定义成员函数,比较两个矩形是否相等bool judge(Rectangle &r1, Rectangle &r2){//比较逻辑if(r1.width==r2.width && r1.hight==r2.hight){return true;}return false;}//定义成员函数,比较当前矩形框和其他传入的矩形框是否相等bool judge(Rectangle &other){//比较逻辑if(width==other.width && hight==other.hight){return true;}return false;}
};//定义全局函数完成求两个矩形框是否相等
bool judge(Rectangle &r1, Rectangle &r2)
{//比较逻辑if(r1.get_w()==r2.get_w() && r1.get_h()==r2.get_h()){return true;}return false;
}int main()
{Rectangle r1;       //实例化一个矩形对象r1.init(3,5);         //初始化矩形cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;//重新设置矩形的宽度r1.set_w(10);cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;//实例化另一个矩形框Rectangle r2;r2.init(10,10);//判断两个矩形框是否相等/*if(judge(r1,r2))        //调用全局函数{cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}*//*调用成员函数判断两个矩形框是否相等if(r1.judge(r1, r2)){cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}*/if(r1.judge(r2)){cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}return 0;
}

分文件编译

头文件

#ifndef RECANTLE_H
#define RECANTLE_H#include <iostream>
using namespace std;class Rectangle            //定义一个矩形类
{//私有成员属性
private:int width;       //矩形的宽度int hight;        //矩形的高度
public://初始化函数void init(int w,int h);//设置宽度函数void set_w(int w);//设置高度函数void set_h(int h);//获取宽度int get_w();//获取周长int get_peri();//获取面积int get_area();//获取矩形框高度int get_h();//定义成员函数,比较两个矩形是否相等bool judge(Rectangle &r1, Rectangle &r2);//定义成员函数,比较当前矩形框和其他传入的矩形框是否相等bool judge(Rectangle &other);
};//全局函数的声明
bool judge(Rectangle &r1, Rectangle &r2);#endif // RECANTLE_H

源文件

#include "recantle.h"//初始化函数
void Rectangle::init(int w,int h)
{if(w<=0 || h<=0){cout<<"初始化失败"<<endl;return;}width=w;hight=h;
}//设置宽度函数
void  Rectangle::set_w(int w)
{width=w;
}
//设置高度函数
void  Rectangle::set_h(int h)
{hight=h;
}
//获取宽度
int  Rectangle::get_w()
{return width;
}
//获取周长
int  Rectangle::get_peri()
{return 2*width+2*hight;
}
//获取面积
int  Rectangle::get_area()
{return width*hight;
}//获取矩形框高度
int  Rectangle::get_h()
{return hight;
}//定义成员函数,比较两个矩形是否相等
bool  Rectangle::judge(Rectangle &r1, Rectangle &r2)
{//比较逻辑if(r1.width==r2.width && r1.hight==r2.hight){return true;}return false;
}//定义成员函数,比较当前矩形框和其他传入的矩形框是否相等
bool  Rectangle::judge(Rectangle &other)
{//比较逻辑if(width==other.width && hight==other.hight){return true;}return false;
}//定义全局函数完成求两个矩形框是否相等
bool judge(Rectangle &r1, Rectangle &r2)
{//比较逻辑if(r1.get_w()==r2.get_w() && r1.get_h()==r2.get_h()){return true;}return false;
}

测试文件

#include"recantle.h"        //引入自定义的头文件int main()
{Rectangle r1;       //实例化一个矩形对象r1.init(3,5);         //初始化矩形cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;//重新设置矩形的宽度r1.set_w(10);cout<<"矩形的周长为:"<<r1.get_peri()<<endl;cout<<"矩形的面积为:"<<r1.get_area()<<endl;//实例化另一个矩形框Rectangle r2;r2.init(10,10);//判断两个矩形框是否相等/*if(judge(r1,r2))        //调用全局函数{cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}*//*调用成员函数判断两个矩形框是否相等if(r1.judge(r1, r2)){cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}*/if(r1.judge(r2)){cout<<"两个矩形框相等"<<endl;}else{cout<<"两个矩形框不相等"<<endl;}return 0;
}

this指针

1> this指针是类中系统为所有非静态成员函数提供的一个隐藏的形参指针,指代当前对象的起始地址

2> 指代当前对象,哪个对象使用我,我就指向哪个对象

3> 在非静态成员函数中,如果调用了类中的成员(成员函数、成员变量),即使没有加this,系统也默认加了this。

局部名称屏蔽成员名称除外

4> this的原型: 类名 * const this;

5> 必须使用this的情况:

1、当形参名和成员名同名时,可以使用this用于区分

2、在拷贝赋值函数中,用于返回自身引用时,必须使用this(后期讲)

#include <iostream>using namespace std;class Stu
{string name = "zhangsan";int age = 18;public://非静态成员函数void show(){cout<<"show::this = "<<this<<endl;//cout<<"name = "<<name<<"    age = "<<age<<endl;cout<<"name = "<<this->name<<"    age = "<<this->age<<endl;}//定义设置函数void set_data(string name, int a)         //this形参的原型: Stu * const this;{cout<<"set_data::this = "<<this<<endl;this->name = name;              //将形参name,赋值给成员变量namethis->age = a;                  //可以通过this改变指针指向的内存空间中的值//this = NULL;                   //不能通过this改变指针的值this->show();             //成员函数中调用另一个成员函数}};

类的大小

1> 一个空类的大小为 1 字节,用于占位作用,后期如果有成员变量,就会将该1字节空间分配给成员使用

2> 类中的成员函数不占类体的大小,成员函数只有被调用时,才会分配空间

3> 只有类的成员属性才占内存空间,其类的大小要遵循字节对齐原则

4> 如果类中有虚函数,则会多一个虚指针的空间 (后期讲)

#include <iostream>using namespace std;//一个空类的大小为 1字节
class A
{};//成员 变量占内存空间,要符合字节对齐原则
class B
{int value_a;char value_b;short value_c;char value_d;double value_e;short value_f;        //11112033400000005555555566000000
};//定义一个类,既有成员属性也有成员变量,类的成员函数是不占类体的空间的
class C
{int a;void show(){int b;cout<<"b = "<<b<<"   a = "<<a<<endl;}void display(){this->show();}
};//当类中出现虚函数时,系统会给类默认提供一个虚指针,无论有多少虚函数,都只提供一个虚函数指针
class D
{int value_a;      //成员变量//非虚函数void show(){}//定义虚函数virtual void diaplay(){}//虚函数       virtual void fun(){}
};int main()
{cout << sizeof(A) << endl;            // 1cout << sizeof(B) << endl;            // 32cout << sizeof(C) << endl;            // 4cout << sizeof(D) << endl;            // 16return 0;
}

类中特殊成员函数

1> 当定义一个空类时,即使没有手动定义某些函数,C++系统会默认自动为其提供一些特殊成员函数

2> 这些函数也可以程序员手动定义,当手动定义后,系统就不再提供默认的了

3> 这些函数也无需程序员手动调用,在特殊时期,C++系统会自动调用

4> 种类:构造函数、析构函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、取地址运算符重载函数

构造函数

1> 构造函数是在使用类实例化对象时,用于给类对象分配内存空间以及对成员进行初始化工作时使用

2> 定义格式

1、构造函数没有返回值,不需要写返回值类型 2、函数名与类同名 3、可以有参,也可以无参 4、一般为公共权限 5、格式: 类名(形参列表){函数体内容}

3> 调用时机:无需程序员手动调用,当使用一个类实例化对象时,系统自动调用构造函数

4> 调用格式:

无参构造: 类名 对象名;

例如:string s1;

有参构造: 类名 对象名(实参列表);

例如:string s2("hello a");

string s3(5, 'A');

5> 一个类中可以定义多个构造函数,要求参数必须不同,这些构造函数构成重载关系

虽然一个类中可以定义多个构造函数,但是一个类对象的只能使用一个构造函数构造出来

6> 一个类中,如果没有显性定义任何构造函数,那么系统会默认提供一个无参构造函数

但凡类中提供任意一个构造函数,系统就不再提供默认的无参构造函数了,如果非要使用无参构造函数,需要程序员手动定义无参构造函数

7> 构造函数的形参列表也可以设置默认参数,但是要注意是否跟其他重载的函数冲突

8> 构造函数的初始化工作是在初始化列表中完成的。

初始化列表:在构造函数函数头部后面,由冒号引出,完成初始化工作

格式: 类名(形参类型1 形参1, 形参类型2 形参2,。。。, 形参类型n 形参n) : 成员变量1(形参1),成员变量2(形参2),。。。,成员变量n(形参n) {}

#include <iostream>using namespace std;//定义一个类
class Stu
{
private:const string name;           //如果类中有const修饰的成员变量,必须使用初始化列表完成对其进行初始化工作int age;public://无参构造函数Stu():name("二狗"){//this->name = "二狗";this->age = 100;cout<<"Stu::无参构造"<<endl;}//定义有参构造函数Stu(string n) :name(n){//this->name = n;cout<<"Stu::有参构造1"<<endl;}//定义有参构造//Stu(string n="大毛", int a=20)         //带默认参数的构造函数Stu(string name, int age) :name(name), age(age)              //使用初始化列表完成对成员的初始化工作{//此处是给成员变量赋值,而不是初始化//this->name = n;//this->age = a;cout<<"Stu::有参构造2"<<endl;}//定义展示函数void show(){cout<<"name = "<<name<<"    gae = "<<age<<endl;}};int main()
{Stu s1;           //系统会自动调用该类中的无参构造函数s1.show();cout<<"***************************\n";Stu s2("张三");        //调用自定义的有参构造s2.show();cout<<"***************************\n";Stu s3("张三", 18);        //调用自定义的有参构造s3.show();return 0;
}

9> 必须使用构造函数的初始化列表的情况

1、如果类的成员变量中有常成员变量,对该成员的初始化工作,必须使用初始化列表完成

2、如果类中有引用成员,那么对该成员也必须使用初始化列表完成

3、如果构造函数的形参名和成员变量同名时,可以使用初始化列表来解决

4、如果一个类中,有另一个类的对象,对该成员对象的初始化工作需要在初始化列表中显性定义该成员对象的有参构造,否则系统会自动调用其无参构造

#include <iostream>using namespace std;//定义一个汽车类
class Car
{
private:string name;string color;
public:Car() {cout<<"Car::无参构造"<<endl;}Car(string n, string c):name(n), color(c){cout<<"Car::有参构造"<<endl;}
};//定义一个类
class Stu
{
private:const string name;           //如果类中有const修饰的成员变量,必须使用初始化列表完成对其进行初始化工作int age;int &score;            //引用成员 必须在构造函数的初始化列表中进行初始化工作Car c;public://无参构造函数Stu():name("二狗"), score(*new int(520)), c("擎天柱","red"){//this->name = "二狗";this->age = 100;cout<<"Stu::无参构造"<<endl;}//定义有参构造函数Stu(string n, int &score) :name(n), score(score){//this->name = n;cout<<"Stu::有参构造1"<<endl;}//定义有参构造//Stu(string n="大毛", int a=20)         //带默认参数的构造函数Stu(string name, int age, int &score) :name(name), age(age), score(score)              //使用初始化列表完成对成员的初始化工作{//此处是给成员变量赋值,而不是初始化//this->name = n;//this->age = a;cout<<"Stu::有参构造2"<<endl;}//定义展示函数void show(){cout<<"name = "<<name<<"    gae = "<<age<<endl;}};int main()
{Stu s1;           //系统会自动调用该类中的无参构造函数s1.show();cout<<"***************************\n";int s = 99;Stu s2("张三", s);        //调用自定义的有参构造s2.show();cout<<"***************************\n";Stu s3("张三", 18, s);        //调用自定义的有参构造s3.show();return 0;
}

使用C++手动封装一个顺序表,包含成员指针变量,成员变量N个

#include <iostream>using namespace std;
//类型重命名
using datatype = int;     //typedef int datatype;//定义一个顺序表类
class SeqList
{private:datatype *data;                //指向堆区空间的指针int size = 0;                      //数组的大小int len = 0;                     //顺序表实际长度public://无参构造/*SeqList():data(new datatype[10]), size(10), len(0){cout<<"无参构造"<<endl;}*///有参构造SeqList(int s):data(new datatype[s]), size(s), len(0){cout<<"有参构造"<<endl;}//要实现的函数//判空函数bool empty(){return len==0;}//判满函数bool full(){return len==size;}//添加数据函数bool add(datatype e){if(full()){return false;}len++;data[len] = e;return true;}//求当前顺序表的实际长度int length(){return len;}//任意位置插入函数bool insert_pos(int pos, datatype e){if(full()||pos<0||pos>len){return false;}for(int i=len;i>pos;i--){data[i]=data[i-1];}data[pos]=e;len++;return true;}//任意位置函数函数bool delete_pos(int pos){if(empty()||pos<0||pos>=len){return false;}for(int i=pos;i<len-1;i++){data[i]=data[i+1];}len--;return true;}//访问容器中任意一个元素 atdatatype &at(int index){if(index<0||index>=len){return data[-1];}return data[index];}//君子函数:二倍扩容void expend(){size *=2;datatype *newdata =new datatype[size];for(int i=0;i<len;i++){newdata[i] = data[i];}delete []data;data = newdata;}//释放顺序表void seqfree(){delete[]data;data =NULL;size = 0;len = 0;          }
};int main()
{SeqList S(5);S.add(1);S.add(2);S.insert_pos(1,3);cout <<"长度 = "<<S.length()<<endl;return 0;
}

相关文章:

C++类的引入

C中类的前身 1> 面向对象三大特征&#xff1a;封装、继承、多态 2> 封装&#xff1a;将能够实现某一事物的所有万事万物都封装到一起&#xff0c;包括成员属性&#xff08;成员变量&#xff09;&#xff0c;行为&#xff08;功能函数&#xff09;都封装在一起&#xff…...

【跨域问题】

跨域问题 官方概念&#xff1a; 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域本质来说&#xff0c;是前端请求给到后端时候&#xff0c;请求头里面&#xff0c;有一个 Origin &#xff0c;会带上 协议域名端口号等&#xff1b;后端接受到请求&…...

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的&#xff0c;所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示&#xff1a; FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据&#xff0c;然后SDL将YUV显示到电脑屏幕上…...

Springboot3.4整合jsp

文章目录 环境 springboot3.4 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency> <!--用于编译jsp--> <!-- Tomcat Embed Jasper --> <dependency>…...

CSS:背景样式、盒子模型与文本样式

背景样式 背景样式用于设置网页元素的背景&#xff0c;包括颜色、图片等。 背景颜色 使用 background-color 属性设置背景颜色&#xff0c;支持多种格式&#xff08;颜色英文、十六进制、RGB等&#xff09;。 div {background-color: lightblue; }格式示例十六进制#ff5733R…...

算法:线性查找

线性查找算法是一种简单的查找算法,用于在一个数组或列表中查找一个特定的元素。它从数组的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索完整个数组。线性查找的时间复杂度为O(n),其中n是数组中的元素数量。 实现原理 从列表的第一个元素开始,逐个检查每个…...

【计算机网络】什么是网关(Gateway)?

网上冲浪多了&#xff0c;你可以听到过网关&#xff08;Gateway&#xff09;这个词&#xff0c;但是却不太清楚网关&#xff08;Gateway&#xff09;到底是干什么的、负责网络当中的什么任务&#xff0c;本篇文字将会为你介绍网关&#xff08;Gateway&#xff09;的作用&#x…...

20250106面试

rabbitmq如何保证消息不丢失 my&#xff1a; 持久化&#xff0c;包括消息持久化和队列持久化&#xff0c;重启不丢失。持久化到磁盘中的。 消息确认 死信队列&#xff1a;消费失败&#xff08;业务异常/未确认&#xff0c;重试后&#xff0c;会放死信队列&#xff09;&…...

Java 分布式锁:Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解

&#x1f4da; Java 分布式锁&#xff1a;Redisson、Zookeeper、Spring 提供的 Redis 分布式锁封装详解 在分布式系统中&#xff0c;分布式锁 用于解决多个服务实例同时访问共享资源时的 数据一致性 问题。Java 生态中&#xff0c;有多种成熟的框架可以实现分布式锁&#xff0…...

智能汽车的数字钥匙安全

数字钥匙作为汽车智能化变革下的一项创新技术&#xff0c;利用蓝牙定位、NFC等近场通信技术进行钥匙与汽车的匹配继而开锁&#xff0c;可以让车主通过智能手机、可穿戴设备等解锁汽车&#xff0c;并对汽车实施相关的操作&#xff0c;提升用车便利性&#xff0c;受到越来越多车企…...

YangQG 面试题汇总

一、交叉链表 问题&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解题思想&#xff1a; 双指针 备注&#xff1a;不是快慢指针&#xff0c;如果两个长度相…...

急速了解什么是GPU服务器

GPU服务器是一种专门配置了高性能图形处理器&#xff08;GPU&#xff09;的服务器&#xff0c;旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比&#xff0c;GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…...

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…...

Linux 获取文本部分内容

Linux获取文本部分内容 前言场景获取前几行内容获取末尾几行内容获取中间内容head 命令 tail 命令 结合sed 命令awk 命令 前言 test.log 文本内容如下&#xff1a; &#xff08;注意&#xff1a;内容 a1004和a1005之间有一空行&#xff09; [rootgaussdb002 tmp]# cat test.…...

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…...

【微服务】SpringBoot 整合Redis实现延时任务处理使用详解

目录 一、前言 二、延迟任务的高频使用场景 三、延迟任务常用解决方案 3.1 Quartz 3.2 DelayQueue 3.2.1 Timer + TimerTask 3.2.2 ScheduledExecutorService 3.3 Redis sorted set 3.4 RabbitMQ 四、Redis实现延时队列操作实战 4.1 Redis Sorted Set 概述 4.1.1 Re…...

【Java项目】基于SpringBoot的【校园交友系统】

【Java项目】基于SpringBoot的【校园交友系统】 技术简介&#xff1a;系统软件架构选择B/S模式、SpringBoot框架、java技术和MySQL数据库等&#xff0c;总体功能模块运用自顶向下的分层思想。 系统简介&#xff1a;系统主要包括管理员和用户。 (a) 管理员的功能主要有首页、个人…...

Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作

目录 1.elasticsearch简介1.1.了解es1.2.倒排索引正向索引和倒排索引 1.3.es的一些概念:文档和字段&#xff1b;索引和映射&#xff1b;Mysql与ES1.4.安装es、kibana部署单点es部署kibanaIK分词器安装IK分词器与测试扩展与停用词词典总结 部署es集群 2.索引库操作2.1.mapping映…...

ls指令详讲

&#x1f3dd;️专栏&#xff1a;https://blog.csdn.net/2301_81831423/category_12872319.html &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 基本语法 常用选项详解 1. 基本选项 …...

【前端】【CSS3】基础入门知识

目录 如何学习CSS 1.1什么是CSS​编辑 1.2发展史 1.三种导入方式 1.1、行内样式 1.2、外部样式 1.3、嵌入方式 2.选择器 2.1、基本选择器 &#xff08;1&#xff09;元素选择器 &#xff08;2&#xff09;类选择器 &#xff08;3&#xff09;id选择器&#xff1a;必…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...