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

【C++面向对象】封装(下):探索C++运算符重载设计精髓

🔥个人主页 🔥

😈所属专栏😈 


每文一诗  💪🏼

     年年岁岁花相似,岁岁年年人不同 —— 唐/刘希夷《代悲白头翁》

        译文:年年岁岁繁花依旧,岁岁年年看花之人却不相同


目录

C++运算符重载概念

C++运算符重载语法及作用

加减乘除运算符重载

赋值运算符重载

返回值作为引用以实现链式赋值

关系运算符重载

大于号运算符重载

相等运算符重载

全部代码


C++运算符重载概念

        在 C++ 里,运算符重载属于多态的一种表现形式,它允许你为自定义的数据类型重新定义运算符的行为。

运算符重载其实就是对已有的运算符赋予新的功能,使它能够处理自定义类型的对象

C++运算符重载语法及作用

语法:返回类型 operator运算符(参数列表) {}

  1. 提高代码可读性:在处理自定义类型时,使用重载后的运算符能让代码更直观、自然。例如,对于自定义的复数类,你可以重载+运算符,让两个复数相加的操作就像普通数字相加一样简单。
  2. 实现自定义类型的操作:借助运算符重载,你能为自定义类型实现像内置类型那样的操作。比如,对于自定义的矩阵类,你可以重载+-*等运算符,实现矩阵的加减乘运算。
  3. 代码复用与一致性:运算符重载可以复用已有的运算符,使代码更具一致性。对于熟悉内置运算符的开发者来说,重载后的运算符也易于理解和使用。

加减乘除运算符重载

  1. 作类成员函数重载
#include <iostream>class human
{
public:human(){};human(int a ,int b):m_a(a),m_b(b){}//加减乘除运算符重载(成员函数)human operator*(const human& h){human h2;h2.m_a = this->m_a * h.m_a;h2.m_b = this->m_b * h.m_b;return h2;}int geta(){return this->m_a;}int getb(){return this->m_b;}private:int m_a;int m_b;};int main(int argc, char const *argv[])
{human h(10,20);human h1(2,10);//相当于 h.operator*(h1)human h3 = h * h1;std::cout << h3.geta() <<" "<< h3.getb()<<std::endl;return 0;
}

代码解读:

  • 提供默认无参构造函数函数初始化列表
     human(){};human(int a ,int b):m_a(a),m_b(b){}
  • 加减乘除运算符重载(成员函数)这里指的是乘法
    human operator*(const human& h){human h2;h2.m_a = this->m_a * h.m_a;h2.m_b = this->m_b * h.m_b;return h2;}
  1. 这里的参数是指常量引用目的是不使用值传递的方式,防止对数据进行大量的拷贝,常量引用本质使用地址传递,地址通常占有4个字节,程序效率更高
  2. 这里的this指向调用该重载函数的哪个对象。
  3. 栈区重新创建一个对象h,并将运算后的成员变量更新到该对象并返回。
  • human h3 = h * h1;

    这个相当于 h.operator*(h1)

  • std::cout << h3.geta() <<" "<< h3.getb()<<std::endl;

    因为成员变量m_a和m_b时私有变量,不能在类外访问,所以在类内使用函数来访问。

  • 输出

这样就实现了类型为human的变量使用运算符来进行运算,20 = 10 *2 ;200 = 20*10

其他加减除法以此类推。

2.作全局函数重载

#include <iostream>class human
{friend human operator*(const human& p2, int val);
public:human(){};human(int a ,int b):m_a(a),m_b(b){}//加减乘除运算符重载(成员函数)human operator*(const human& h){human h2;h2.m_a = this->m_a * h.m_a;h2.m_b = this->m_b * h.m_b;return h2;}int geta(){return this->m_a;}int getb(){return this->m_b;}private:int m_a;int m_b;};
// 加减乘除运算符重载(全局函数)访问私有成员需要加friend声明
human operator*(const human& p2, int val)
{human temp;temp.m_a = p2.m_a *val;temp.m_b = p2.m_b * val;return temp;
}int main(int argc, char const *argv[])
{human h(10,20);human h1(2,10);//相当与 operator*(h,90)human h2 = h * 90;//相当于 h.operator*(h1)human h3 = h * h1;std::cout << h2.geta() <<" "<< h2.getb()<<std::endl;std::cout << h3.geta() <<" "<< h3.getb()<<std::endl;return 0;
}

代码解读:

  •  加减乘除运算符重载(全局函数)访问私有成员需要加friend声明
human operator*(const human& p2, int val)
{human temp;temp.m_a = p2.m_a *val;temp.m_b = p2.m_b * val;return temp;
}

        该函数在类外定义,在类外定义的函数不能访问类内的私有变量,但是可以通过友元函数的方法来让类外定义的全局函数访问类内的私有变量。即

    friend human operator*(const human& p2, int val);
  • human h2 = h * 90;

     相当与 operator*(h,90)调用的是全局函数。

  • 输出

赋值运算符重载

返回值作为引用以实现链式赋值

#include <iostream>class human
{public:human(){};human(int a ,int b,int c):m_a(a),m_b(b),m_c(new int(c)){}//赋值运算符重载human& operator=(const human& h){if(this != &h){if(m_c != nullptr){delete m_c;m_c = nullptr;}}m_c = new int(*h.m_c);return *this;}int geta(){return this->m_a;}int getb(){return this->m_b;}int getc(){return *this->m_c;}
private:int m_a;int m_b;int* m_c;};int main(int argc, char const *argv[])
{human h(10,20,12);human h1(2,10,34);human h2(22,10,4);h = h1 = h2;std::cout <<h.getc()<<std::endl;return 0;
}

 代码解读:

  • 函数初始化列表来初始化成员变量

        human(int a ,int b,int c):m_a(a),m_b(b),m_c(new int(c)){}
  • 赋值运算符重载

     human& operator=(const human& h){if(this != &h){if(m_c != nullptr){delete m_c;m_c = nullptr;}}m_c = new int(*h.m_c);return *this;}

          首先使用this来判断调用该函数的对象是否和传入的对象是同一块内存,接着在判断调用该成员函数的对象中的成员变量m_c是否不为空,不为空则释放内存,再置为空。

两个对象不是同一块内存(this != &h)需要delete,再重新开辟内存。

  • 这样作的目的是用于:如果对一个成员变量是指针的对象,将该指针指向的值进行修改时,需要先释放调用该重载函数的对象中指针变量,再为空,然后在m_c = new int(*h.m_c);重新开辟一块内存,内存的值是参数中对象的那个值。

  • 原因:若不释放这块内存,在赋值操作完成后,原来的内存就会变成无法访问的 “孤儿” 内存,程序无法再释放它,从而造成内存泄漏。执行 delete m_c; 就能正确释放这块内存,让系统可以重新使用它。

两个对象是同一块内存(this == &h)不需要delete。

  • 原因:当两个对象是统一块内存时,m_c这个指针变量指向的值是一样的,如果对其执行 delete m_c,那么在后面m_c = new int(*h.m_c);时使用*h.m_c时是非法的,因为这块内存已经被释放掉了,不能访问。

为什么要m_c = new int(*h.m_c);

  • 原因:编译器默认提供的是浅拷贝,对于一个含有指针变量的类中,浅拷贝会对这块内存多次释放,是不合法的,所以需要执行深拷贝来使得两个对象中的指针变量指向的值相同,但指针的值不同(地址不同)
  • 有关【C++面向对象】封装(上):探寻构造函数的幽微之境-CSDN博客深拷贝,浅拷贝【C++面向对象】封装(上):探寻构造函数的幽微之境-CSDN博客

为什么return *this;返回值类型是human&引用。

  • 原因:this指向调用该成员函数的那个对象,而*this是指的该对象,而返回值是human&引用是为了实现链式调用,而返回值是human不能实现链式赋值,因为他返回的是该对象的拷贝。

关系运算符重载

大于号运算符重载

#include <iostream>class human
{friend bool operator>(const human& h1,int val);
public:human(){};human(int a ,int b,int c):m_a(a),m_b(b),m_c(new int(c)){}//关系运算符重载bool operator>(const human& h1){if(this->m_a > h1.m_a && this->m_b > h1.m_b)return true;elsereturn false;}int geta(){return this->m_a;}int getb(){return this->m_b;}int getc(){return *this->m_c;}
private:int m_a;int m_b;int* m_c;};//关系运算符重载(全局函数)访问私有成员需要加friend声明
bool operator>(const human& h1,int val){if(val< h1.m_a && val < h1.m_b)return true;elsereturn false;
}
int main(int argc, char const *argv[])
{human h(10,20,12);human h1(2,10,34);//相当于 h.operator>(h1)if(h > h1)std::cout<<"h>h1"<<std::endl;elsestd::cout<<"h<h1"<<std::endl;//相当与 operator>(h,12)if(h > 12)std::cout<<"h>12"<<std::endl;elsestd::cout<<"h<12"<<std::endl;return 0;
}

 代码解读:

上段代码分别用成员函数和全局函数的方法来实现对自定义类型的判断

  • 对于
h > h1

相当于 h.operator>(h1)

  • 对于
h > 12

相当与 operator>(h,12)

  • 输出

相等运算符重载

#include <iostream>class human
{friend bool operator==(const human& h1,int val);
public:human(){};human(int a ,int b,int c):m_a(a),m_b(b),m_c(new int(c)){}//关系运算符重载bool operator==(const human& h1){if(this->m_a == h1.m_a && this->m_b == h1.m_b)return true;elsereturn false;}int geta(){return this->m_a;}int getb(){return this->m_b;}int getc(){return *this->m_c;}
private:int m_a;int m_b;int* m_c;};//关系运算符重载(全局函数)访问私有成员需要加friend声明
bool operator==(const human& h1,int val){if(val == h1.m_a)return true;elsereturn false;
}int main(int argc, char const *argv[])
{human h(10,20,12);human h1(2,10,34);//相当于 h.operator==(h1)if(h == h1)std::cout<<"二者相等"<<std::endl;elsestd::cout<<"二者不等"<<std::endl;//相当与 operator==(h,23)if(h == 23)std::cout<<"二者相等"<<std::endl;elsestd::cout<<"二者不等"<<std::endl;return 0;
}

  代码解读:

上段代码分别用成员函数和全局函数的方法来实现对自定义类型的相等判断

  • 对于
h == h1

相当于相当于 h.operator==(h1)

  • 对于
h == 23

相当于 operator==(h,23)

  • 输出

全部代码

#include <iostream>class human
{friend human operator*(const human& p2, int val);friend bool operator==(const human& h1,int val);friend bool operator>(const human& h1,int val);
public:human(){};human(int a ,int b,int c):m_a(a),m_b(b),m_c(new int(c)){}//加减乘除运算符重载(成员函数)human operator*(const human& h){human h2;h2.m_a = this->m_a * h.m_a;h2.m_b = this->m_b * h.m_b;return h2;}//关系运算符重载bool operator==(const human& h1){if(this->m_a == h1.m_a && this->m_b == h1.m_b)return true;elsereturn false;}//关系运算符重载bool operator>(const human& h1){if(this->m_a > h1.m_a && this->m_b > h1.m_b)return true;elsereturn false;}//赋值运算符重载human& operator=(const human& h){if(this != &h){if(m_c != nullptr){delete m_c;m_c = nullptr;}}m_c = new int(*h.m_c);return *this;}int geta(){return this->m_a;}int getb(){return this->m_b;}int getc(){return *this->m_c;}
private:int m_a;int m_b;int* m_c;};
// 加减乘除运算符重载(全局函数)访问私有成员需要加friend声明
human operator*(const human& p2, int val)
{human temp;temp.m_a = p2.m_a *val;temp.m_b = p2.m_b * val;return temp;
}//关系运算符重载(全局函数)访问私有成员需要加friend声明
bool operator==(const human& h1,int val){if(val == h1.m_a)return true;elsereturn false;
}
//关系运算符重载(全局函数)访问私有成员需要加friend声明
bool operator>(const human& h1,int val){if(val< h1.m_a && val < h1.m_b)return true;elsereturn false;
}
int main(int argc, char const *argv[])
{human h(10,20,12);human h1(2,10,34);//相当与 operator*(h,90)human h2 = h * 90;//相当于 h.operator*(h1)human h3 = h * h1;//相当于 h.operator==(h1)if(h == h1)std::cout<<"二者相等"<<std::endl;elsestd::cout<<"二者不等"<<std::endl;//相当与 operator==(h,23)if(h == 23)std::cout<<"二者相等"<<std::endl;elsestd::cout<<"二者不等"<<std::endl;//相当于 h.operator>(h1)if(h > h1)std::cout<<"h>h1"<<std::endl;elsestd::cout<<"h<h1"<<std::endl;//相当与 operator>(h,12)if(h > 12)std::cout<<"h>12"<<std::endl;elsestd::cout<<"h<12"<<std::endl;std::cout << h2.geta() <<" "<< h2.getb()<<std::endl;std::cout << h3.geta() <<" "<< h3.getb()<<std::endl;h = h1;std::cout <<h.getc()<<std::endl;return 0;
}

 🔥个人主页 🔥

😈所属专栏😈 

相关文章:

【C++面向对象】封装(下):探索C++运算符重载设计精髓

&#x1f525;个人主页 &#x1f525; &#x1f608;所属专栏&#x1f608; 每文一诗 &#x1f4aa;&#x1f3fc; 年年岁岁花相似&#xff0c;岁岁年年人不同 —— 唐/刘希夷《代悲白头翁》 译文&#xff1a;年年岁岁繁花依旧&#xff0c;岁岁年年看花之人却不相同 目录 C运…...

分布式存储数据恢复—hbase和hive数据库文件被删除如何恢复数据?

分布式存储数据恢复环境&#xff1a; 16台某品牌R730xd服务器节点&#xff0c;每台服务器节点上有数台虚拟机。 虚拟机上部署Hbase和Hive数据库。 分布式存储故障&#xff1a; 数据库底层文件被误删除&#xff0c;数据库不能使用。要求恢复hbase和hive数据库。 北亚企安数据恢复…...

【并行分布计算】Hadoop伪分布搭建

Hadoop伪分布搭建 1. 修改core-site.xml fs.defaultFS设置的是HDFS的地址&#xff0c;设置运行在本地的9000端口上 hadoop.tmp.dir设置的是临时目录&#xff0c;如果没有设置的话默认在/tmp/hadoop-${user.name}中&#xff0c;系统重启后会导致数据丢失&#xff0c;因此修改这…...

Redis面试——常用命令

一、String &#xff08;1&#xff09;设置值相关命令 1.1.1 SET 功能&#xff1a;设置一个键值对&#xff0c;如果键已存在则覆盖旧值语法&#xff1a; SET key value [EX seconds] [PX milliseconds] [NX|XX]EX seconds&#xff1a;设置键的过期时间为 seconds 秒 PX milli…...

告别定时任务!用Dagster监听器实现秒级数据响应自动化

在数据管道开发中&#xff0c;我们经常面临需要根据外部事件触发计算任务的场景。传统基于时间的调度方式存在资源浪费和时效性不足的问题。本文将通过Dagster的**传感器&#xff08;Sensor&#xff09;**功能&#xff0c;演示如何构建事件驱动的数据处理流程。 场景模拟&…...

测试用例的生命周期:从诞生到退役的全过程管理

测试用例不是一成不变的标本 在敏捷开发时代&#xff0c;测试用例就像有机生命体一样会经历完整的生命周期。据Microsoft Research调查&#xff0c;良好管理的测试用例可使缺陷发现率提升40%&#xff0c;而缺乏管理的用例库在6个月后失效比例高达65%&#xff0c;本文将深入解析…...

【并行分布计算】Hadoop单机分布搭建

Hadoop单机分布搭建 环境&#xff1a;VMware Workstation虚拟机centos7镜像MobaXterm远程连接工具 为了使机器都处于同一个局域网中&#xff0c;先要修改机器的ip地址分配方式为固定ip&#xff0c;并为其固定分配一个ip地址。 [rootlocalhost ~]# vi /etc/sysconfig/network-…...

Android studio前沿开发--利用socket服务器连接AI实现前后端交互(全站首发思路)

我们在前几期学习了利用socket进行前后端的交互&#xff0c;但那只是基础性知识&#xff0c;这次&#xff0c;通过参考讯飞星火的java参考文档&#xff0c;再结合之前所学的socket服务&#xff0c;成功实现了通过后端将AI的调用实现在了自己的APP中。 本次的学习内容 1.真机的…...

Redis的下载安装和使用(超详细)

目录 一、所需的安装包资源小编放下述网盘了&#xff0c;提取码&#xff1a;wshf 二、双击打开文件redis.desktop.manager.exe 三、点击next后&#xff0c;再点击i agree 四、点击箭头指向&#xff0c;选择安装路径&#xff0c;然后点击Install进行安装 五、安装完后依次点…...

手机状态:UML 状态图(State Diagram)的解析与绘画

目录 一、UML 状态图&#xff08;State Diagram&#xff09;是什么 二、题目原型 三、手机状态图的解析 状态转换的触发条件 四、状态图的构建与解读 图的解读 五、状态图的实际应用 六、总结与展望 一、UML 状态图&#xff08;State Diagram&#xff09;是什么 UML …...

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…...

HarmonyOS-ArkUI: 自定义组件冻结功能@ComonentV2 freezeWhenInactive属性

引 @ComponentV2 装饰器是可以接收参数的,叫freezeWhenInactive, 顾名思义,就是当组件变成Inactive的时候,冻结。其默认值是false。所以如果您没有传参数时,默认不冻结。 冻结到底是一种什么状态呢?说简单点就是状态变量不响应更新。@Monitor修饰的那些状态变量更新检测…...

【问题】一招解决vscode输出和终端不一致的困扰

背景&#xff08;闲话Trae&#xff09; Trae是挺好&#xff0c;用了几天&#xff0c;发现它时不时检查文件&#xff0c;一检测就转悠半天&#xff0c;为此我把当前环境清空&#xff0c;就留一个正在调的程序&#xff0c;结果还照样检测&#xff0c;虽然没影响什么&#xff0c;…...

【CODESYS学习笔记001】MODBUS-TCP 与 标准TCP通信的优缺点对比

1. MODBUS-TCP 优点&#xff1a; 1. 标准化协议 - 基于工业标准&#xff08;RFC标准&#xff09;&#xff0c;兼容性强&#xff0c;几乎所有PLC和工业设备都支持。 - 固定功能码&#xff08;如0x03读寄存器、0x10写寄存器&#xff09;&#xff0c;开发简单。 2. 数据格…...

⭐ Unity 使用Odin Inspector增强编辑器的功能:UIManager脚本实例

先看一下测试效果&#xff1a; 在Unity开发中&#xff0c;Odin Inspector已经成为了一个非常受欢迎的工具&#xff0c;它通过增强编辑器的功能&#xff0c;使得开发者在工作中更加高效&#xff0c;尤其是在处理复杂数据和自定义编辑器方面。今天&#xff0c;我们将通过一个简…...

Linux网络协议栈深度解析:从数据封装到子网划分的底层架构

知识点5 1、封装和解封装的流程 封装数据报文&#xff1a;发送数据 解封装数据报文&#xff1a;接收报文 以后我们的网络编程过程中&#xff0c;只需要告知IP与端口号&#xff0c;链路层的MAC地址 有协议栈帮我们提供。 2、链路层报文格式&#xff08;mac报文&#xff09; …...

Java与MySQL数据库连接的JDBC驱动配置教程

系列文章目录 Java JDBC编程 文章目录 系列文章目录前言一、JDBC简介&#xff1a;二、mysql-connector-java驱动详解&#xff1a; 驱动版本特性介绍&#xff1a; 三、JDBC驱动安装与配置&#xff1a; 1.IDE项目设置:2.命令行安装&#xff1a;3.使用Maven或Gradle &#xff1a;…...

光伏产品研发项目如何降本增效?8Manage 项目管理软件在复合材料制造的应用

在复合材料制造领域&#xff0c;特别是光伏PECVD石墨舟和燃料电池石墨双极板等高精尖产品的研发过程中&#xff0c;高效的项目管理直接决定了产品开发周期、质量和市场竞争力。然而&#xff0c;许多企业在项目立项、进度跟踪、资源分配和质量控制等环节面临挑战。 针对这些痛点…...

矫平机:工业制造中的“板材整形师“

在机械制造车间此起彼伏的轰鸣声中&#xff0c;一卷卷冷轧钢卷正经历着神奇的蜕变。经过开卷、矫平、剪切等工序&#xff0c;原本蜷曲的金属板材变得平整如镜&#xff0c;这些改变都源于生产线上一个关键设备——矫平机。这台被称作"板材整形师"的精密机械&#xff0…...

数据江湖:Node.js 与 SQLite3 的轻量之道

前言 在这个“万码奔腾”的时代,想在江湖中闯出一片天地,不光要有剑(JavaScript),还得有招式(数据库)!本篇秘籍便是教你如何用 Node.js + SQLite3 打造一座小而美的“数据藏经阁”。初学者可轻松上手,高手可在细节中悟出更深的“数据库心法”。 简介 SQLite 在前端…...

4.15BUUCTF Ez_bypass,HardSQL,AreUSerialz,BabyUpload,CheckIn

[MRCTF2020]Ez_bypass 打开环境&#xff0c;看源码 include flag.php; $flagMRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}; if(isset($_GET[gg])&&isset($_GET[id])) {$id$_GET[id];$gg$_GET[gg];if (md5($id) md5($gg) && $id ! $gg) {echo You got the first step;i…...

【HarmonyOS NEXT+AI】问答 03:找不到 DevEco Studio Cangjie Plugin 下载链接?

【HarmonyOS NEXTAI】问答 03&#xff1a;找不到 DevEco Studio Cangjie Plugin 下载链接&#xff1f; 在 "HarmonyOS NEXTAI 大模型打造智能助手 APP (仓颉版)" 课程里面&#xff0c;有学员提到了这样一个问题&#xff1a;我在华为开发者社区官网找不到 DevEco Stu…...

使用 reverse-sourcemap 工具反编译 Vue 项目

要使用 reverse-sourcemap 工具反编译 Vue 项目&#xff0c;可以按照以下步骤操作&#xff1a; 步骤一&#xff1a;安装 reverse-sourcemap 首先&#xff0c;需要全局安装 reverse-sourcemap 工具。在命令行中执行以下命令&#xff1a; npm install --global reverse-sourcem…...

通信安全员历年考试重难点有哪些?

通信安全员考试的重难点紧密围绕行业特性和法规更新展开&#xff0c;需结合最新政策与实践案例综合掌握。以下是基于历年考试趋势及 2025 年新规的深度解析&#xff1a; 一、核心法规与标准体系&#xff08;占比 30%-40%&#xff09; 1. 安全生产法与行业规定 《安全生产法》…...

C++(OpenCV)实现MATLAB的edge(I, “sobel“)边缘检测

文章目录 方案分析具体代码实现关键步骤说明注意事项 为了实现类似于MATLAB的edge(I, "sobel")函数的C代码&#xff0c;我们需要复现其完整的边缘检测流程&#xff0c;包括梯度计算、非极大值抑制和阈值处理。以下是具体的方案及代码实现&#xff1a; 方案分析 图像…...

uniapp通过uni.addInterceptor实现路由拦截

注&#xff1a;此拦截不能首次拦截路由跳转的方法&#xff08;switchTab, navigateTo, reLaunch, redirectTo&#xff09;&#xff0c;拦截request请求api可以 1. app.vue 代码 import { onLaunch} from dcloudio/uni-appimport permission from ./utils/permissiononLaunch(…...

vue2.x Echart label根据数据长度选择不同的间隔显示

折线图需要在各个点上方展示数据&#xff0c;但是数据数字的位数可能达到5~8位&#xff0c;需要根据密度进行间隔展示。例如&#xff0c;如果数据长度小于7&#xff0c;则每一项都展示&#xff0c;如果在7~10之间&#xff0c;2位展示一项&#xff0c;如果大于10&#xff0c;那么…...

Wifi密码查看软件V1.0

⭐本软件用于查看电脑连接过所有WiFi密码&#xff0c;不具备破解功能。 可在忘记WiFi密码或他人输入密码自己不知道的情况下使用。 ⭐⭐为便于快速分享&#xff0c;加入双击【密码】列可将WIFI密码复制在粘贴板。 ⭐⭐⭐双击【名称】列可生成用于手机连接的二维码进行显示&…...

Hyperf (Swoole)的多进程 + 单线程协程、Gin (Go)Go的单进程 + 多 goroutine 解说

1. 核心概念解析 (1) Hyperf (Swoole): 多进程 单线程协程 Swoole 并发模型详解 Swoole 的并发模型基于多进程架构&#xff0c;每个进程是单线程的&#xff0c;线程内运行多个协程。以下是其结构的关键点&#xff1a; 多进程&#xff1a;Swoole 应用程序启动时&#xff0c;…...

国内网络设备厂商名单(List of Domestic Network Equipment Manufacturers)

国内网络设备厂商名单 运维工程师必须广泛熟悉国内外各大厂商的设备&#xff0c;深入掌握其应用场景、功能特点及优势。这不仅有助于在故障排查时迅速定位问题&#xff0c;还能在系统设计、优化与升级中做出更合理的决策。对设备特性的精准把握&#xff0c;能够显著提升运维效…...

基础元器件-电感(2025.4.17)

1.电感是电磁感应器件&#xff0c;它是储能元器件。 2.电感表示形式&#xff08;直标法和色标法&#xff09; 3.电感读取基准是mH&#xff0c;3R3指的是3.3mH&#xff0c;R代表小数点。 4.电感特性&#xff1a;通直流阻交流 5.电感的分类 注&#xff1a;用电容或者电感滤波是…...

高通手机抓取sniffer log的方法

方法如下&#xff1a; adb root adb remount adb shell echo 4 >/sys/module/wlan/parameters/con_mode //不同的高通基线这块目录存在差异性 ifconfig wlan0 up iwpriv wlan0 setMonChan 149 2 //设置信道和bandwitdh tcpdump -i wlan0 -v -w /data/chan149.pcap 生成…...

React 设计艺术:如何精确拆分组件接口,实现接口隔离原则

接口隔离原则 接口隔离原则&#xff08;Interface Segregation Principle&#xff0c;简称 ISP&#xff09;也是面向对象设计中的重要原则之一。它的核心思想是&#xff0c;一个类不应该依赖它不需要的接口。在 React 开发中&#xff0c;遵循接口隔离原则可以提高代码的可维护性…...

BFS DFS ----习题

题目1 答案1 #include <bits/stdc.h>using namespace std;const int N 210; int n,k; int arr[N]; int res 0;void dfs(int x,int start,int nowsum) {if (nowsum > n) return ;if(x>k){if(nowsum n) res;return ;}for(int i start;nowsumi*(k-x1)<n;i){a…...

第十七届“华中杯”大学生数学建模挑战赛题目A题 晶硅片产销策略优化 完整成品 代码 模型 思路 分享

近年来&#xff0c;高纯度晶硅片需求的增长引发了更激烈的市场竞争。晶硅片企业需要在成本控制、利润优化和供需管理之间取得平衡&#xff0c;以提高经营效率和市场竞争力。晶硅片的生产是一个高能耗、高成本的过程&#xff0c;企业效益会受到原材料价格波动、市场需求变化以及…...

java 设计模式之单例模式

简介 单例模式&#xff1a;一个类有且仅有一个实例&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有一个对象被创建。 特点&#xff1a;类构造器私有、持有自己实例、对外提供获取实例的静态方法。 单例模式的实现方式 饿汉式 类被加载时&#xff0c;就会实例…...

新能源汽车能量流测试的传感器融合技术应用指南

第一部分&#xff1a;核心原理模块化拆解 模块1&#xff1a;多源传感器物理层融合 关键技术&#xff1a; 高精度同步采集架构 采用PXIe-8840控制器同步定时模块&#xff08;NI PXIe-6674T&#xff09;&#xff0c;实现CAN/LIN/模拟量信号的μs级同步光纤电压传感器&#xff0…...

高级java每日一道面试题-2025年4月11日-微服务篇[Nacos篇]-Nacos使用的数据库及其数据同步机制是什么?

如果有遗漏,评论区告诉我进行补充 面试官: Nacos使用的数据库及其数据同步机制是什么&#xff1f; 我回答: Nacos 使用的数据库及其数据同步机制详解 在微服务架构中&#xff0c;Nacos 作为服务注册与配置管理的核心组件&#xff0c;其数据存储和同步机制对系统的高可用性和…...

音视频相关协议和技术内容

视频编解码&#xff1a; H264&#xff08;AVC,MPEG-4 Part 10&#xff09; 高压缩率&#xff0c;支持多种分辨率和帧率&#xff0c;用于在线流媒体、会议、数字电视 编码过程&#xff1a; 分块处理&#xff0c;将视频帧划分为宏块&#xff08;16x16&#xff09;使用帧预测和…...

SpringBoot整合Rabbitmq(包括docker配置Rabbitmq的详细过程)

一、什么是mq MQ(message queue)&#xff0c;从字面意思上看就个 FIFO 先入先出的队列&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;它是一种具有接收数据、存储数据、发送数据等功能的技术服务。 在互联网架构中&#xff0c;MQ 是一种非常常见的上下游“逻…...

20个常用的初级Java笔试题及其参考答案

### 1. Java基本数据类型有哪些? - **答案**:Java中的基本数据类型有: - `byte`:8位 - `short`:16位 - `int`:32位 - `long`:64位 - `float`:32位 - `double`:64位 - `char`:16位(Unicode字符) - `boolean`:表示真或假(没有固定大小) ### 2. Java中的字符串是可…...

矫平机:工业制造的精密“雕刻师”

在金属加工的浩瀚图景中&#xff0c;矫平机犹如一位沉默的雕塑大师&#xff0c;用机械的精准与科学的智慧&#xff0c;将扭曲变形的板材重塑为工业艺术的杰作。从新能源电池极片到空间站耐压舱体&#xff0c;矫平工艺贯穿现代制造的每一处精度巅峰。 一、核心技术&#xff1a;从…...

游戏数据分析,力扣(游戏玩法分析 I~V)mysql+pandas

力扣的游戏玩法分析 I~V&#xff0c; ps&#xff1a;虽然表结构不变但是力扣输入示例数据有些许变化&#xff0c;所以你使用上一题的数据跑下一题的代码可能产生的结果和示例中的不一样&#xff0c;建议点击连接到力扣中直接运行&#xff01; 目录 1. 游戏玩法分析 I mysql …...

C++之哈希

目录 一、unordered_set 1.1、unordered_set的介绍 1.2、unordered_set和set的使用差异 二、unordered_map 2.1、unordered_map和map的差异 2.2、unordered_multimap/unordered_multiset 三、哈希表 3.1、哈希概念 3.1.1、直接定地址法 3.1.2、哈希冲突 3.1.3、负载…...

DSP、MCU、FPGA 的详细总结

一、核心定义与特点 类型定义核心特点DSP&#xff08;数字信号处理器&#xff09;专为高速数字信号处理设计的处理器- 哈佛架构&#xff0c;单周期乘加&#xff08;MAC&#xff09; - 实时性强&#xff0c;低延迟处理流式数据 - 专用指令集优化算法&#xff08;如FFT、滤波&am…...

linux学习 3.用户的操作

用户 建议在系统操作的时候不要一直使用root用户&#xff0c;因为root用户具有最高权限&#xff0c;你可能因为某些操作影响了你的系统&#xff0c;采用子用户则可以避免这一点 这里的学习不用太深入&#xff0c;掌握如何创建删除切换即可(除非你要做详细的用户管理&#xff0…...

闭坑-- `a-auto-complete` 组件中的 `options` 数据存在重复

当 ant-design 的 a-auto-complete 组件中的 options 数据存在重复时&#xff0c;可能会导致以下问题&#xff1a; 1. 交互问题 键盘导航失效&#xff1a; 使用键盘上下键选择时&#xff0c;可能会在重复项之间跳转&#xff0c;无法正常移动到下一个选项。选择结果不准确&…...

【Rust基础】使用Rocket构建基于SSE的流式回复

背景 我们正在使用Rust开发基于RAG的知识库系统&#xff0c;其中对于模型的回复使用了常用的SSE&#xff0c;Web框架使用Rocket&#xff0c;Rocket提供了一个简单的方式支持SSE&#xff0c;但没有会话保持、会话恢复等功能&#xff0c;因此我们自己简单实现这两个功能。 使用R…...

一种改进的CFAR算法用于目标检测(解决多目标掩蔽)

摘要 恒虚警率&#xff08;CFAR&#xff09;技术在雷达自动检测过程中起着关键作用。单元平均&#xff08;CA&#xff09;CFAR算法在几乎所有的多目标情况下都会受到掩蔽效应的影响。最小单元平均&#xff08;SOCA&#xff09;CFAR算法仅当干扰目标位于参考窗口的前后方时才具有…...

什么是人工智能芯片?

行业专家指出&#xff0c;许多智能设备和物联网设备都是由某种形式的人工智能(AI)驱动的——无论是语音助理、面部识别摄像头&#xff0c;还是电脑。这些设备需要采用某种技术为它们进行的数据处理提供支持。有些设备需要在云平台的大型数据中心处理数据&#xff0c;而也有一些…...