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

【C++修行之道】类和对象(四)运算符重载

目录

一、 运算符重载

函数重载和运算符重载有什么关系?

二、.*运算符的作用

三、运算符重载的正常使用

四、重载成成员函数

五、赋值运算符重载

1.赋值运算符重载格式

传值返回和引用返回

有没有办法不生成拷贝?

2. 赋值运算符只能重载成类的成员函数不能重载成全局函数

3. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

六、前置++和后置++重载 


一、 运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号
函数原型:返回值类型 operator操作符(参数列表)。

注意:

  • 不能通过连接其他符号来创建新的操作符:比如operator@ 
  • 重载操作符必须有一个类类型参数 
  • 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不能改变其含义 
  • 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  • .* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

函数重载和运算符重载有什么关系?

他们之间各论各的,没有关系

运算符重载:让自定义类型可以使用运算符,并且控制运算符的行为,增强可读性

函数重载:可以让函数名相同,参数不同的函数存在。

多个同一运算符的重载可以构成函数重载

 

二、.*运算符的作用

class OB
{
public:void func(){cout << "void func()" << endl;}
};typedef void(OB::* Ptrfunc)();// 成员函数指针类型int main()
{// 函数指针void (*ptr)();Ptrfunc fp = &OB::func;// 定义成员函数指针p指向函数func// 成员函数规定要加&才能取到函数指针OB temp;// 定义ob类对象temp(temp.*fp)();// 调用成员函数return 0;
}

typedef void(OB::* Ptrfunc)(); // 成员函数指针类型
  • 使用 typedef 定义了一个名为 Ptrfunc 的类型,这个类型是指向OB类中无参数、无返回值的成员函数的指针类型。
  • OB::*的含义,它表示这是一个指向OB类成员函数的指针 Ptrfunc
Ptrfunc fp = &OB::func; // 定义成员函数指针fp指向函数func
  • 在C++中,成员函数与普通函数在内存中的表示和存储方式有所不同。成员函数不仅包含函数的代码,还隐含地包含了一个指向类对象的this指针,这使得成员函数能够访问和修改对象的状态。
  • 在语法上,&类名::成员函数名是用来获取成员函数地址的标准方式
  • 如果不使用&运算符,编译器可能会将OB::func解析为对成员函数的调用
  • 运算符在这里的作用是明确告诉编译器:“我要的是这个成员函数的地址,而不是执行这个函数”。这样,编译器就能正确地生成获取成员函数地址的代码,而不是尝试调用该函数。
(temp.*fp)(); // 调用成员函数
  • .*:这是一个特殊的成员访问运算符,用于通过对象实例和成员函数指针来调用成员函数。当你有一个指向成员函数的指针,并且想要在某个特定的对象上调用这个函数时,就需要使用这个运算符。 
  • 在temp对象上,通过成员函数指针fp来调用它所指向的成员函数

三、运算符重载的正常使用

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
//private:int _year;int _month;int _day;};// 重载成全局, 无法访问私有成员, 怎么解决?
// 1.提供这些成员get和set
// 2.友元
// 3.重载成成员函数(一般重载成这种)
//// 这里会发现运算符重载成全局的就需要成员变量是公有的,那么问题来了,封装性如何保证?
// 这里其实可以用我们后面学习的友元解决,或者干脆重载成成员函数 
bool operator==(const Date& d1, const Date& d2)
{return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}// d1 - d2
// d1 + d2 无意义
// d1 * d2 无意义
// 一个类要重载哪些运算符是看需求, 看重载有没有价值和意义 int main()
{Date d3(2024, 4, 14);Date d4(2024, 4, 15);// 显示调用(可以正常使用)operator==(d3, d4);// 直接写,转换调用,编译器会转换成operator==(d3, d4)d3 == d4;return 0;
}

四、重载成成员函数

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}d3.Func(d4);//bool Func(const Date& d)//{//	return this->_year == d._year//		&& this->_month == d._month//		&& this->_day == d._day;//}// d3.operator==(d4);bool operator==(const Date& d){cout << "类中";return _year == d._year&& _month == d._month&& _day == d._day;// 隐藏了this指针/*return this->_year == d._year&& this->_month == d._month&& this->_day == d._day;*/}//private:int _year;int _month;int _day;
};// 如果全局和类中都有运算符重载函数,编译器会选择调用类里的
bool operator==(const Date& d1, const Date& d2)
{cout << "全局";return d1._year == d2._year&& d1._month == d2._month&& d1._day == d2._day;
}
int main()
{Date d3(2024, 4, 14);Date d4(2024, 4, 15);// 显式调用d3.operator==(d4);// 转换调用 等价于d3.operator==(d4);d3 == d4;return 0;
}
  • 通过d3.operator==(d4)显式调用了类内的operator==函数。因为这里是直接通过对象d3来调用的,所以肯定是类内的版本被调用。
  • d3 == d4这种简洁的写法在C++中会被自动转换为对operator==的调用。当有多个版本的operator==可用时(如本例中的类内和全局版本),C++会根据一定的规则(如作用域和参数匹配)来选择调用哪一个。在这个例子中,由于类内的版本是成员函数,且其参数与全局版本相同,所以编译器会优先选择类内的版本。 

五、赋值运算符重载

1.赋值运算符重载格式

  • 参数类型:const T&,传递引用可以提高传参效率
  • 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
  • 检测是否自己给自己赋值
  • 返回*this :要复合连续赋值的含义

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}Date& operator=(const Date& d){// 自己给自己赋值if (this != &d){_year = d._year;_month = d._month;_day = d._day;}// 需要返回值的原因:支持连续赋值return *this;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 4, 14);// 拷贝构造// 一个已经存在的对象,拷贝给另一个要创建初始化的对象Date d2(d1);Date d3 = d1;Date d4(2024, 5, 1);// 赋值拷贝/赋值重载// 一个已经存在的对象,拷贝赋值给另一个已经存在的对象d1 = d4;d1 = d2 = d4;return 0;
}
  •  Date& operator=(const Date& d):这个函数重载了赋值运算符(=),允许我们使用=来将一个Date对象的值赋给另一个已经存在的Date对象。函数中首先检查自赋值的情况(即确保赋值操作的左右两边不是同一个对象),然后复制右边的对象的年、月和日到左边的对象,并返回左边对象的引用,以支持连续赋值操作。
  • *this是对象本身,对象在main的作用域里创建,因此出main作用域才析构销毁。而出函数作用域不会销毁,所以此处才能return *this 

传值返回和引用返回

传值返回,返回的是对象的拷贝

引用返回,返回的是对象的别名

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){cout << "Date(const Date& d)" << endl;_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << "~Date()" << endl;_year = -1;_month = -1;_day = -1;}private:int _year;int _month;int _day;
};

  • Date(const Date& d):这是一个拷贝构造函数,它接受一个Date对象的引用,并创建一个新的Date对象,其内容与传入的对象相同

有没有办法不生成拷贝?

使用引用返回

Date func()
{Date d(2024, 4, 14);return d;
}int main()
{const Date& ref = func();ref.Print();return 0;
}

 在main函数中,首先通过调用func函数获取了一个对Date对象的常量引用ref。由于func返回的是一个临时对象,这个对象在表达式结束后就会被销毁。但是,由于ref是对这个临时对象的引用,所以这个临时对象的生命周期会被延长,直到ref的生命周期结束。这是C++11引入的引用折叠和生命周期延长规则的结果。

Date& func()
{Date d(2024, 4, 14);//cout << &d << endl;return d;
}int fx()
{int a = 1;int b = 2;int c = 3;return a + b + c;
}int main()
{//Date& ref = func();const Date& ref = func();cout << &ref << endl;fx();return 0;
}

在main函数中,通过const Date& ref = func();获取了func函数返回的引用,并将其存储在常量引用ref中。由于func返回的是对局部变量的引用,这里的ref实际上引用了一个已经不存在的对象,因此这是不安全的 

Date& func()
{static Date d(2024, 4, 14);return d;
}
// 出了作用域,返回对象还在没有析构,那就可以用引用返回,减少拷贝
// a、返回对象生命周期到了,会析构,传值返回
// b、返回对象生命周期没到,不会析构,传引用返回int main()
{const Date& ref = func();//ref.Print();return 0;
}
  • func函数返回一个对静态局部变量d的引用,该变量在函数第一次被调用时被初始化并在程序的整个生命周期内持续存在。由于d是静态的,它不会在func函数返回后被销毁,因此可以安全地返回它的引用。 

  • 在main函数中,调用了func函数并将返回的引用赋值给const Date& ref。由于返回的是引用,因此没有发生任何拷贝操作,这是效率更高的做法。

2. 赋值运算符只能重载成类的成员函数不能重载成全局函数

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& right)
{if (&left != &right){left._year = right._year;left._month = right._month;left._day = right._day;}return left;
}
// 编译失败:
// error C2801: “operator =”必须是非静态成员

原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。

3. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

class Time
{
public:Time(){_hour = 1;_minute = 1;_second = 1;}Time& operator=(const Time& t){if (this != &t){_hour = t._hour;_minute = t._minute;_second = t._second;}return *this;}
private:int _hour;int _minute;int _second;
};
class Date
{
private:// 基本类型(内置类型)int _year = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d1;Date d2;d1 = d2;return 0;
}

既然编译器生成的默认赋值运算符重载函数已经可以完成字节序的值拷贝了,还需要自己实
现吗?当然像日期类这样的类是没必要的。那么下面的类呢?验证一下试试?

// 这里会发现下面的程序会崩溃掉?这里就需要我们以后讲的深拷贝去解决。
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack s1;s1.Push(1);s1.Push(2);s1.Push(3);s1.Push(4);Stack s2;s2 = s1;return 0;
}

注意:如果类中未涉及到资源管理,赋值运算符是否实现都可以;一旦涉及到资源管理则必须要实现。

六、前置++和后置++重载 

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}// 前置++:返回+1之后的结果// 注意:this指向的对象函数结束后不会销毁,故以引用方式返回提高效率Date& operator++(){_day += 1;return *this;}// 后置++:// 前置++和后置++都是一元运算符,为了让前置++与后置++形成能正确重载// C++规定:后置++重载时多增加一个int类型的参数,但调用函数时该参数不用传递,编译器自动传递// 注意:后置++是先使用后+1,因此需要返回+1之前的旧值,故需在实现时需要先将this保存一份,然后给this + 1//       而temp是临时对象,因此只能以值的方式返回,不能返回引用Date operator++(int){Date temp(*this);_day += 1;return temp;}
private:int _year;int _month;int _day;
};void test02()
{Date d1(2024, 4, 14);Date d2 = ++d1;d1.Print();d2.Print();Date d3 = d1++;d1.Print();d3.Print();/*d1.operator++(1);d1.operator++(100);d1.operator++(0);d1.Print();*/
}int main()
{test02();return 0;
}

今天就先到这了!!!

看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!

你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

相关文章:

【C++修行之道】类和对象(四)运算符重载

目录 一、 运算符重载 函数重载和运算符重载有什么关系&#xff1f; 二、.*运算符的作用 三、运算符重载的正常使用 四、重载成成员函数 五、赋值运算符重载 1.赋值运算符重载格式 传值返回和引用返回 有没有办法不生成拷贝&#xff1f; 2. 赋值运算符只能重载成类的…...

伯克希尔也被ST?

地球&#xff08;最&#xff09;贵股票突然闪崩&#xff0c;美股故障再次上演。昨晚齐刷刷一片的美股出现行情异常&#xff0c;伯克希尔、蒙特利尔银行、巴里克黄金等股票股价跌幅超过98%。其中&#xff0c;巴菲特旗下伯克希尔哈撒韦A类股股价更是暴跌99.97%&#xff0c;股价从…...

低代码和零代码软件时代质量管理(QM)和质量管理系统(QMS)

【前言】 质量控制过程的目的是为了确保产品的制造标准得到保持和改进。质量控制过程使公司能够满足客户的期望&#xff0c;同时确保产品质量的一致水平。采用这些标准创造了一种公司文化&#xff0c;鼓励所有员工努力实现高质量的生产标准。低代码和零代码软件可以成为质量控…...

JS跨页面或跨JS文件对变量赋值

JS跨页面或跨JS文件对变量赋值&#xff0c;这是很小的一个问题。 但问题虽小&#xff0c;却总觉得有点不够自然&#xff0c;不爽。 为什么呢&#xff1f;访问一个页面上的变量不是什么难事&#xff0c;比如用parent.变量名&#xff0c;或者windows名.变量名&#xff0c;都可以…...

xxe漏洞——无回显(ctfshow web374——378)

ctfshow——web374 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2021-01-07 12:59:52 # Last Modified by: h1xa # Last Modified time: 2021-01-07 13:36:47 # email: h1xactfer.com # link: https://ctfer.com*/error_reporting(0); libxml_disable_en…...

深入解读 Android Hook 技术-从原理到实践

在Android开发中&#xff0c;Hook技术是一种强大的手段&#xff0c;它允许开发者拦截和修改系统或应用的行为。通过Hook&#xff0c;我们可以在事件传递的过程中插入自定义的逻辑&#xff0c;从而实现对应用行为的监控和修改。 Android 系统有自己的事件分发机制&#xff0c;…...

架构每日一学 15:想要提升协作效率,必须先统一语义

谭sir与二仙桥大爷的经典对话&#xff1a; 谭sir&#xff1a;你该走哪&#xff1f;&#xff08;非机动车能走机动车道吗&#xff1f;&#xff09; 大爷&#xff1a;走二仙桥去成华大道&#xff08;因为我要去成华大道&#xff0c;当然要走二仙桥&#xff09; 谭sir&#xff1a;…...

基于树莓派4B设计的智能家居系统(华为云IOT)

基于树莓派的智能家居控制系统(华为云IOT) 文章目录 一、设计需求前言【1】 项目背景【2】需求总结【3】研究的内容【4】 国内外研究状况【5】本课题要解决的问题【6】开发工具的选择 二、硬件选型【1】 树莓派开发板【2】TFT卡-烧写系统使用【3】0.5米网线-远程登录【4】MQ2烟…...

路由懒加载

在 Vue.js 中&#xff0c;路由懒加载&#xff08;也称为代码分割&#xff09;是一种优化策略&#xff0c;它允许你将 Vue 组件分割成不同的代码块&#xff0c;并在需要时按需加载它们。这有助于减少初始加载时间&#xff0c;提高用户体验。 Vue Router 支持 Webpack 的动态 im…...

在Spring中实现资源的动态加载和卸载

在Spring框架中&#xff0c;实现资源的动态加载和卸载通常涉及以下几个方面&#xff1a; 1. 使用Bean注解动态注册Bean 通过在配置类中使用Bean注解&#xff0c;可以在运行时动态创建和注册Bean。 Configuration public class DynamicBeanConfig {Beanpublic MyBean myBean(…...

Windows下 CLion中,配置 OpenCV、LibTorch

首先按照win下C部署深度学习模型之clion配置pytorchopencv教程记录 步骤配置。 LibTorch 部分 在测试LibTorch时会出现类似 c10.dll not found 的问题&#xff08;Debug才有&#xff09;&#xff1a; 参考C部署Pytorch&#xff08;Libtorch&#xff09;出现问题、错误汇总和 …...

机器学习知识点总结

简介&#xff1a;随着人工智能&#xff08;AI&#xff09;蓬勃发展&#xff0c;也有越来越多的人涌入到这一行业。下面简单介绍一下机器学习的各大领域&#xff0c;机器学习包含深度学习以及强化学习&#xff0c;在本节的机器学习中主要阐述一下机器学习的线性回归逻辑回归&…...

OBproxy基础运维

简介 obproxy 属于OceanBase的代理&#xff0c;生产环境中 OceanBase 数据库的数据 会以 多副本的形式 存放在各个 OBServer 节点上&#xff0c;obproxy 接收用户发出的 SQL 请求&#xff0c;并将 SQL 请求转发至最佳目标 OBServer 节点&#xff0c;最后将执行结果返回给用户&…...

【Python】 探索Pytz库中的时区列表

基本原理 在Python中&#xff0c;处理时区是一个常见但复杂的问题。pytz是一个Python库&#xff0c;它提供了对时区的精确和丰富的支持。pytz库是datetime模块的补充&#xff0c;它允许更准确地处理时区信息。pytz库包括了IANA时区数据库&#xff0c;这个数据库包含了全球的时…...

C#操作MySQL从入门到精通(9)——Mysql中的数据类型以及对应的C#中的数据类型

1、本文介绍...

第六讲:AD、DA的工作原理及实现、运放电路

DA 数模转换器 (DAC) 数模转换器&#xff08;Digital-to-Analog Converter&#xff0c;简称DAC&#xff09;是一种将数字信号转换为模拟信号的电子装置。DAC在各种电子设备中广泛应用&#xff0c;如音频设备、通信系统、测量设备和控制系统中。以下是DAC的主要概念和应用。…...

计网ppt标黄知识点整理第(4)章节——谢希仁版本、期末复习自用

路由器&#xff1a;查找转发表&#xff0c;转发分组。 IP网的意义&#xff1a;当互联网上的主机进行通信时&#xff0c;就好像在一个网络上通信一样&#xff0c;看不见互连的各具体的网络异构细节。如果在这种覆盖全球的 IP 网的上层使用 TCP 协议&#xff0c;那么就…...

[数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6012 标注数量(xml文件个数)&#xff1a;6012 标注数量(txt文件个数)&#xff1a;6012 标注…...

AndroidStudio中debug.keystore的创建和配置使用

1.如果没有debug.keystore,可以按照下面方法创建 首先在C:\Users\Admin\.android路径下打开cmd窗口 之后输入命令:keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入两次密码(密码不可见,打码处随便填写没关系) 2.在build…...

什么是最好的手机数据恢复软件?6 款手机数据恢复软件 [2024 年更新]

什么是最好的手机数据恢复软件&#xff1f;在这篇文章中&#xff0c;您将了解 6 款最好的免费手机数据恢复软件&#xff0c;并学习如何恢复数据的完整指南。 最好的手机数据恢复软件是什么&#xff1f; 手机数据恢复软件是恢复智能手机中丢失或删除的文件、消息、照片和其他宝…...

力扣2653.滑动子数组的美丽值

力扣2653.滑动子数组的美丽值 计数排序&#xff1a;数值作为下标 记录个数 求第x小的数 &#xff1a; 暴力枚举负数 直到找到第x个负数 class Solution {public:vector<int> getSubarrayBeauty(vector<int>& nums, int k, int x) {const int BIAS 50;int c…...

2024-06-04 架构-不同层次的抽象的处理-分析

摘要: 2024-06-04 架构-不同层次的抽象的处理-分析. 不同层次的抽象: 将事情做不同的情况的解耦&#xff0c;关于在于理解事情本身的性质&#xff0c;如何解耦&#xff0c;如何处理当将事情解耦成不同的情况后&#xff0c;就可以针对不同的事情&#xff0c;最不同的处理。这么…...

MySQL——C语言连接数据库

MySQL Connection ​ 连接数据库的客户端除了命令行式的还有图形化界面版本&#xff0c;网页版本&#xff0c;当然也包括语言级别的库或者是包&#xff0c;能够帮助我们直接连接数据库&#xff1b; 一、语言连接库下载 方式一&#xff1a;不建议使用&#xff0c;需要自己配置…...

新能源汽车推行精益生产:绿色动力下的效率革命

在新能源汽车行业迅猛发展的当下&#xff0c;推行精益生产已成为提升竞争力的关键所在。精益生产&#xff0c;作为一种以客户需求为导向、追求流程最优化和浪费最小化的管理理念&#xff0c;正逐步在新能源汽车领域展现出其独特的魅力。 新能源汽车的兴起&#xff0c;不仅代表了…...

FCA-九数云 试题及答案

第1题【判断题】仪表板中筛选器只能绑定图表或者图表所在分析表的字段&#xff0c;无法绑定父表中的字段。 A. 正确B. 错误 正确答案&#xff1a;B 第2题【单选题】一张绩效奖金看板&#xff0c;分享给公司所有成员查看。希望输入个人的信息前&#xff0c;只可以查看自己的相关…...

qt dragEnterEvent dragLeaveEvent dragMoveEvent dropEvent都不响应的问题解决方案。

环境&#xff1a;vs2019qt5.14.2 坑哦。让我搞了好久。各种不执行&#xff0c;最后发现,不用vs调制&#xff0c;直接运行exe就能接收拖拽了。 记录一下,感觉是qt的bug。上代码。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QText…...

LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制&#xff0c;帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述…...

【GIC400】——中断使能

文章目录 中断使能全局中断使能RISC-VCortex-MCortex-A中断控制器使能PLICNVICGIC模块中断使能参考系列文章 【ARMv7-A】——异常与中断 【ARMv7-A】——异常中断处理概述 【ARMv7-A】——进入和退出异常中断的过程</...

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…...

游戏心理学Day04

第二章 心理学的生理基础 第三节 游戏中的感觉应用 认知地图 表象是在没有外在知觉信息来源的情况下&#xff0c;对类似知觉信息的加工。 表征是指信息或知识在心理活动中的表现和记载方式&#xff0c;表征是外部事物在心理活动中的内部再现。 我们对世界的表象&#xff0c…...

学生静态网页模板/seo比较好的公司

文章目录前言1.业务流程说明2.登录业务的相关技术点3.登录—token原理分析4.前端框架设计一、登录功能的实现1.登录页面设计2.登录逻辑功能实现2.1 登录逻辑页面2.2 接口请求二、注册逻辑功能实现1.注册页面设计2.接口请求前言 1.业务流程说明 登录功能的业务流程主要有 1.在…...

济南网站建设认可搜点网络能/单页网站排名优化

prefork模式&#xff1a;Apache在启动之初&#xff0c;就预先fork一些子进程&#xff0c;然后等待请求进来。之所以这样做&#xff0c;是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程&#xff0c;在一个时间点内&#xff0c;只能处理一个请求。 优点&#xff1a;…...

dreamweaver画图做网站/广东疫情中高风险地区最新名单

哲学家吃饭问题模拟(java写的)这里是两种算法&#xff0c;公用一个chopstick类&#xff1a;Chopstick类&#xff1a;public class Chopstick {/*** 此筷子是否可以拿起*/private boolean enable;/*** 此筷子的名称*/public String name;public Chopstick(boolean enable, Strin…...

怎么从阿里巴巴做网站/西安疫情最新消息1小时内

Python中创建自己库的方法 发布时间&#xff1a;2020-07-06 15:53:36 来源&#xff1a;亿速云 阅读&#xff1a;125 作者&#xff1a;清晨 小编给大家分享一下Python中创建自己库的方法&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起去探讨吧&#x…...

如何创建一个网站/网络推广的方式有哪些

export LLVM_CONFIG/usr/bin/llvm-config-10...

制作网站先做前端还是后端/电商seo搜索优化

1.打断点 2.查看断点 3.删除断点 4.保存和读取...