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

【C++】类和对象——Lesson2

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
💥💥个人主页:奋斗的小羊
💥💥所属专栏:C++

🚀本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为记录我的学习过程及理解。文笔、排版拙劣,望见谅。


目录

  • 1、赋值运算符重载
    • 1.1运算符重载
    • 1.2赋值运算符重载
  • 2、取地址运算符重载
    • 2.1const成员函数
    • 2.2取地址运算符重载
  • 3、类型转化
  • 4、再探构造函数
  • 5、static成员
  • 6、友元
  • 7、内部类
  • 8、匿名对象

1、赋值运算符重载

1.1运算符重载

当运算符被用于类类型的对象时,C++允许我们通过运算符重载的形式指定新的定义。C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。

  • 运算符重载是具有特殊名字的函数,它的名字是由operator和后面要定义的运算符共同构成,和其他函数一样,它也具有其返回类型和参数列表以及函数体
  • 重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数,二元运算符的左侧运算对象传给第一个参数,右侧运算对象传给第二个参数
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}//类中成员变量都可以访问//int Get()//{//	return _year;//}//private:int _year;int _month;int _day;
};bool operator<(Date d1, Date d2)
{return d1._year < d2._year&& d1._month < d2._month&& d1._day < d2._day;
}int main()
{Date x(2024, 7, 28);Date y(2004, 11, 7);operator<(x, y);//这样写和普通函数没什么区别//可以像下面这样调用,和上面一样x < y;return 0;
}

请添加图片描述

  • 如果一个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数比运算对象少一个
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}//类中成员变量都可以访问//int Get()//{//	return _year;//}bool operator<(Date d2){return _year < d2._year&& _month < d2._month&& _day < d2._day;}//private:int _year;int _month;int _day;
};int main()
{Date x(2024, 7, 28);Date y(2004, 11, 7);//operator<(x, y);//这样写和普通函数没什么区别//可以像下面这样调用,和上面一样//x < y;//x传给this指针,y传给d2x.operator<(y);x < y;return 0;
}
  • 运算符重载后,其优先级和结合性与对应的内置类型运算符保持一致
  • 不能通过连接语法中没有的符号来创造新的操作符,比如operator@
  • .* :: sizeof ?: . 以上5个运算符不能重载
  • 重载操作符至少有一个类类型参数,不能通过运算符重载改变内置类型对象的含义,如:int operator+(int x, int y);
  • 一个类需要重载哪些运算符,是看哪些运算符重载后有意义,比如Date类重载operator-就有意义,但是重载operator+就没有意义
  • 重载++运算符时,有前置++和后置++,运算符重载函数名都是operator++,无法很好的区分。C++规定,后置++重载时,增加⼀个int形参,跟前置++构成函数重载,方便区分
  • 重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第一个形参位置,第⼀个形参位置是左侧运算对象,调⽤时就变成了 对象<<cout,不符合使⽤习惯和可读性。重载为全局函数把ostream/istream放到第⼀个形参位置就可以了,第⼆个形参位置当类类型对象

1.2赋值运算符重载

赋值运算符重载是一个默认成员函数,用于完成两个已经存在的对象之间的拷贝赋值,这里要注意跟拷贝构造区分,拷贝构造用于一个对象拷贝初始化给另一个要创建的对象。

int main()
{Date d1(2024, 7, 29);Date d2(2004, 11, 7);//赋值重载d1 = d2;//拷贝构造Date d3(d2);Date d4 = d2;return 0;
}

赋值运算符重载的特点:

  1. 赋值运算符重载是一个运算符重载规定必须重载为成员函数。赋值运算符重载的参数建议写成const当前类类型引用,传值传参会有拷贝
//d1 = d2;
void operator=(Date d)
{_year = d._year;_month = d._month;_day = d._day;
}

如果这样写,因为赋值前要传参,所以会先调用拷贝构造,再调用复制重载。

  1. 有返回值,且建议写成当前类类型引用(因为传值返回也会先拷贝),引用返回可以提高效率,有返回值目的是为了支持连续赋值场景
  2. 没有显示实现时,编译器会自动生成一个默认赋值运算符重载,默认赋值运算符重载行为跟默认拷贝构造函数类似,对内置类型成员变量会完成值拷贝 / 浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用它的赋值重载
  3. Date这样的类成员变量全是内置类型且没有指向什么资源,编译器自动生成的赋值运算符重载就可以完成需要的拷贝,所以不需要我们显示实现赋值重载。像Stack这样的类,虽然也都是内置类型,但是_a指向了资源,编译器自动生成的赋值重载完成的值拷贝 / 浅拷贝不符合我们的需求,所以需要我们自己实现深拷贝(对指向的资源也进行拷贝)。像MyQueue这样的类型内部主要是自定义类型Stack成员,编译器自动生成的赋值重载会调用Stack的赋值重载,也不需要我们显示实现MyQueue的赋值运算符重载。如果一个类显示实现了析构并释放资源,那么它就需要显示写赋值重载,否则不需要
#include <iostream>
using namespace std;class Date
{
public://构造Date(int year = 1, 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;}//赋值运算符重载//d1 = d2;Date& operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;return *this;}private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 7, 29);Date d2(2004, 11, 7);//赋值重载d1 = d2;//拷贝构造Date d3(d2);Date d4 = d2;return 0;
}

2、取地址运算符重载

2.1const成员函数

  • const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面
  • const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。const修饰Date类的Print成员函数,Print隐含的this指针由Date* const this变为const Date* const this
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 2024, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//void Print(const Date* const this)void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{//const限定d1不能被修改const Date d1(2024, 7, 30);//权限平移d1.Print();Date d2(2024, 8, 1);//权限缩小d2.Print();return 0;
}

2.2取地址运算符重载

取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,一般这两个函数编译器自动生成的就够我们用了,不需要去显示实现,除非一些特殊的场景,比如我们不想让别人取到当前类对象的地址,就可以自己实现一份,胡乱返回一个地址。

class Date
{
public:Date* operator&(){//正常代码//return this;return (Date*)0x004FF88C;}const Date* operator&() const{//return this;return (Date*)0x004FF88C;}private:int _year;int _month;int _day;
};

3、类型转化

  • C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数
  • 构造函数前加explicit就不再支持隐式类型转换
#include <iostream>
using namespace std;class A
{
public://explicit A(int a)A(int a = 1){_a1 = a;}A(int a1, int a2){_a1 = a1;_a2 = a2;}A(const A& aa){_a1 = aa._a1;}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a1;int _a2;
};class Stack
{
public://临时变量具有常性,用const修饰void Push(const A& aa){//...}
private:A _arr[20];int _top;
};int main()
{A aa1 = 1;aa1.Print();//隐式类型转换//构造一个A的临时对象,再用这个临时对象拷贝构造aa2//编译器遇到连续构造+拷贝构造->优化为直接构造A aa2 = 2;aa2.Print();A& raa1 = aa2;const A& raa2 = 2;//临时变量具有常性Stack st;A aa3 = 3;st.Push(aa3);//构造一个A类对象再插入st.Push(3);//直接插入A aa4 = { 4, 5 };const A& aa5 = { 4, 5 };st.Push(aa4);st.Push({ 4, 5 });return 0;
}

4、再探构造函数

之前我们实现构造函数时,初始化成员变量主要是使用函数体内赋值,构造函数初始化还有一种方法,就是初始化列表,每个构造函数都有初始化列表。

  • 初始化列表的使用方式是以一个冒号开头,接着是一个以逗号分隔的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式
  • 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方
  • 引用成员变量、const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错
  • C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的
  • 尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造函数会编译错误
#include <iostream>
using namespace std;class Time
{
public:Time(int hour):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{
public:Date(int& rx, int year = 2024, int month = 1, int day = 1):_year(year),_month(month),_day(day),_n(1),_m(rx),_t(2){//...}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private://这里不是初始化,是缺省值,这个缺省值是给初始化列表的//如果初始化列表没有显示初始化,默认就会用这个缺省值初始化int _year = 2024;int _month = 11;int _day = 7;//必须在初始化列表初始化const int _n = 1;int& _m = _day;Time _t = 12;//没有默认构造int* _ptr = (int*)malloc(4);
};int main()
{int x;//对象定义Date d1(x, 2024, 7, 31);d1.Print();//const定义的变量、引用必须在初始化列表定义const int x = 1;Date& d2 = d1;return 0;
}
  • 初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的先后顺序无关,但是建议声明顺序和初始化列表顺序保持一致

| 下面程序的运行结果是什么:

#include <iostream>
using namespace std;class B
{
public:B(int a):_a1(a),_a2(_a1){//...}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a2 = 2;int _a1 = 2;
};int main()
{B b(1);b.Print();return 0;
}

在这里插入图片描述

因为在B类中,先声明的_a2,再声明的_a1,所以在初始化列表中先初始化_a2,再初始化_a1,初始化_a2的时候_a1还是随机值,然后再用a初始化_a1。


5、static成员

  • static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化
  • 静态成员变量为当前类的所有对象所共享不属于某个具体的对象,不存在对象中,存放在静态区
  • static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针
  • 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针
  • 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数
  • 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量和静态成员函数
  • 静态成员也是类的成员,受public、protected、private访问限定符的限制
  • 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是给构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表

求1+2+3+…+n

class Sum
{
public:Sum(){_ret += _i;++_i;}static int GetRet(){return _ret;}private:static int _i;static int _ret;
};int Sum::_i = 1;
int Sum::_ret = 0;class Solution {
public:int Sum_Solution(int n) {Sum arr[n];return Sum::GetRet();}
};

当定义一个Sum类类型长度为n的变长数组时,会调用n次构造,实现n的累加。

| 设已有A、B、C、D四个类定义,程序中A、B、C、D构造函数调用顺序为?析构函数调用顺序为?

C c;
int main()
{A a;B b;static D d;return 0;
}

我们知道对象实例化时自动调用构造函数,a、b、c、d四个对象创建的先后顺序是c、a、b、d,所以构造函数的调用顺序就是C、A、B、D;对象在销毁时自动调用析构函数,又规定后定义的先析构,所以局部对象a和b先析构b再析构a,而d是静态的局部对象,生命周期是全局的,所以再析构d,最后析构c, 所以析构函数的调用顺序就是B、A、D、C。


6、友元

友元提供了一种突破类访问限定符封装的方式,友元分为友元函数友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到一个类里面。

  • 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,不是类的成员函数
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员
  • 友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元
  • 友元类关系不能传递,如果A是B的友元,B是C的友元,但A不是C的友元
  • 有时提供了便利,但友元会增加耦合度,破坏了封装,所以友元不宜多用
// 前置声明,否则A的友元函数声明编译器不认识B
class B;
class A
{// 友元声明friend void func(const A& aa, const B& bb);
private:int _a1 = 1;int _a2 = 2;
};class B
{// 友元声明friend void func(const A& aa, const B& bb);
private:int _b1 = 3;int _b2 = 4;
};void func(const A& aa, const B& bb)
{cout << aa._a1 << endl;cout << bb._b1 << endl;
}int main()
{A aa;B bb;func(aa, bb);return 0;
}

7、内部类

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。

  • 内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包括内部类
  • 内部类默认是外部类的友元类
#include<iostream>
using namespace std;class A
{
public:class B // B默认就是A的友元{public :void foo(const A& a){cout << _k << endl; //OKcout << a._h << endl; //OK}};
private :static int _k;int _h = 1;
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;A aa;b.foo(aa);return 0;
}

请添加图片描述

  • 内部类本质也是一种分装,当A类跟B类精密关联,A类实现出来主要是给B类使用,那么可以考虑把A类设计为B类的内部类,如果放到private / protected位置,那么A类就是B类的专属内部类,其他地方都用不了

那求1+2+3+…+n这个题我们可以这样写:

class Solution {
public:int Sum_Solution(int n) {Sum arr[n];return _ret;}
private://class Sum{public:Sum(){_ret += _i;++_i;}};static int _i;static int _ret;
};int Solution::_i = 1;
int Solution::_ret = 0;

8、匿名对象

  • 用类型(实参)定义出来的对象叫匿名对象,相比之前我们定义的类型 对象名(实参)定义出来的叫有名对象
  • 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象
class A
{
public :A(int a = 0):_a(a){cout << "A(int a)" << endl;} ~A(){cout << "~A()" << endl;}private:int _a;
};class Solution {
public:int Sum_Solution(int n) {//...return n;}
};int main()
{A aa1;// 不能这么定义对象,因为编译器⽆法识别下⾯是⼀个函数声明,还是对象定义//A aa1();// 但是我们可以这么定义匿名对象,匿名对象的特点不⽤取名字// 但是他的⽣命周期只有这⼀⾏,下⼀⾏他就会⾃动调⽤析构函数A();A(1);A aa2(2);// 匿名对象在这样场景下就很好⽤,单纯想调用类中的一个函数Solution().Sum_Solution(10);return 0;
}

相关文章:

【C++】类和对象——Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C &#x1f680;本系列文章为个人学习笔记…...

常用传感器讲解十五--触摸传感器(KY-036)

常用传感器讲解十五–触摸传感器&#xff08;KY-036&#xff09; 具体讲解 这个比较简单&#xff0c;就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…...

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…...

【Docker系列】Docker 中-d 和-it 的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…...

IIS解析漏洞~ IIS7.漏洞分析

IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本)&#xff0c;配合文件上传漏洞进行GetShell的漏洞&#xff01; 1.2&#xff1a;IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞&#xff0c;在默认Fast-CGI开启状况下&#xff0c;在一个文…...

基于python+django的病人人信息管理系统及安全策略分析设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

前端必知必会-html表单的input属性

文章目录 HTML 输入属性value 属性readonly 属性disabled 属性size 属性maxlength 属性min 和 max 属性multiple 属性pattern 属性placeholder 属性required 属性step 属性autofocus 属性height 和 width 属性list 属性autocomplete 属性总结 HTML 输入属性 本章介绍 HTML <…...

设计模式:详细拆解策略模式

策略模式 既然是详解&#xff0c;就不以案例开头了&#xff0c;直奔主题&#xff0c;先来看看什么是策略模式。 模式定义 定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可相互替换。本模式 使得算法可独立于使用它的客户而变化。 结构 Strategy&a…...

Python正则表达式面试题分析总结

Python正则表达式面试题主要围绕Python内置的re模块展开&#xff0c;考察的是应聘者对于正则表达式的理解、使用以及在实际问题中的应用能力。以下是对这些面试题的详细分析总结&#xff1a; 正则表达式基础&#xff1a; re模块简介&#xff1a;Python中的re模块提供了正则表达…...

LeetCode题练习与总结:超过经理收入的员工--181

一、题目描述 SQL Schema > Pandas Schema > 表&#xff1a;Employee ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | | salary | int | | managerId | int | ----…...

LInux:循环语句

LInux&#xff1a;循环语句 if-else语句 if 语句语法格式 if [ $a -gt $b ]; then echo "a>b" fiif [ $a -gt $b ]; then echo "a>b"echo "a!b"echo "true" fiif-else语句 if-else 语句语法格式 if [ $a -gt $b ]; then echo &q…...

NumPy和Pandas中的布尔索引

布尔索引&#xff08;Boolean Indexing&#xff09;是数据分析中一种强大且常用的技术&#xff0c;用于通过布尔值数组&#xff08;即包含 True 和 False 的数组&#xff09;来选择数据子集。布尔索引可以用于 NumPy 数组、Pandas 数据框等数据结构。 布尔索引是一种非常有用的…...

.NET 一款反序列化打入冰蝎内存马的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…...

FPGA实现SDI视频接收转USB3.0传输,GS2971+FT601方案,提供4套工程源码和QT上位机源码

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA驱动USB通信方案FPGA基于GS2971的SDI视频解码方案FPGA基于FT601的USB3.0视频传输方案 3、详细设计方案设计原理框图SDI 相机GS2971-SDI解码芯片解读BT1120转RGB888图像缓存FT601-USB3.0芯…...

2024第26届中国(深圳)国际清洁能源、储能科技与新型电力展览会

源网荷储充产业链盛会&#xff0c;2024年续写辉煌&#xff0c;第26届中国国际清洁能源、储能技术与新型电力展览会11月11日将启幕&#xff1b; 2024第二十六届中国国际储能技术与设备展览会 China International Energy Storage Technology and Equipment Exhibition 2024第二…...

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(下)

电子表格软件Excel 2016 6.4 Excel 2016的公式与函数6.4.1 公式的概念6.4.2 公式的使用6.4.3 单元格的引用6.4.4 函数的使用6.4.5 快速计算与自动求和 6.5 Excel 2016的数据管理6.5.1 数据排序6.5.2 数据筛选6.5.3 分类汇总6.5.4 分组显示6.5.5 合并计算 6.6 Excel 2016的图表6…...

npm install 巨慢,导致Jenkins编译报错问题解决——基础积累

今天在弄后台系统的服务器编译时&#xff0c;一直报错。报错信息为&#xff1a;系统找不到指定的路径。 最后进入到服务器中&#xff0c;找到E:/Jenkins/WorkSpace/JiePeiAiMomsAdmin_FenZhi这个路径&#xff0c;然后通过cmd进入到命令提示符中。 然后通过npm i进行安装&#…...

Stable Diffusion 使用详解(5)---- 光影效果与场景融入

目录 背景 底模选取 提示词 ControlNet openpose illumination 效果 背景 有一家服装品牌店&#xff0c;需要绘制一款模特穿着某个英文LOG的漂亮服装&#xff0c;这是一种很常见UI作画需求&#xff0c;这类需求实际上可以透过选取正确的底模 controlNet 进行完美的实现…...

5G三大场景:eMBB、mMTC、uRLLC

1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f; 1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f;_3g4g5g的区别和作用-CSDN博客 从1G到4G&#xff0c;移动通信的核心是人与人之间的通信&#xff0…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...