C++课程笔记 类和对象
类概念
结构体:只要属性

类:有属性也有方法


c++可以省略struct c不行

#include<iostream>
using namespace std;typedef struct queue1
{int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a = qa;}
}q1;
int main()
{queue1 Q1;queue1 Qt=Q1.q();cout << Qt.q().a<<endl;q1 Q2(2);cout << Q1.a<<endl;cout << Q2.a;
}

struct内部成员默认公有,class默认私有。
public private不分上下
声明定义分离原因:
方便代码阅读
Q1.h:
#include<iostream>
#include<stdbool.h>
using namespace std;
class Cycle
{
public :void Init(int n = 4);int getr();
private:int r;
};class Point
{
public:void Init(int a = 4,int b=4);int geta();int getb();
private:int a;int b;
};
void ifin(Cycle& c, Point& p);
源.cpp:
#define _CRT_SECURE_NO_WARNINGS 1
#include"Q1.h"
void Cycle::Init(int n) {r = n;
}
int Cycle::getr() {return r;
}
void Point::Init(int m, int n)
{a = m;b = n;
}
int Point::geta() {return a;
}
int Point::getb() {return b;
}
void ifin(Cycle& c,Point& p)
{int d1 = p.geta() * p.geta() + p.getb() * p.getb();int d2 = c.getr() * c.getr();if (d1 > d2){cout << "不在" << endl;}if (d1 <= d2){cout << "在" << endl;}return;
}
test.cpp
#include"Q1.h"int main()
{Cycle c1;Point p1;ifin(c1, p1);
}


类和对象存储:


成员方法存储在公共区方法


成员变量按结构体空间计算



只有成员函数的类大小都是1
构造函数
构造函数完成初始化
class Date {
public:Date(int year, int month){_year = year;_month = month;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{/Date d1(2019, 4);d1.print();
}

class Date {
public:Date(int year=2020, int month=2,int day=1){_year = year;_month = month;_day = day;}Date(){_year = 2019;_month = 2;_day = 1;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2021);d1.print();
}
class Date {
public:Date(int year=2020, int month=2,int day=1){_year = year;_month = month;_day = day;}Date(){/* _year = 2019;_month = 2;_day = 1;*/}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.print();
}

全缺省构造可代替无参构造

class Stack
{
public:Stack(int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = 4;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;
};
int main()
{Stack s;s.Push(1);s.Push(2);s.Print();
}




class A {
public:A(){_a = 1;cout << "A()构造函数" << endl;}
private:int _a;
};
class Date {
public:/*Date(int year=2020, int month=2,int day=3){_year = year;_month = month;_day = day;}*///Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;A _A;
};
int main()
{Date d1;return 0;
}

默认构造函数内置类型不处理,自定义类型使用自定义类型默认构造函数。

用栈实现队列中,此类就不用写MyQueue构造函数,可以用MyQueue默认生成的,调用Stack默认构造函数。
释放时也会调用Stack默认析构函数,内置类型同样不会处理,自定义类型调用默认析构函数。
class Stack
{
public:Stack(int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = 4;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;A _A;
};
class MyQueue {private:Stack s1;
};
int main()
{MyQueue m1;return 0;
}



自定义类型构造被内置类型扰乱了

可以用一下c++11特性解决

class Date {
public:/*Date(int year=2020, int month=2,int day=3){_year = year;_month = month;_day = day;}*///Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};

不传参数就能调用的构造函数是默认构造





析构函数


malloc手动free后销毁
~Stack(){free(_a);_a = nullptr;_top = 0;_capacity = 0;}
return时调用析构函数

拷贝构造


class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
void Func1(Date d)
{cout << "Func1" << endl;
}
void Func2(Date& d) {cout << "Func2" << endl;}
int main()
{Date d1;Func1(d1);Func2(d1);return 0;
}
只要Func1调用了拷贝构造



拷贝构造前加const 为了避免错误更改原先对象


class Stack
{
public:Stack(int top,int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = capacity;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;A _A;
};
int main()
{Stack s(4,4);Stack s2(s);return 0;
}
默认拷贝构造是浅拷贝,函数释放后会free两次,会报错

自定义深拷贝:
class Stack
{
public:Stack(int top,int capacity = 4){_a = (int*)malloc(sizeof(int) * capacity);cout << "Stack 构造" << endl;if (_a == nullptr){perror("malloc fail");exit(-1);}_top = 0;_capacity = capacity;}Stack(const Stack& s){_a = (int*)malloc(sizeof(int) * s._capacity);{if (_a == nullptr){perror("malloc fail");exit(-1);}}memcpy(_a, s._a, sizeof(int) * s._top);_top = s._top;_capacity = s._capacity;}~Stack(){cout << "Stack 析构" << endl;free(_a);_a = nullptr;_top = 0;_capacity = 0;}void Push(int t){_a[_top++] = t;}void Print(){for (int i=0;i<_top;i++){cout << _a[i] << endl;}}
private:int* _a;int _top;int _capacity;//A _A;
};
int main()
{Stack s(0,4);s.Push(1);s.Push(2);s.Print();Stack s2(s);return 0;
}


不用写拷贝构造:

运算符重载


class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void print(){cout << _year << " " << _month << " " << _day << endl;}bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
int main()
{Date d1(2019,3,2);Date d2(2020, 4, 3);cout << (d1 == d2) << endl;//加括号避免运算符优先级问题return 0;
}
![]()
在 C++ 中,运算符重载函数
bool operator==(const Date& d)只需要一个参数的原因是,它实际上是在定义一个成员函数。成员函数隐含地有一个指向当前对象(即this指针)的参数,因此只需要提供与当前对象进行比较的另一个Date对象作为参数。具体解释:
隐含的
this指针: 当你在类内部定义一个成员函数时,这个函数可以访问类的成员变量和成员函数。每个成员函数都有一个隐含的this指针,它指向调用该函数的对象。operator==作为成员函数时,隐含的this指针会指向调用==运算符的那个对象。例如,假设有两个
Date对象d1和d2,当你写d1 == d2时,编译器实际上会将其转换为d1.operator==(d2)。此时,this指针指向d1,而d2作为参数传递给operator==函数。参数个数:
成员函数重载: 对于成员函数形式的运算符重载,
==只需要一个参数,因为this指针隐式地传递了调用该运算符的对象。
bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}bool 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 operator >=(const Date& d){

计算日期程序:
class Date {
public:Date(int year=2019, int month=2,int day=3){_year = year;_month = month;_day = day;}Date(const Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}//Date()//{///* _year = 2019;// _month = 2;// _day = 1;*///}int GetMonthDay(int year, int month){static int monthday[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 monthday[month];}Date operator+=(int day){_day = day + _day;int monthday = GetMonthDay(_year, _month);while (_day > monthday){++_month;if (_month == 13){_year++;_month = 1;}_day = _day - monthday;monthday = GetMonthDay(_year, _month);}return *this;}Date& operator+(int day){Date ret(*this);ret += (day);return ret;}void print(){cout << _year << " " << _month << " " << _day << endl;}bool operator ==(const Date& d){return _year == d._year && _month == d._month && _day == d._day;}bool 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 operator >=(const Date& d){return *this == d || *this > d;}
private:int _year=2019;int _month=3;int _day=3;A _A;
};
int main()
{Date d1(2024,9,10);Date d2(2019, 3, 2);cout << (d1 == d2) << endl;cout << (d1 > d2) << endl;cout << (d1 >= d2) << endl;d1 += 100000;Date d3(d1+10);return 0;
}


Date& operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;return *this;
//return d会出现权限放大}
int main()
{Date d1(2024,9,10);Date d2(2019, 3, 2);d1 = d2;return 0;
}

不显示写赋值重载,默认生成的,对自定义类型会浅拷贝


显示写重载,先释放,再开辟空间。
Stack& operator=(const Stack& s){if(this!=&s)
{free(_a);_a = (int*)malloc(sizeof(int) * s._capacity);if (_a == nullptr){perror("malloc fail");exit(-1);}memcpy(_a, s._a, sizeof(int)*s._top);_top = s._top;_capacity = s._capacity;return *this;
}}

运算符重载目的是让自定义类型对象可以用运算符。

this指针默认抢了第一个位置

![]()

在.h中定义的Print在两个cpp文件都有定义,链接符号表时出现问题
改成静态可以解决问题 不进符号表

声明定义分离也可以解决问题

.h没有定义,不会进符合表
内敛函数在调用的地方直接展开,也可以解决问题。

友元函数:
友元函数没有this指针。 在类中任意位置可以进行友元声明

可以不用去掉private

权限放大只出现在指针和引用上。

this指针默认是不能修改的。



初始化列表





_m不显示写构造,会调用默认构造
类C没有默认构造:

类C有默认构造:



i给rd引用 i给rd的是临时变量,临时变量具有常性。
加入explicit就不允许隐式类型转换发生了。




int N = 0;
class A {
public:A(int a):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}
private:int _a;
};
void Func(A a)
{}
int main()
{A a1(1);A a2 = 2;A a3 = a1;Func(a3);cout << N<<endl;
}
A a3=a1 构造+拷贝构造被优化成了拷贝构造

A::N,指定类域会到命名空间中找, 不指定会先到局部再到全局中找,找不到会报错。


class A {
public:A(int a=1):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}int GetN(){return N;}
private:int _a=1;static int N ;
};
int A::N = 0;
int main()
{A a1;A a2 = 2;A a3 = a1;//Func(a3);cout <<a3.GetN()<<endl;cout << a2.GetN() << endl;
}


应该n数组构造n个对象
友元类:
class Time {friend class Date;
public:Time(int hour=1, int minute=1, int second=1):_hour(hour), _minute(minute), _second(second){}
private:int _hour;int _minute;int _second;
};
class Date {
public:friend ostream& operator<<(ostream& out, const Date& d);friend istream& operator>>(istream& in, Date& d);Date(int year=2019, int month=1,int day=3){_year = year;_month = month;_day = day;}Date(const Date& d){cout << "拷贝构造" << endl;_year = d._year;_month = d._month;_day = d._day;}void SetTime(int hour, int minute, int second){_t._hour = hour;_t._minute = minute;_t._second = second;}private:int _year=2019;int _month=3;int _day=3;//A _A;Time _t;
};
内部类:

class A {
public:A(int a=1):_a(a){N++;cout << "A()构造函数" << endl;}A(const A& a):_a(a._a){N++;cout << "A()拷贝构造函数" << endl;}class B {public:void foo(){}};static int GetN(){return N;}
private:int _a=1;static int N ;
};
int main(){
A::B ab1;ab1.foo();
}
匿名对象:

创建完直接销毁

引用的话需要加const 因为传的是临时变量 具有常性
相关文章:
C++课程笔记 类和对象
类概念 结构体:只要属性 类:有属性也有方法 c可以省略struct c不行 #include<iostream> using namespace std;typedef struct queue1 {int a;queue1 q() {queue1 q(2);return q;};queue1(){}queue1(int qa){a qa;} }q1; int main() {queue1 Q1;…...
提问即创作:用Prompt提示词引领AI灵感爆发
文章目录 🍊AI内容创作的精髓:提示词Prompt1 什么是提示词工程?1.1 提示词是如何影响AI的输出结果?1.2 提示词的原理是什么1.3 提示词工程师的前景1.4 谁能成为提示词工程师?1.5 提示词的未来前景 2 提示词的基本书写技巧3 常见的提示词框架…...
一码空传临时网盘PHP源码,支持提取码功能
源码介绍 一码空传临时网盘源码V2.0免费授权,该源码提供了一个简单易用的无数据库版临时网盘解决方案。前端采用了layui开发框架,后端使用原生PHP编写,没有引入任何开发框架,保持了代码的简洁和高效。 这个程序使用了一个无数据…...
自然语言处理实战项目
自然语言处理实战项目 自然语言处理(NLP, Natural Language Processing)是人工智能的重要分支之一,致力于让计算机理解、生成并与人类进行语言交互。随着深度学习、神经网络和大数据的发展,NLP技术在近年来取得了飞跃性的进展&am…...
人工智能物联网的去中心化和分布式学习:全面综述、新兴挑战和机遇
这篇论文的标题是《Decentralized and Distributed Learning for AIoT: A Comprehensive Review, Emerging Challenges, and Opportunities》,作者是Hanyue Xu, Kah Phooi Seng, Li Minn Ang, 和 Jeremy Smith。论文发表在IEEE Access期刊上,接收日期为2…...
滑动窗口算法—最小覆盖子串
题目 ”最小覆盖子串“问题,难度为Hard,题目如下: 给你两个字符串 S 和 T,请你在 S 中找到包含 T 中全部字母的最短子串。如果 S 中没有这样一个子串,则算法返回空串,如果存在这样一个子串,则可…...
应用案例|开源 PolarDB-X 在互联网安全场景的应用实践
背景介绍 中盾数科集团始创于2012年,是由网络安全服务而发展起来的科技型、多元化的企业集团。旗下包括网络安全服务、信创一体化服务、箱式液冷、区块链、位置服务、视觉服务等六大板块,业务覆盖湖南、甘肃、贵州等多个省份。 业务挑战 中盾集团基于A…...
【大数据】MapReduce的“内存增强版”——Spark
【大数据】MapReduce的“内存增强版”——Spark 文章脉络 Spark架构 Spark-core SparkConf 和 SparkContext RDD Spark集群 Spark-sql 在大数据时代,数据处理和分析成为企业竞争的重要手段。Hadoop作为大数据处理的基石,其核心组件MapReduce在众多…...
o1模型:引领AI技术在STEM领域的突破与应用
o1模型是OpenAI最新推出的大型语言模型,它在多个领域展现出了卓越的能力,被认为是AI技术发展的一个重要里程碑。以下是对o1模型的详细介绍和分析: o1模型的简介和性能评估 o1模型在物理、化学、生物学等领域的基准任务上达到了博士生水平&…...
数据库系统 第57节 数据库迁移
数据库迁移是一个复杂的过程,涉及到将数据从一个数据库系统转移到另一个数据库系统。这个过程通常需要仔细规划和执行,以确保数据的完整性和可用性。以下是数据库迁移的一些关键方面: 数据迁移工具: 这些工具可以帮助自动化迁移过…...
【主机入侵检测】Wazuh规则详解
前言 Wazuh 规则是一组用XML格式编写的条件,它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用,用于在日志消息中检测特定的模式或行为,并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色,因为它们允许系…...
redis有序集合写入和求交集的速度
背景 团队小伙伴做了一个需求。大概的需求是有很多的图片作品,图片作品有一些类别,每个人进入到每个类别的作品业,根据权重优先查看权重最高的的作品,权重大概是基于每个人对该作品的浏览计算,浏览过的作品放在最后展…...
微服务之服务注册与发现:Etcd、Zookeeper、Consul 与 Nacos 比较
在微服务架构中,服务注册与发现是实现服务动态管理和负载均衡的关键。本文将对四款主流的服务注册与发现工具——Etcd、Zookeeper、Consul、Nacos进行深入对比,从功能、性能、一致性、生态集成、应用场景等多个维度展开分析,帮助您选择最适合…...
桥接模式详解和分析JDBC中的应用
🎯 设计模式专栏,持续更新中, 欢迎订阅:JAVA实现设计模式 🛠️ 希望小伙伴们一键三连,有问题私信都会回复,或者在评论区直接发言 桥接模式 文章目录 桥接模式桥接模式的四个核心组成:…...
【python - 函数】
一、交互式会话 在与 Python 的交互式会话中,你可以在提示符 >>> 后键入一些 Python 代码,Python 解释器会读取并执行你键入的各种命令。 要启动交互式会话,请在终端 (Mac/Unix/Linux) 中键入 python3 或在 Windows 中打开 Python…...
scipy中稀疏矩阵特征值问题概述
在Python的scipy库中,这三种算法——ARPACK、LOBPCG、和AMG——都是用于求解稀疏矩阵特征值问题的数值方法。它们各自有不同的特性和适用场景,以下是详细说明: 1. ARPACK (Arnoldi Package) ARPACK(Arnoldi Package)…...
浅谈线性表——队列
文章目录 一、什么是队列?二、队列底层三、自我实现一个队列3.1、链式存储3.1.1、单向链表实现队列的实现代码3.1.2、双向链表实现队列的实现代码 3.2、顺序存储3.2.1、循环队列的实现代码 一、什么是队列? 队列是只允许在一端进行插入数据操作…...
2-94 基于matlab的最佳维纳滤波器的盲解卷积算法
基于matlab的最佳维纳滤波器的盲解卷积算法。维纳滤波将地震子波转换为任意所需要的形态。维纳滤波不同于反滤波,它是在最小平方的意义上为最 佳。基于最佳纳滤波理论的滤波器算法是莱文逊(Wiener—Levinson)算法。程序提供了4种子波和4种期望输出:零延迟…...
【提示词】浅谈GPT等大模型中的Prompt
Prompt是人工智能(AI)提示词,是一种利用自然语言来指导或激发人工智能模型完成特定任务的方法。在AI语境中,Prompt是一种自然语言输入,通常指的是向模型提出的一个请求或问题,这个请求或问题的形式和内容会…...
最强AI照片说话Windows一体包下载地址,口型合成音频驱动图片,免安装,下载即用
照片数字一键整合包:点击下载 一键安装包,简单一键启动,即刻使用,秒级体验。 目前效果最好的音频驱动图片说话的软件,比sadtalker、MuseTalk更清晰,效果更好,可以作为DID heygen的开源平替。原…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...


