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

C++ 嵌套类 (详解 一站式讲解)

目录

嵌套类

嵌套类的定义

嵌套类结构的访问权限

pimpl模式(了解)


嵌套类

嵌套类的定义

首先介绍两个概念:

  • 类作用域(Class Scope)

类作用域是指在类定义内部的范围。在这个作用域内定义的成员(包括变量、函数、类型别名等)可以被该类的所有成员函数访问。类作用域开始于类定义的左花括号,结束于类定义的右花括号。在类作用域内,成员可以相互访问,无论它们在类定义中的声明顺序如何。

  • 类名作用域(Class Name Scope)

类名作用域指的是可以通过类名访问的作用域。这主要用于访问类的静态成员嵌套类型。类名必须用于访问静态成员或嵌套类型,除非在类的成员函数内部,因为它们不依赖于类的任何特定对象。以静态成员为例:

class MyClass
{
public:void func(){_b = 100;//类的成员函数内访问_b}static int _a;int _b;
};
//静态成员要定义在类外,因为静态成员是一个类所共有的,如果声明在类中,每创建一个类对象就会生成一个静态数据成员
int MyClass::_a = 0;void test0(){//这里静态数据成员为公有所以可以在类外通过类名直接访问MyClass::_a = 200;//类外部访问_a
}

在函数和其他类定义的外部定义的类称为全局类,绝大多数的 C++ 类都是全局类。我们在前面定义的所有类都在全局作用域中,全局类具有全局作用域。

与之对应的,一个类A还可以定义在另一类B的定义中,这就是嵌套类结构。A类被称为B类的内部类,B类被称为A类的外部类

以Point类和Line类为例

class Line
{
public:class Point{public:Point(int x,int y): _ix(x), _iy(y){}private:int _ix;int _iy;};
public:Line(int x1, int y1, int x2, int y2): _pt1(x1,y1), _pt2(x2,y2){}
private: Point _pt1;Point _pt2;
};

Point类是定义在Line类中的内部类,无法直接创建Point对象,需要在Line类名作用域中才能创建,因为point类在line类中,只能先找到line类在访问point类

Point pt(1,2);//error
Line::Point pt2(3,4);//ok

Point类是Line类的内部类,并不代表Point类的数据成员会占据Line类对象的内存空间,在存储关系上并不是嵌套的结构

只有当Line类有Point类类型的对象成员时,Line类对象的内存布局中才会包含Point类对象(成员子对象)。

(1)如果Line类中没有Point类的对象成员,sizeof(Line) = 8;

(2)如果Line类中有两个Point类的对象成员,sizeof(Line) = 24;

思考,如果想要使用输出流运算符输出Line对象,应该怎么实现?(重要)

最直观的实现方式是定义一个运算符重载函数,但在函数体中需要让输出流运算符处理Point类型对象,所以还需要为Point类准备一个输出流运算符重载函数。

—— 如果Point定义在Line的私有区域

那么还需要将operator<<函数声明为Line的友元函数

下面为测试代码,可自行测试

#include <iostream>
using namespace std;
class Line
{
public:class Point {public:Point(int x, int y): _ix(x), _iy(y){}friend ostream& operator<<(ostream& os, const Line::Point& rhs);private:int _ix;int _iy;};
public:Line(int x1, int y1, int x2, int y2): _pt1(x1, y1), _pt2(x2, y2){}~Line() {//cout << "~Line()" << endl;}friend ostream& operator<<(ostream& os, const Line& rhs);friend ostream& operator<<(ostream& os, const Point& rhs);private:Point _pt1;Point _pt2;
};//这里会访问line的私有成员point所以在line类中声明为友元,因为又要访问point对象的数据成员,
//所以又要将这个函数声明为内部类的友元
ostream& operator<<(ostream& os, const Line::Point& rhs)
{os << "(" << rhs._ix << "," << rhs._iy << ")";return os;
}//因为是输出运算符重载,不会对操作数进行修改,倾向于声明为有友元类
ostream& operator<<(ostream & os, const Line & rhs)
{os << rhs._pt1 << "------->" << rhs._pt2;return os;
}
void test()
{Line ll(1, 2, 3, 4);cout << ll << endl;
}
int main()
{test();return 0;
}

嵌套类结构的访问权限

外部类对内部类的成员进行访问

内部类对外部类的成员进行访问

image-20240304153639911

内部类相当于是定义在外部类中的外部类的友元类

类A定义在类B中,那么类A访问类B的成员时,就相当于默认的是类B的友元类。

下面为测试代码,可以自行测试

#include <iostream>
using namespace std;
class Line
{
public:class Point {public:Point(int x, int y): _ix(x), _iy(y){}friend ostream& operator<<(ostream& os, const Line::Point& rhs);void print(){cout << "print" << endl;}friend class Line;void getline(const Line& rhs){//在内部类中不需要友元声明,可以直接通过line对象直接访问成员rhs._pt1;rhs._pt2;//通过类名作用域直接访问line的私有静态成员Line::_pt3;//直接用成员名访问line的私有静态数据成员_pt3;}private:int _ix;int _iy;static int _iz;};
public:Line(int x1, int y1, int x2, int y2): _pt1(x1, y1), _pt2(x2, y2){}~Line() {//cout << "~Line()" << endl;}friend ostream& operator<<(ostream& os, const Line& rhs);friend ostream& operator<<(ostream& os, const Point& rhs);void getpoint(){//在外部类中通过内部类访问内部类的公有成员_pt1.print();//ok//外部类属于内部类的类定义之外,这里是在内部类的私有数据成员//在外部类中通过内部类对象访问内部类的私有成员//_pt1._ix;//需要声明友元Point::_iz;//因为为私有,所以需要友元声明//_ix;不可能实现//_iy;同上}
private:Point _pt1;Point _pt2;static double _pt3;
};
//要在外部类的外面对内部类的静态成员进行定义
int Line::Point::_iz = 10;
double Line::_pt3 = 100;
//这里会访问line的私有成员point所以在line类中声明为友元,因为又要访问point对象的数据成员,
//所以又要将这个函数声明为内部类的友元
ostream& operator<<(ostream& os, const Line::Point& rhs)
{os << "(" << rhs._ix << "," << rhs._iy << ")";return os;
}//因为是输出运算符重载,不会对操作数进行修改,倾向于声明为有友元类
ostream& operator<<(ostream & os, const Line & rhs)
{os << rhs._pt1 << "------->" << rhs._pt2;return os;
}
void test()
{Line ll(1, 2, 3, 4);cout << ll << endl;
}
int main()
{test();return 0;
}

pimpl模式(了解)

实际项目的需求:希望Line的实现全部隐藏,在源文件中实现,再将其打包成库文件,交给第三方使用。

(1)头文件只给出接口:

//Line.hpp
class Line{
public:Line(int x1, int y1, int x2, int y2);~Line();void printLine() const;//打印Line对象的信息
private:class LineImpl;//类的前向声明LineImpl * _pimpl;
};

(2)在实现文件中进行具体实现,使用嵌套类的结构(LineImpl是Line的内部类,Point是LineImpl的内部类),Line类对外公布的接口都是使用LineImpl进行具体实现的

在测试文件中创建Line对象(最外层),使用Line对外提供的接口,但是不知道具体的实现

//LineImpl.cc
class Line::LineImpl
{class Point{public:Point(int x,int y): _ix(x), _iy(y){}//...private:int _ix;int _iy;};//...
};//Line.cc
void test0(){Line line(10,20,30,40);line.printLine();
}

(3)打包库文件,将库文件和头文件交给第三方

sudo apt install build-essential
g++ -c LineImpl.cc
ar rcs libLine.a LineImpl.o生成libLine.a库文件
编译:g++ Line.cc(测试文件) -L(加上库文件地址) -lLine(就是库文件名中的lib缩写为l,不带后缀)
此时的编译指令为 g++ Line.cc -L. -lLine

内存结构

pimpl模式是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类的实现细节(一般是通过私有的非虚成员)放在一个单独的实现类中,在可见类中通过一个私有指针来间接访问该类型。

好处:

  1. 实现信息隐藏;

  2. 只要头文件中的接口不变,实现文件可以随意修改,修改完毕只需要将新生成的库文件交给第三方即可;

  3. 可以实现库的平滑升级。

下面为测试代码,可自行测试

//LineImpl.cc#include <iostream>
#include "Line.hpp"
using namespace std;
// 这是一个实现文件,不用包含测试,只需要实现头文件中的函数等内容
//先对成员类型进行实现
class Line::LineImpl
{
public:class Point{public:Point(int x,int y): _ix(x), _iy(y){}~Point(){cout << "~Point()" << endl;}void print(){cout << "("<<_ix << "," << _iy << ")";}private:int _ix;int _iy;};
public:LineImpl(int x1, int y1, int x2, int y2): _pt1(x1,y1), _pt2(x2,y2){cout << "LineImpl(int *4)" << endl;}~LineImpl(){cout << "~LineImpl()" << endl;}void printline(){_pt1.print();cout << "-----> ";_pt2.print();cout << endl;}
private: Point _pt1;Point _pt2;
};Line::Line(int x1, int y1, int x2, int y2):_pimpl(new LineImpl(x1,y1, x2,y2))
{cout << "Line(int * 4)" << endl;
}
Line :: ~Line()
{cout << "~Line()" << endl;if(_pimpl){delete _pimpl;_pimpl = nullptr;}
}
void Line::printLine() const{_pimpl->printline();
}// test.cc#include "Line.hpp"
#include <iostream>
using std::cout;
using std::endl;void test()
{Line ll(1,2,3,4);ll.printLine();
}int main()
{test();return 0;
}//Line.hpp#ifndef _Line_HPP_
#define _Line_HPP_class Line {
public:Line(int x1, int y1, int x2, int y2);~Line();//提供给客户使用的功能void printLine() const;//打印Line对象的信息
private:class LineImpl;//类的前向声明LineImpl* _pimpl;
};#endif

相关文章:

C++ 嵌套类 (详解 一站式讲解)

目录 嵌套类 嵌套类的定义 嵌套类结构的访问权限 pimpl模式&#xff08;了解&#xff09; 嵌套类 嵌套类的定义 首先介绍两个概念&#xff1a; 类作用域&#xff08;Class Scope&#xff09; 类作用域是指在类定义内部的范围。在这个作用域内定义的成员&#xff08;包括…...

EasyCVR视频汇聚平台助力大型生产监控项目摄像机选型与应用

一、方案背景 在300路大型生产监控项目中&#xff0c;由于生产环境复杂多样&#xff0c;涵盖室外厂区、大型车间、室内办公区域等不同场景&#xff0c;单一类型的摄像机难以满足全方位、精细化的监控需求。EasyCVR作为一款功能强大的视频融合管理平台&#xff0c;具备灵活的视…...

解决leensa无法使用的办法:平替教程

Leensa已经完全连不上&#xff0c;并显示超时&#xff0c;至于之前有传言称他们会恢复服务也完全是无稽之谈。 那么&#xff0c;Leensa停止服务后&#xff0c;广大的外贸人&#xff0c;设计人&#xff0c;留学生以及技术人学习&#xff0c;查资料以及开发客户该怎么办呢&#…...

算法思想之哈希表

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之哈希表 发布时间&#xff1a;2025.4.28 隶属专栏&#xff1a;算法 目录 算法介绍哈希表作用什么时候使用哈希表怎么使用哈希表 例题两数之和题目链接题目描述算法思路代码实现 判定是否互为字符重排题目链…...

springboot 视频分段加载在线播放

页面访问视频资源 前端播放加载部分视频,每次选中一个时间点后 往后加载一部分视频,主要用以节省网络传输的数据量 通过ResourceHttpRequestHandler类实现&#xff0c;ResourceHttpRequestHandler支持分片加载&#xff0c;前端请求头中携带Range: bytes 0-10001&#xff0c;就…...

【题解-Acwing】868. 筛质数

题目:868. 筛质数 题目描述 给定一个正整数 n,请你求出 1∼n 中质数的个数。 输入 共一行,包含整数 n。 输出 共一行,包含一个整数,表示 1∼n 中质数的个数。 数据范围 1 ≤ n ≤ 106 时空限制 0.2s / 64MB 输入样例 8输出样例 4代码 #include...

java 和 C#操作数据库对比

Java和C#在操作数据库方面有诸多相似之处&#xff0c;但也存在一些差异&#xff0c;以下从几个方面为你进行对比&#xff1a; 数据库连接 Java 在Java中&#xff0c;使用JDBC&#xff08;Java Database Connectivity&#xff09;来连接数据库。连接数据库的步骤通常包括加载…...

用 Python打造交互式图片-音视频管理器:代码分析与实践

在 Python 的 GUI 开发领域&#xff0c;wxPython 是一个功能强大且跨平台的框架&#xff0c;适合快速构建桌面应用程序。本文将深入分析一个基于 wxPython 的交互式图片管理器项目&#xff08;SelectModelToPlayVideoAndAudio.py&#xff09;&#xff0c;该程序允许用户管理图片…...

Django 缓存框架

动态网站的一个基本权衡是它们是动态的。每当用户请求页面时&#xff0c;Web 服务器进行各种计算&#xff0c;从数据库查询到模板渲染到业务逻辑&#xff0c;以创建您网站访问者看到的页面。从处理开销的角度来看&#xff0c;这比标准的从文件系统中读取文件的服务器安排要昂贵…...

后缀数组~

子串&#xff1a;在字符串s中&#xff0c;取任意i<j,那么在s中截取从i到j的这一段就叫做s的一个子串。 后缀&#xff1a;后缀就是从字符串的某个位置i到字符串末尾的子串&#xff0c;我们定义以s的第i个字符为第一个元素的后缀为suff(i)。 suff(1)就是从第一个字符到最后一个…...

Rust 学习笔记:编程练习(一)

Rust 学习笔记&#xff1a;编程练习&#xff08;一&#xff09; Rust 学习笔记&#xff1a;编程练习&#xff08;一&#xff09;Convert temperatures between Fahrenheit and CelsiusGenerate the nth Fibonacci numberPrint the lyrics to the Christmas carol “The Twelve …...

【基础知识】常见的计算公式(一)

目录标题 定时器相关公式1. 定时器分频系数计算2. 定时器定时时间计算 波特率相关公式1. 异步串行通信波特率计算 PWM 相关公式1. PWM 占空比计算 不知道你们是不是和我一样,对定时器中的分频系数相关的计算公式,波特率计算公式等,都有点心生畏惧,其核心原因是不清楚不了解,没有…...

【AI生产力工具】Windsurf,一款AI编程工具

Windsurf 是 Codeium 公司推出的一款 AI 编程助手,它是一款集成深度上下文感知、多模型协作和实时代码管理的综合开发环境(IDE)。 Windsurf 作为 AI 编程工具的核心价值在于 “上下文感知 + 多模型协作 + 自动化工作流”,其深度集成的智能体系统(如 Flows 和 Cascade)正…...

【网络原理】TCP提升效率机制(三):延时应答和捎带应答

目录 一. 延时应答 二. 捎带应答 一. 延时应答 延时应答也是基于滑动窗口的一种提升传输效率的方式&#xff08;减少ACK数量&#xff09; 接收方收到数据之后&#xff0c;不会立刻返回一个ACK确认报文&#xff0c;而是等一会再返回ACK报文 这样做的好处&#xff1f; 1&…...

Golang|分布式索引架构

当文档数量巨大时&#xff0c;如一亿个文档&#xff0c;倒排索引难以全部放入单机内存。正排索引将热数据和冷数据分别存储在内存和磁盘中。分布式搜索引擎将数据分布在不同服务器上以应对大量数据。 倒排索引的水平切分 水平切分按关键词划分数据&#xff0c;如JAVA和算法在A服…...

【蓝桥杯省赛真题58】Scratch画台扇 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch画台扇 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C资料 scratch画台扇 第十五届青少年蓝桥杯scratch编程省赛真题解析 一…...

WebRTC SDK是什么?

​语音环境每年都在变&#xff0c;OKCC以前代理商的客群都是简单高效外呼为主&#xff0c;今年发现变化很大。很多代理商做的终端客户都是给其他业务系统赋能为主了。主流的还是以API对接为主&#xff0c;但是对接中发现webrtc SDK使用频率很高。 ​ ​那么什么是WebRTC SDK…...

反向代理、负载均衡与镜像流量:原理剖析、区别对比及 Nginx 配置实践

在现代网络架构中&#xff0c;反向代理、负载均衡和镜像流量是保障系统高效、稳定、安全运行的关键技术。虽然它们都涉及网络流量的管理与分发&#xff0c;但在功能、应用场景和实现方式上有着显著差异。本文将深入探讨三者的区别&#xff0c;并结合 Nginx 这一强大的开源服务器…...

PyCharm 2023升级2024 版本

windows下把老版本卸载之后&#xff0c;需要把环境变量&#xff0c;注册表信息删除。 并且把C:\Users\用户\AppData 文件夹下的 Local\JetBrains和Roaming\JetBrains 都删除&#xff0c;再重新安装 原旧项目升级的方式&#xff1a; 1.2023虚拟机的文件夹是venv 改为.venv…...

for(auto it: vec)和for(auto it: vec)的区别以及使用场景

目录 1.for(auto it: vec) 2.for(auto& it: vec) 3.总结 在 C 里&#xff0c;for(auto it: vec) 和 for(auto& it: vec) 都属于基于范围的 for 循环&#xff0c;可用于遍历容器&#xff08;像 std::vector、std::list 等&#xff09;或者数组。不过&#xff0c;它们…...

系统思考提升培训效能

彼得德鲁克曾说&#xff1a;管理者的价值&#xff0c;不在于处理了多少事务&#xff0c;而在于创造了多少不可替代的成果。效率是以正确的方法做事&#xff0c;效能则是做正确的事。在系统思考中我们看到&#xff1a;效率往往是对单点问题的反应&#xff0c;而效能则是对整体系…...

第1篇:Egg.js框架入门与项目初始化

一、Egg.js框架优势与设计理念 1. 为什么选择Egg.js&#xff1f; 作为基于Koa 2.x的渐进式企业级框架&#xff0c;Egg.js在阿里系大规模生产环境中验证成熟&#xff0c;具备以下核心优势&#xff1a; 约定优于配置 通过app/config目录结构自动加载机制&#xff0c;减少冗余配置…...

CMU-15445(1)——环境搭建

前言 最近在找完暑期实习之后&#xff0c;终于有了一些干项目外的空余时间学习新的知识&#xff0c;在这么多轮面试中&#xff0c;数据库的考察非常多&#xff0c;但孱弱的数据库基础导致我有很多次面试被问住&#xff0c;因此我希望在学习CMU-15445&#xff08;Fall 2024&…...

Web基础与HTTP协议

目录 一&#xff1a;Web基础 1.域名和dns 1.1域名的概念 &#xff08;1&#xff09;域名的结构 &#xff08;2&#xff09;域名结构类型 2.Hosts文件 &#xff08;1&#xff09;hosts文件的作用 &#xff08;2&#xff09;修改hosts文件 3.DNS 4.域名注册 &#xff0…...

数量关系7_行程问题

目录 一、基础行程1. 基础行程2. 比例法运用3. 相遇追及二、特殊情境1. 多次相遇问题(简单)2. 流水问题3. 火车过桥4. 等距离平均速度问题(简单)5. 匀加速一、基础行程 1. 基础行程 公式1:S = Vt 公式2:平均速度=(2 V1V2) / (V1+V2) 例题3(2023 广东) 某地举办了“铁…...

MTK Android12-13 App卸载加锁

实现&#xff1a;App 卸载时候需要加一层拦截锁&#xff0c;客户输入密码后才能正常卸载 文章目录 参考资料&#xff1a;实现方案涉及到修改文件修改方案实现效果 源码分析- 卸载方式一&#xff09; 设置界面进行卸载InstalledAppDetailsAppInfoDashboardFragmentAppButtonsPre…...

文号验证-同时对两个输入框验证

文号验证-同时对两个输入框验证 效果&#xff1a; 一、如果有多个文号&#xff1a; <div v-for"(item, index) in approvalForm.productApprovalTypeEvents" :key"index"> <el-form-itemlabel"文号":prop"productApprovalTypeEv…...

嵌入式面试八股文(十二)·FreeRTOS中·堆和栈

目录 1. 堆和栈 1.1 堆 1.2 栈 1.3 堆和栈的区别 1.3.1 分配方式 1.3.2 分配效率 1.3.3 生长方向 1.3.4 空间管理 1.3.5 存放内容 1. 堆和栈 1.1 堆 堆是一块用于动态分配内存的区域&#xff0c;用于存储程序运行时动态创建的对象。堆的大小可以在程序运行…...

表的增删改查

目录 1、增删改查&#xff08;CRUD&#xff09; 2、新增&#xff08;C&#xff09; 3、查询&#xff08;R&#xff09; 3.1、全列查询 3.2、指定列查询 3.3、查询字段为表达式 3.4、别名 3.5、去重&#xff1a;distinct 3.6、查询时排序 1、增删改查&#xff08;CRUD&…...

软考-软件设计师中级备考 4、数据结构

1、数据结构三要素 要素定义分类特点逻辑结构数据元素之间的逻辑关系&#xff0c;是从具体问题抽象出来的数学模型&#xff0c;与数据存储无关1. 集合结构&#xff1a;数据元素同属一个集合&#xff0c;无其他特殊关系 如一盒麦丽素豆子 2. 线性结构&#xff1a;元素存在一对…...

CMake:设置编译C++的版本

CMake提供了CMAKE_CXX_STANDARD用于设置C++的版本,比如可以通过如下方式设置使用C++23 set(CMAKE_CXX_STANDARD 23) 同时也提供了CMAKE_CXX_STANDARD_REQUIRED可以要求强制使用某个C++版本,比如: set(CMAKE_CXX_STANDARD_REQUIRED ON) 如果设置为 `ON`,那么 CMake 会要求编…...

【angular19】入门基础教程(一):项目的搭建与启动

angular现在发展的越来越能完善了&#xff0c;在vue和react的强势竞争下&#xff0c;它迎来了自己的巨大变革。项目工程化越来越好&#xff0c;也开始拥抱了vite这种高效的构建方式。所以&#xff0c;我们有必要来学习这么一个框架了。 项目实现效果 nodejs环境 Node.js - v^…...

在使用Python的Selenium库打卡网页后,通过CDP命令获取所有cookies(包括Httponly和Secure的cookies)

通过 Chrome DevTools Protocol (CDP) 结合 Selenium 可以直接获取浏览器存储的所有 Cookies&#xff08;包括所有域名下的 Cookies&#xff09;&#xff0c;以下是详细步骤&#xff1a; 步骤 1&#xff1a;配置 Chrome 启用 CDP启动 Chrome 浏览器时需启用远程调试端口&#…...

Deepseek-v3+cline+vscode java自动化编程

1、Deepseek DeepSeek 充值后&#xff0c;创建apikey 2、vscode Visual Studio Code - Code Editing. Redefined 3、下载插件cline 4、配置deepeseek-v3 的密钥到cline 5、不可用 在开始的几次调用能正常使用起来&#xff0c;用了几次后&#xff0c;不能使用了&#xff0c;请求…...

5G育种技术之植物性状订制

行业展望 我国农作物种业市场规模逐年增长&#xff0c;其中以粮食作物种子市场规模较大。目前我国育种产业发展仍处于初级阶段&#xff0c;存在龙头企业市场占有率和行业集中度不高、企业育种技术和水平落后于发达国家、种企研发投入不足等问题。虽然基因编辑技术的出现有望改…...

12前端项目----添加购物车1.0

商品添加购物车 商品数量添加购物车浏览器本地存储localStoragesessionStorage添加成功页面 商品数量 输入为数字&#xff0c;最少为1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…...

Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!

作者&#xff1a;来自 Elastic Elastic Platform Team Elastic 最新发布的 8.18 和 9.0 版本包含了强大的更新&#xff0c;将显著提升你的体验、增强查询性能并优化日志管理。无论你是在处理搜索、可观察性还是安全用例&#xff0c;本次发布都带来了大量新特性&#xff0c;旨在…...

两地三中心

1. 什么是同城备份 ✅ 定义&#xff1a; 主机房和备份机房都在同一座城市&#xff0c;通常距离几十公里以内&#xff08;比如10-50公里&#xff09;。 ✅ 特点&#xff1a; 网络延迟很低&#xff08;毫秒级&#xff09;&#xff0c;可以做到实时同步/热备份。 恢复速度快&am…...

数据结构第七章(一)-顺序查找和折半查找

数据结构第七章&#xff08;一&#xff09; 顺序查找和折半查找一、查找1.平均查找长度&#xff08;ASL&#xff09; 二、顺序查找1.实现2.算法优化 三、折半查找1.实现2.查找判定树 四、分块查找1.算法思想2.查找效率分析&#xff08;ASL&#xff09; 总结 顺序查找和折半查找…...

springboot项目之websocket的坑:spring整合websocket后进行单元测试后报错的解决方案

前排提醒&#xff1a;还是博主菜&#xff0c;见识短浅&#xff0c;没遇到过这个问题。。。 起因 前段时间学习websocket和sse&#xff0c;写demo用了spring框架。后来又写了新的spring单元测试类demo去测试&#xff0c;结果启动后报错&#xff0c;报错信息提示websocket的相关…...

在单片机编程中充分使用抽象工厂模式,确保对象创建的限制,多使用抽象接口避免多变具体实现类

背景 在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的实现;具体编码时可以充分使用抽象工厂模式 举例进行详细讲解和说明抽象工厂模式在单片机开发中的应用 抽象工厂模式是一种创建型设计模式,它提供了一种方式,可以将一组相关的对象创建封装到一个…...

喷泉码技术在现代物联网中的应用的总结和参考文献

总结 物联网与 5G 技术高速发展,数据传输对可靠性和实时性提出严苛要求。前向纠错码是增强通信鲁棒性的关键,但平衡冗余资源开销与编解码效率的矛盾是核心难题。LT 码和 Raptor 码是无率码典型。理论上它们能达渐进最优性能,然而实际系统受数据包规模、计算资源等限制,其工…...

vuex与vuex-persistedstate 插件固化数据

一&#xff0c;vuex与vuex-persistedstate 插件固化数据 的小案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Vuex基础案例</title></head><body><div id"app"&…...

如何在WordPress网站中设置双重验证,提升安全性

随着互联网的不断进步&#xff0c;网站的安全问题越来越受到重视。尤其对于WordPress这样常用的建站平台&#xff0c;安全性显得尤为重要。尽管WordPress自带一定的安全性&#xff0c;但仅依靠用户名和密码的登录方式仍然存在风险。因此&#xff0c;启用“双重验证”便成为了提…...

2025系统架构师---基于规则的系统架构风格‌

引言 在业务规则频繁变更、决策逻辑高度动态化的现代企业环境中&#xff0c;‌基于规则的系统架构风格‌&#xff08;Rule-Based System Architecture Style&#xff09;通过将核心业务逻辑抽象为‌可配置规则‌、‌规则引擎‌与‌决策服务‌的分离&#xff0c;实现了业务敏捷…...

Python排序中lambda函数详解

在 Python 中&#xff0c;lambda 函数是一种匿名函数&#xff0c;通常用于需要一个函数但又不想为其定义一个正式名称的情况。在排序操作中&#xff0c;lambda 函数用于指定排序的依据。 lambda 函数的基本语法 lambda 函数的基本语法如下&#xff1a; lambda arguments: ex…...

web 基础与 http 协议

目录 一 Web 基础 1. 域名和 DNS 1.1 域名的概念 1.2 DNS 2. 网页与HTML 2.1 HTML 概述 2.2 HTML 基本标签 2.3 网站和主页 3. 静态网页与动态网页 3.1 静态网页 3.2 动态网页 二 HTTP 协议 1. HTTP 协议概述 2. HTTP 方法 3. HTTP 状态码 4. HTTP 请求流程分析…...

记一次奇妙的Oracle注入绕WAF之旅

0x01 一个登陆框 上班时遇到了一个登陆框 看着这个复古的界面&#xff0c;于是上手除了admin123456之外顺手点了个 于是弹出了一条有意思的报错 这就有意思了&#xff0c;毕竟已经很久没在登陆框遇到sql注入了&#xff0c;当我想当然的认为万能密码可以秒时&#xff0c;事情出…...

python裁剪小说封面标题

一张矩形图片 比如50*100 大小 中心点的坐标是是(0,0) 左上角是(-25,50) 右上角是(25,50) 左下角是(-25,-50) 右下角是(25,-50) 我希望你能用python,帮我对本地指定图片切割大小&#xff0c;计算出该图片的中心坐标&#xff0c;然后按照我输入的长宽具体值&#xff0c;比…...

高性价比手机如何挑选?

这四个关键点&#xff0c;助你找到心仪机~ 一、性能强者&#xff1a;游戏娱乐畅快到底 处理器相当于手机的 “大脑”&#xff0c;处理速度快、能力强&#xff0c;运行大型游戏毫无压力。 搭配上大容量运存&#xff0c;多任务切换也能秒速完成&#xff0c;再也不怕游戏卡顿啦。…...