【C++】类和对象【下】
目录
- 一、再探构造函数
- 1、测试题
- 二、类型转换
- 三、`static`成员
- 1. 静态成员变量
- 2. 静态成员函数
- 四、友元
- 五、内部类
- 六、匿名对象
- 七、对象拷贝时的编译器优化
个人主页<—请点击
C++专栏<—请点击
一、再探构造函数
之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使用方式是以⼀个冒号":"
开始,接着是⼀个以逗号","
分隔的数据成员列表,每个"成员变量"后面跟⼀个放在括号"()"
中的初始值或表达式。
每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。
引用成员变量,const
成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。
我们现在来看一下初始化列表怎么写:
#include <iostream>
using namespace std;class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year),_month(2),_day(day){_day = 15;}void Print() const{cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Print();return 0;
}
这就是初始化列表,它在构造函数中是成员变量定义初始化的地方,这里_year
定义初始化为1
,_month
定义初始化为2
,_day
定义初始化为1
,但函数体内又对_day
进行了一次赋值所以变为15
,我们打印输出一下:
这里如果你不写初始化列表的话,也不会报错:
但_year
和_month
会变为随机值,为了不让它们是随机值,我们可以在private
的声明中给它们加上缺省值,就像函数一样,声明和定义分离时,规定声明是可以给缺省值的。(C++11
支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。)例如:
private:int _year = 2025;int _month = 2;int _day = 2;
这样如果没有给值的情况下,会默认使用缺省值,不会导致是随机值的情况。
假设我们的成员变量中存在const
成员变量const int i;
和引用成员变量int& ret;
,我们再来看一下:
Date(int year = 1, int month = 1, int day = 1) :_year(year),_month(month)
{_day = 15;ret = year;r = day;
}
如果这样写程序会报这样的错误:
它们都有一个共同的特点就是:必须在定义时就完成初始化。
而初始化列表可以认为是每个成员变量定义初始化的地方,所以它们必须在初始化列表上初始化。
Date(int year = 1, int month = 1, int day = 1) :_year(year),_month(month),ret(year),r(2)
{_day = 15;
}
这样程序就可以正常运行,语法上是没有错误的,但这里存在一个问题:ret
的引用对象是year
而year
当Date
结束的时候就会被销毁,此时ret
就相当于野引用,有风险,所以ret
最好引用全局变量,或者定义一个变量让它引用。
Date(int& x,int year = 1, int month = 1, int day = 1) :_year(year),_month(month),ret(x),r(2)
{_day = 15;
}int n = 1;
Date d1(n);
d1.Print();
这样就解决问题了。
还有一种情况就是成员变量中存在没有默认构造的类类型变量,我们给出以下类:
class Phone
{
public:Phone(int price):_price(price){}
private:int _price;
};
我们在我们的成员变量中定义一个Phone
类对象pri
:
private://声明int _year = 2025;int _month = 2;int _day = 2;int& ret;const int r = 1;Phone pri;
此时运行代码就会发生以下报错:
没有合适的默认构造函数可用,也就是没有不需要传参的就可以使用的构造函数,所以它也必须在初始化列表初始化。
这样才能完成它的初始化,相当于调用它的构造函数。
只要类中的成员变量中出现了这三类成员变量,只能使用初始化列表初始化,否则会编译报错。
初始化列表还有一个特点:
Date(int& x,int year = 1, int month = 1, int day = 1) :ret(x),r(2),pri(2100)
{_day = 15;
}
这里我没有写_year、_month、_day
的初始化列表,但这三个成员变量也会走初始化列表。
即使没有写在初始化列表的成员变量,也要走初始化列表,所有的成员变量都要走初始化列表,其中我们上面讲到的三种特殊成员变量必须写在初始化列表上。
初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持⼀致。
初始化列表总结:
- 无论是否显示写初始化列表,每个构造函数都有初始化列表;
- 无论是否在初始化列表显示初始化成员变量,每个成员变量都要走初始化列表初始化;
1、测试题
下面程序的运行结果是什么?()
A. 输出 1 1
B. 输出 2 2
C. 编译报错
D. 输出 1 随机值
E. 输出 1 2
F. 输出 2 1
#include<iostream>
using namespace std;
class A
{
public:A(int a):_a1(a),_a2(_a1){}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a2 = 2;int _a1 = 2;
};
int main()
{A aa(1);aa.Print();return 0;
}
答案:D
原因:首先,初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关,所以初始化列表中会先初始化_a2,因为它是先声明的,而_a2由_a1初始化,此时_a1是随机值,所以_a2就是随机值,之后_a1进行初始化,_a1根据a进行初始化,此时a是1,所以_a1就是1了,综上,答案是D:输出 1 随机值
。
二、类型转换
C++
支持内置类型隐式类型转换为类类型对象,需要有相关参数为内置类型的构造函数。- 构造函数前面加
explicit
就不再支持隐式类型转换。 - 类类型的对象之间也可以隐式转换,需要相应的构造函数支持。
我们来看看类型转换如何实现:
#include <iostream>
using namespace std;class A
{
public:A(int n):_a(n),_b(n){}A(const A& d){_a = d._a;_b = d._b;}void Print(){cout << _a << " " << _b << endl;}
private:int _a = 1;int _b = 2;
};int main()
{return 0;
}
这里我简单定义了一个框架,根据第一个前提条件我们知道内置类型转化为类类型,需要有相关参数为内置类型的构造函数。也就是实现的A(int n)
,所以现在能够进行用int
类型隐式转化为类类型了。
A a1 = 1;
a1.Print();
运行结果:
代码能够正常运行,也就是发生了隐式类型转换,过程:先用1
构造一个A
的临时对象,再用这个临时对象拷贝构造a1
,这也是为什么拷贝构造函数加const
的原因,因为临时对象具有常性。
当然新编译器遇到构造+拷贝构造
会优化为直接构造
。但在老编译器下上面的过程是真实发生的。
注意: A& r = 1;
这段代码是错的,因为会先转化为临时对象而临时对象具有常性,A
不能引用const A
涉及到了权限的放大,所以A
之前要加const
。
这里是构造函数中是一个形参的情况,那要是两个形参该如何更改才能进行隐式类型转换呢?
A(int n,int m):_a(n),_b(m)
{
}
如果我们还按照之前那样写就会报以下错误:
因为是两个参数,所以报错也正常,应该这样写:
A a1 = { 1,2 };
a1.Print();
不想支持隐式类型转换,只要在构造函数前面加上explicit
就不再支持隐式类型转换了explicit A(int n,int m)
。
我们再来看一下类类型和类类型之间的转换:
A:
class A
{
public://explicit A(int n,int m)A(int n, int m):_a(n), _b(m){}A(const A& d){_a = d._a;_b = d._b;}void Print(){cout << _a << " " << _b << endl;}int Get() const{return _a * _b;}
private:int _a = 1;int _b = 2;
};
增加了Get
函数方便B
获取值。
B:
class B
{
public:B(const A& d):_c(d.Get()){}void Print(){cout << _c << endl;}
private:int _c = 2;
};
A a1 = { 100,200 };
B b1 = a1;
b1.Print();
运行测试:
这里也会发生构造临时变量(用a1构造B类型的临时对象)
,并用临时变量拷贝构造b1
的过程。
三、static
成员
1. 静态成员变量
用static
修饰的成员变量,称之为静态成员变量,静态成员也是类的成员,受public、protected、private
访问限定符的限制。静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。所以静态成员变量不能在声明位置给缺省值初始化,因为缺省值是给构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表,因此静态成员变量⼀定要在类外进行初始化。
我们一起来看一下静态成员变量是如何定义使用的:
#include <iostream>
using namespace std;class A
{
public:private://不属于某个对象,属于整个类//不能给缺省值//声明static int _count;int _a;
};
//定义并初始化
int A::_count = 0;int main()
{return 0;
}
这就是静态成员变量定义的代码,那接下来假设我要计算程序一共创建了多少个类,给如何计算呢?
A(int a):_a(a)
{++_count;
}
A(const A& d)
{_a = d._a;++_count;
}
创建类对象肯定要经过这两个成员函数,所以调用这两个成员函数时我让_count
加加即可。
为了获取count
的值我们可以再写一个成员函数:
int GetCount()
{return _count;
}
我们执行以下代码:
A a1(1);
A a2 = a1;
cout << a1.GetCount() << endl;
运行结果:
用全局变量也可以统计,但是用静态成员变量更好,它有一个优点,就是别人不能修改,能减少出错。
注意:这里打印不能写成cout << A::GetCount() << endl;
,因为GetCount
函数是某一个类对象的,不是整个类的。
2. 静态成员函数
- 用
static
修饰的成员函数,称之为静态成员函数,静态成员函数没有this
指针。 - 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有
this
指针。 - 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
依旧以统计类对象个数为例,我们可以把GetCount
函数换成静态的。
//没有this指针
static int GetCount()
{//_a++;不能访问非静态的,没有this指针return _count;
}
A a1(1);
A a2 = a1;
cout << A::GetCount() << endl;
cout << a1.GetCount() << endl;
运行结果:
四、友元
- 友元提供了⼀种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加
friend
,并且把友元声明放到⼀个类的里面。 - 外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,它不是类的成员函数。
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
在上期博客讲解流插入、流提取运算符重载时,我们已经用过友元函数了:
补充:
- ⼀个函数可以是多个类的友元函数。比如一个函数
void func(const A& a, const B& b);
,它想要访问A类对象
和B类对象
中的私有成员就要分别在A类
和B类
中声明友元函数。
#include <iostream>
using namespace std;
// 前置声明,否则A的友元函数声明编译器不认识B
class B;
class A
{friend void func(const A& a, const B& b);
public:A(int a):_a(a){ }
private:int _a = 1;
};
class B
{friend void func(const A& a, const B& b);
public:B(int b):_b(b){ }
private:int _b = 2;
};
void func(const A& a, const B& b)
{cout << a._a << endl;cout << b._b << endl;
}
int main()
{A a(2);B b(3);func(a, b);return 0;
}
运行结果:
- 友元类的关系是单向的,不具有交换性,比如
B类
是A类
的友元,但是A类
不是B类
的友元,即B类
可以访问A类
,但A类不能访问B类。
A
:
class A
{friend class B;
public:A(int a):_a(a){}
private:int _a = 1;
};
B
:
class B
{
public:B(int b):_b(b){}void Print(const A& d){cout << "A._a: " << d._a << endl;cout << "B._b: " << _b << endl;}
private:int _b = 2;
};
main
:
int main()
{A a(2);B b(3);b.Print(a);return 0;
}
运行结果:
- 友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。
- 友元有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
五、内部类
- 如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独立的类,跟定义在全局相比,它只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。简单来讲,它们是平行关系不是包含关系。
#include <iostream>
using namespace std;
class A
{
public:class B{private:int _b = 2;};
private:int _a = 3;
};
int main()
{A a;return 0;
}
定义一个A类对象
可以看到内部只有成员变量,所以A类
与B类
之间不是包含关系。
此时我们的B类
是public
也就是对外开放的我们可以这样定义一个B类对象
:A::B b;
,这也从侧面说明它们之间并不是包含关系,而是平行关系。如果B类
在隐私或者保护下,就不能再访问B类
了。
- 内部类默认是外部类的友元类。
class A
{
public:class B{public:B(const A& d):_b(d._a){ }private:int _b = 2;};
private:int _a = 3;
};
B类
中可以访问A类
的私有成员变量。
- 内部类本质也是⼀种封装,当
B类
跟A类
紧密关联,B类
实现出来主要就是给A类
使用,那么可以考虑把B类
设计为A
的内部类,如果放到private/protected
位置,那么B类
就是A类
的专属内部类,其他地方都用不了。
六、匿名对象
- 用
类型(实参)
定义出来的对象叫做匿名对象,相比之前我们定义的类型 对象名(实参)
定义出来的叫有名对象。只要给它命名了,它就是有名对象。 - 匿名对象生命周期只在当前⼀行,⼀般临时定义⼀个对象当前用⼀下即可,就可以定义匿名对象。
下面我们写一个带有构造和析构函数的类来学习一下匿名对象。
class A
{
public:A(int a=1):_a(a){ cout << "A(int a=1)" << endl;}~A(){cout << "~A" << endl;}
private:int _a = 1;
};
如此一来函数有没有执行构造和析构我们看一下打印窗口就知道了。
// 不能这么定义对象,因为编译器⽆法
// 识别下⾯是⼀个函数声明,还是对象定义
//A a();//匿名对象
A();//声明周期只在当前一行
A(1);
调试代码到最后一行:
我们可以看到刚刚调试运行到A(1);
时,A();
完成了构造和析构,说明它的生命周期已经结束了。
匿名对象的使用场景在于当你想要调用或者使用类中的东西又不想过多定义类对象时,就可以使用匿名对象,用完之后下一行它就销毁了。
例如:
class sum
{
public:int sum_count(int n){//...return n;}
};
七、对象拷贝时的编译器优化
现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传返回值的过程中可以省略的拷贝。
如何优化,C++
标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新一点的编译器对于连续一个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"
的编译器还会进行跨行跨表达式的合并优化。例如:Visual Studio2022
在优化方面就非常先进。
linux
下可以将下⾯代码拷贝到test.cpp
文件,编译时用 g++ test.cpp -fno-elide-constructors
的方式关闭构造相关的优化。
总结:
以上就是本期博客分享的全部内容啦!如果觉得文章还不错的话可以三连支持一下,你的支持就是我前进最大的动力!
技术的探索永无止境! 道阻且长,行则将至!后续我会给大家带来更多优质博客内容,欢迎关注我的CSDN账号,我们一同成长!
(~ ̄▽ ̄)~
相关文章:
【C++】类和对象【下】
目录 一、再探构造函数1、测试题 二、类型转换三、static成员1. 静态成员变量2. 静态成员函数 四、友元五、内部类六、匿名对象七、对象拷贝时的编译器优化 个人主页<—请点击 C专栏<—请点击 一、再探构造函数 之前我们实现构造函数时,初始化成员变量主要使…...
【JS逆向基础】并发爬虫
前言:所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。强调多个事件在同一时间间隔发生。 1,进程、线程以及协程 【1】进程概念 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算…...
Android组件化 -> 基础组件进行Application,Activity生命周期分发
在lib_common基础组件模块创建上下文持有类,生命周期派发类 object AppContextProvider {private lateinit var application: Applicationprivate var currentActivityRef: WeakReference<Activity>? null// 应用生命周期监听器列表private val appLifecyc…...
42. PCB防静电环设计
PCB防静电环的作用 1. PCB防静电环的作用2. 防静电环设计技术点 1. PCB防静电环的作用 防静电环主要用于生产、运输、售后等环节人体会直接接触电路板的场景。 防静电环只在顶层和底层设计即可。 2. 防静电环设计技术点...
深入理解Java反射机制
java反射是java语言中一个强大而灵活的特性,它允许程序在运行时检查和操作类、接口、字段和方法。 为了方便理解下文,我先给出Cat对象 public class Cat implements jump,Run {private int age;public String name;protected String color;double he…...
嵌入式音视频通话EasyRTC基于WebRTC技术驱动智能带屏音箱:开启智能交互新体验
一、引言 随着智能家居市场的蓬勃发展,智能带屏音箱作为家庭智能交互中心的重要组成部分,其功能需求日益丰富。EasyRTC凭借其低延迟、高稳定性的特点,为智能带屏音箱带来了全新的交互体验,能满足用户在视频通话、远程监控、在线…...
1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失)
1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失) 1、时间:1987-2023年 2、来源:各省年鉴、统计公报 3、指标:进出口总额(万美元)、进口总额(万美…...
paddle ocr 或 rapid ocr umi ocr 只识别了图片的下部分内容 解决方案
如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的解决方案如下: 如上图,识别的准确率其实很高,但是只识别了下半部分的内容,上半部分的内容就没有识别到,其实是程序设置有点问题,程序设置的…...
【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?
软件准备 esp-webrtc-solution/solutions/doorbell_demo 例程 此例程集成了 WebSocket 传输视频流的应用 硬件准备 ESP32P4-Function-Ev-Board 环境搭建 推荐基于 esp-idf v5.4.1 版本的环境来编译此例程 若编译时出现依赖的组件报错,可进行如下修改ÿ…...
default和delete final和override
1.default和delete default 1.生成默认成员函数 2.仅适用于特殊成员函数(如构造函数、析构函数、拷贝/移动操作等) delete 1.删除函数 2.可应用于任何函数(不限于特殊成员函数) 2.final 和override final 用于类:…...
Nvidia Orin 安装onnxruntime-gpu
在用英伟达边缘设备Nvidia Orin 安装onnxruntime-gpu环境时, 通常会遇到很多问题。 在正常的Nvidia 服务器上安装onnxruntime-gpu 是非常简单的, 直接pip install onnxruntime-gpu即可, 但是在边缘设备上就没有这么简单了。 直接pip install…...
C++ CRTP技术(奇异递归模版模式)
C 的CRTP技术 最近了解到C的CRTP技术,通过博客来这里记录一下。 我们首先可以了解一下什么是CRTP技术。CRTP是C的一种高级模版变成模式。 他主要的用途有以下的几点: 编译时实现多态(静态多态):通过CRTP技术…...
验证es启动成功
1. 查看命令行输出信息 在启动 Elasticsearch 时,命令行窗口会输出一系列日志信息。若启动成功,日志里通常会有类似下面的信息: plaintext [2025-05-06T13:20:00,000][INFO ][o.e.n.Node ] [node_name] started其中 [node_na…...
AI工场全面激活电商创意链
在当今科技飞速发展的时代,北京先智先行科技有限公司凭借其卓越的创新能力,推出了“先知大模型”、“先行AI商学院”以及“先知AIGC超级工场”这三款旗舰产品,在市场上掀起了不小的波澜。 传统电商设计流程,从需求确认到营销策…...
数 学 函数
gcd int gcd(int a,int b){while(a%b){int ca%b;ab;bc;}return b; } 错位排列 typedef long long ll; ll d(int n){if(n1) return 0;if(n2) return 1;return (n-1)*(d(n-1)d(n-2)); } 快速幂 //注意看是否有mod的需求 int q_pow(int a,int b){int ans1,tempa;while(b){if(…...
springboot集成langchain4j记忆对话
流式输出 LLM 一次生成一个标记(token),因此许多 LLM 提供商提供了一种方式,可以逐个标记地流式传输响应,而不是等待整个文本生成完毕。 这显著改善了用户体验,因为用户不需要等待未知的时间,几…...
C语言初阶:数组
目录 0.数组要讲的知识点 1.一维数组的创建和初始化 1.1 数组的创建: 1.2数组实例: 1.3 数组的初识化: 例子: 2.一维数组的使用 例子: 总结: 3.一维数组在内存中的存储 4.二维数组的创建和初始化 4.…...
案例分享 | 攻克ADAS开发测试难题,实现单元动态测试新突破
汽车行业中的代码动态测试:守护智能汽车的安全与质量 在当今汽车行业,智能网联汽车的快速发展让软件成为了汽车的核心竞争力之一。从自动驾驶辅助系统到车载信息娱乐系统,汽车中的软件数量和复杂度都在不断增加。然而,软件的复杂…...
K8S 基于本地存储的持久卷
假设有如下三个节点的 K8S 集群: k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、背景分析 阅读本文,默认您有 PV-PVC、hostPath 相关知识。 由于安全方面的考虑,K8S 官方并不推荐 hostPath …...
LED实验
目录 1.LED介绍 1.1LED原理图: 2.单片机运行代码的流程 3.进制的转换 4.C51数据类型 5.小编的单片机型号:STC89C52RC/LE52RC,最高波特率:9600 6.点亮一个LED 代码 步骤 代码: 7.LED闪烁 在STC内操作&#x…...
python+pytest接口自动化测试--日志记录
前言:代码可以直接复制使用 解决问题: 问题1:日志重复记录的问题,比如运行一个模块日志会记录很多遍(通过handlers是否存在解决的) 问题2:运行测试用例进行多个模块相互调用.日志记录不全的问题(通过共享公共的handlers解决问题) 首先写一个日志记录的工具 # 这个是个日志的…...
Android 蓝牙开发调试总结
Android 蓝牙开发调试总结 文章目录 Android 蓝牙开发调试总结一、前言二、蓝牙开发1、开关和连接控制2、相关日志3、相关广播4、demo示例 三、其他1、Android 蓝牙开发调试小结2、Android14 蓝牙启动流程3、Android14 蓝牙 BluetoothService 启动和相关代码介绍4、Android13 蓝…...
混淆矩阵(Confusion Matrix)
混淆矩阵(Confusion Matrix)是一个用于评估分类模型性能的工具,特别是在机器学习和统计学领域。它展示了模型预测结果与实际结果之间的关系。混淆矩阵通常用于二分类或多分类问题中,但也可以扩展到更多类别的情况。 一、混淆矩阵…...
C语言——操作符
一.操作符的分类 算术操作符: - * / %移位操作符:<< >>位操作符: & | ^赋值操作符: - * / % > & | ^单⽬操作符: ! -- & * - ~ sizeof …...
大数据处理利器:Hadoop 入门指南
一、Hadoop 是什么?—— 分布式计算的基石 在大数据时代,处理海量数据需要强大的技术支撑,Hadoop 应运而生。Apache Hadoop 是一个开源的分布式计算框架,致力于为大规模数据集提供可靠、可扩展的分布式处理能力。其核心设计理念是…...
追踪大型语言模型的思想(上)(来自针对Claude的分析)
概述 像 Claude 这样的语言模型并非由人类直接编程,而是通过大量数据进行训练。在训练过程中,它们会学习解决问题的策略。这些策略被编码在模型为每个单词执行的数十亿次计算中。对于我们这些模型开发者来说,这些策略是难以捉摸的。这意…...
系统 Python 与 Conda 环境的灵活切换
在现代 Python 开发中,经常需要在系统 Python 和 Conda 环境中的 Python 之间切换。无论是处理不同项目的依赖冲突,还是测试代码在不同 Python 版本下的兼容性,灵活切换 Python 环境都是开发者的必备技能。本文将详细介绍如何实现 Python 环境的灵活切换,并提供 Conda 命令…...
【HTTP】《HTTP 全原理解析:从请求到响应的奇妙之旅》
文章目录 一、HTTP 协议1.1、HTTP 是什么1.2、理解 "应用层协议"1.3、理解 HTTP 协议的工作过程1.4、HTTP协议格式1.5、协议格式总结 二、HTTP 请求1.1、认识 URL1.1.1、URL 基本格式1.1.2、关于 URL encode 1.2、认识 "方法"1.2.1 、GET 方法1.2.2、 POST…...
重生之我在2024学Fine-tuning
一、Fine-tuning(微调)概述 Fine-tuning(微调)是机器学习和深度学习中的一个重要概念,特别是在预训练模型的应用上。它指的是在模型已经通过大量数据训练得到一个通用的预训练模型后,再针对特定的任务或数据…...
若依前后端分离项目中可以删除哪些原若依有的?
在若依(RuoYi)前后端分离项目中完成二次开发后,可以删除以下未使用的模块和文件以简化项目结构。以下分模块和风险点说明: --- ### **一、后端(Spring Boot)可删除内容** #### 1. **未使用的功能模块** …...
element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框
原代码(密码框是text框): <el-form-item label"用户名" :label-width"formLabelWidth" v-if"!localOrhuawei" prop"userName"><el-input v-model"formDialog.userName" />&l…...
二叉树的遍历与构造
唉,好想回家,我想回家跟馒头酱玩,想老爸老妈。如果上天再给我一次选择的机会,我会选择当一只小动物,或者当棵大树也好,或者我希望自己不要有那么多多余的情绪,不要太被别人影响,开心…...
「Mac畅玩AIGC与多模态23」开发篇19 - Markdown 富文本输出工作流示例
一、概述 本篇基于格式化文本整合的经验,进一步介绍如何通过 LLM 输出标准 Markdown 内容,并在前端正确渲染出标题、列表、加粗等富文本格式,提升展示效果与内容结构可读性。 二、环境准备 macOS 系统Dify 平台已部署并可访问 三、在 Dif…...
记录学习《手动学习深度学习》这本书的笔记(十)
因为最近在做《语音与语言理解综合处理》的实验,所以打算先看第14章:自然语言处理:预训练和第15章:自然语言处理:应用,之后再来看第13章:计算机视觉。 第十四章:自然语言处理&#…...
Flowable7.x学习笔记(二十一)查看我的发起
前言 “查看我的发起”功能,就是将当前用户作为流程发起人启动的所有流程实例集中展示,帮助用户随时跟踪自己提交的业务请求的状态与历史,提升透明度与可控性。 业务人员通常不知道流程引擎底层如何运转,只关心“我提交的报销/申请…...
【Bootstrap V4系列】学习入门教程之 组件-折叠(Collapse)
Bootstrap V4系列 学习入门教程之 组件-折叠(Collapse) 折叠(Collapse)How it works一、Example二、Horizontal 水平的三、Multiple targets 多个目标四、Accordion example 手风琴示例 折叠(Collapse) 通…...
ROS1和ROS2使用桥接工具通信
前提:主从机在同一局域网内,可以互相ping通 我的两个设备其中一个无法连接wifi,ubuntu老生常谈的问题.....,获得新的技能:手机蓝牙提供网络,两个设备连接手机蓝牙就可以连接网络并且处于同一个局域网内。 我的主机为…...
尤雨溪宣布:Vue 生态正式引入 AI
在前端开发领域,Vue 框架一直以其易用性和灵活性受到广大开发者的喜爱。 而如今,Vue 生态在人工智能(AI)领域的应用上又迈出了重要的一步。 尤雨溪近日宣布,Vue、Vite 和 Rolldown 的文档网站均已添加了llms.txt文件,这一举措旨在让大型语言模型(LLM)更方便地理解这些…...
分布式id的两大门派!时钟回拨问题的解决方案!
2.1 两大门派 目前业界的分布式ID实现路径归结起来有两派:一派以雪花算法为代表,不强依赖DB能力,只使用分布式节点自身信息(时间戳节点ID序列号)的编码生成唯一序列,好处是去中心化、无单点风险࿱…...
QMK键盘固件配置详解
QMK键盘固件配置详解 前言 大家好!今天给大家带来QMK键盘固件配置的详细指南。如果你正在DIY机械键盘或者想要给自己的键盘刷固件,这篇文章绝对不容错过。QMK是目前最流行的开源键盘固件框架之一,它允许我们对键盘进行高度自定义。接下来&a…...
Jenkins 服务器上安装 Git
安装 Git # 更新包列表 sudo apt update# 安装 Git sudo apt install git 验证安装 # 检查 Git 版本 git --version 查看所有全局配置 git config --global --list 查看特定配置项 # 查看用户名配置 git config --global user.name# 查看邮箱配置 git config --global u…...
自由浮动时间和总浮动时间对比
一、自由浮动时间的定义 在项目进度管理中,自由浮动时间(Free Float)是指在不推迟项目后续任务最早开始时间的前提下,一个任务能够延迟的时间长度。它是针对单个任务而言的,主要考虑该任务与其紧后任务之间的关系。 …...
2025.05.07-华为机考第二题200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 社区智能安防系统设计 问题描述 随着智慧社区建设的发展,LYA小区需要设计一套高效的安防监控系统。该小区布局可以用一棵二叉树来表示,树的每个节点代表一户居民家庭。 为了…...
分布式架构详解
一、分布式架构的概念与设计目标 1. 基本概念 分布式架构(Distributed Architecture)是分布式计算技术的应用和工具,指将一个复杂系统拆分为多个独立的组件(或服务),并将这些组件部署在不同物理节点(服务…...
码蹄集——平方根X、整除幸运数
目录 MT1075 平方根X MT1078 整除幸运数 MT1075 平方根X 知识点: 上取整:ceil;下取整:floor;四舍五入:round 判断是否为完全平方数的方法:利用sqrt函数结果为double,将其结果相乘&a…...
【MATLAB源码-第277期】基于matlab的AF中继系统仿真,AF和直传误码率对比、不同中继位置误码率对比、信道容量、中继功率分配以及终端概率。
操作环境: MATLAB 2022a 1、算法描述 在AF(放大转发)中继通信系统中,信号的传输质量和效率受到多个因素的影响,理解这些因素对于系统的优化至关重要。AF中继通信的基本架构由发射端、中继节点和接收端组成。发射端负…...
ACE-Step - 20秒生成4分钟完整歌曲,音乐界的Stable Diffusion,支持50系显卡 本地一键整合包下载
ACE-Step 是由ACE Studio与StepFun联合开发的音乐生成模型,被誉为“音乐界的Stable Diffusion”。该模型以其惊人的生成速度和多样化功能引发行业热议,支持19种语言,可在短短20秒内生成一首长达4分钟的完整音乐作品,效率比主流模型…...
007 Linux 开发工具(上)—— vim、解放sudo、gc+
🦄 个人主页: 小米里的大麦-CSDN博客 🎏 所属专栏: Linux_小米里的大麦的博客-CSDN博客 🎁 GitHub主页: 小米里的大麦的 GitHub ⚙️ 操作环境: Visual Studio 2022 文章目录 Linux 开发工具(上)Linux 编辑器 —— vim…...
React学习路线图-Gemini版
前端开发学习路线图 (针对编程新手,主攻 React 框架) 总原则:先打好地基,再盖楼。 无论学习哪个框架,扎实的 HTML、CSS 和 JavaScript 基础是成功的关键。React 是基于 JavaScript 构建的,所以深入理解 JS 至关重要。…...