C++中const和constexpr的区别:了解常量的不同用法
C++中const和constexpr的区别
- 一、C++中的常量概念
- 二、const关键字的用法和特点
- 三、constexpr关键字的用法和特点
- 四、const和constexpr的区别对比
- 4.1、编译时计算能力
- 4.2、可以赋值的范围
- 4.3、对类和对象的适用性
- 4.4、对函数的适用性
- 4.5、性能和效率的差异
- 五、使用示例
- 六、总结
一、C++中的常量概念
在C++中,常量是指其数值或数值引用在程序执行期间不能被改变的变量。常量可以在程序中用来定义一些固定不变的值,如数学常数、固定参数等。在C++中,有两种主要类型的常量:const和constexpr。
const常量概念:
- 使用关键字const声明的常量,一旦赋值后便不能修改其数值,具有只读属性。
- 可以作用于变量、指针、引用以及成员函数的参数,保证其在函数内部不会被修改。
- const在编译时起作用,但是不一定要进行常量表达式的计算。
constexpr常量概念:
- 使用关键字constexpr声明的常量,必须在编译时期计算出结果,并且其值在编译时即可确定。
- 可以用于定义常量、函数等,通常用于要求在编译时仅使用常量表达式的场景。
- constexpr在C++11之后引入,可用于进行更严格的编译时检查和优化。
const关键字的作用:
- 声明一个常量,即其数值在程序执行期间不能被改变。
- 可以用于定义普通变量、类成员变量、函数参数等,使其成为只读变量。
- 通过const修饰能够避免意外的数值修改。
constexpr关键字的作用:
- 声明一个常量表达式,要求在编译时期计算出结果,以产生一个编译时常量。
- 可以用于定义常量、函数等,通常用于需要在编译时进行计算的场景,例如数组大小、模板参数等。
- constexpr在C++11中引入,能够进行更严格的编译时检查和优化,在部分情况下可以提高程序性能。
二、const关键字的用法和特点
两种方式来声明和定义const变量:
-
通过变量声明和定义分开的方式(用于在多个文件之间共享const变量):
// 声明const变量 extern const int myConst; // 声明一个外部链接的const变量// 在另一个文件中定义const变量 const int myConst = 10;
-
直接声明和定义const变量:
// 声明并定义const变量 const int myConst = 10;
const 成员函数表示该函数不会修改对象的成员变量,这样的函数可以被 const 对象调用。
示例:
class MyClass {
public:void regularFunction() {// 正常的成员函数定义_val = 1;}void constFunction() const {// const 成员函数定义// 在 const 成员函数中不能修改对象的成员变量}
private:int _val;
};
一旦将一个成员函数声明为 const,那么这个函数就不能对对象的成员变量进行任何修改操作。
const修饰符还可以用于引用和指针类型,以表明它们指向的数据是常量,不能被修改。
const引用:可以通过在引用声明中添加const修饰符来创建const引用,如下所示:
int x = 10;
const int& ref = x; // 创建一个指向常量的引用
const指针:同样地,在指针声明中添加const修饰符可以创建const指针,如下所示:
int y = 20;
const int* ptr = &y; // 创建一个指向常量的指针
还可以这样声明指向常量的指针:
int z = 30;
int* const ptr2 = &z; // 创建一个常量指针
const在编译时的作用:
-
如果一个变量被声明为const,则编译器可以将其视为一个常量表达式,从而在编译时进行优化。即编译器可以在编译期间进行常量折叠和替换,而不必在运行时再去计算这个值。
-
编译时类型检查:使用const可以将变量声明为只读,确保在编译时不会发生意外的修改。如果尝试在const变量上进行写操作,编译器会报错。
-
const修饰指针和引用时,可以指示指针和引用所指向的内容为常量,这样可以在编译时进行一定的错误检查。
const的限制:
-
常量必须进行初始化:一个变量被声明为const,它必须在声明时进行初始化,否则编译器会报错。这是因为const在C++中被设计为一种“一旦赋值,不可更改”的特性。
-
对于const指针或引用来说,虽然它们指向的值是不可修改的,但是它们本身并不是常量。因此,可以通过改变指针或引用的指向来改变它们指向的值,这个要非常小心。
const的适用场景:
-
固定不变的数值或变量时,可以将其声明为const,以确保这些值在程序的执行过程中不会被修改。
-
将函数的参数声明为const可以确保函数内部不会对参数进行修改,同时向调用者明确表明函数的行为。
-
在编译时进行常量折叠和替换。
三、constexpr关键字的用法和特点
constexpr关键字用于声明变量和函数为编译时常量表达式。它可以用于在编译时求值,以及在运行时提供常量值。
constexpr变量的语法:
constexpr type variable_name = value;
其中,type
表示变量的类型,variable_name
表示变量的名称,value
表示变量的初始值。重点注意的是,value
必须是一个常量表达式,必须在编译时就可以确定。
示例:
constexpr int width = 10; // 声明一个constexpr变量
constexpr函数的语法:
constexpr return_type function_name(parameters) {// 函数体return value;
}
return_type
表示函数返回值的类型,function_name
表示函数的名称,parameters
表示函数的参数列表,value
表示函数的返回值。重点注意的是,constexpr函数的参数和返回值类型必须是能够在编译期间确定的常量表达式。
示例:
constexpr int square(int x) {return x * x;
}
注意:在C++14之前,constexpr函数的函数体通常被要求是非常简单的,例如只有一条return语句。但是在C++14中放宽了这一限制,允许constexpr函数包含有限的控制流、局部变量和循环。
constexpr变量的特点:
- 通过使用constexpr关键字,变量可以在编译时求值,其值在编译期间就已经确定。
- constexpr变量必须被初始化为常量表达式。
- constexpr变量可以作为数组的长度、枚举的值、模板参数等。
- 与const变量不同,constexpr变量的值在编译时即确定,因此可以作为编译时常量来使用。
示例:
constexpr int width = 10; // 定义一个编译时常量
constexpr int area = width * width; // 定义一个编译时常量表达式
constexpr函数的特点:
- 通过使用constexpr关键字,函数可以在编译时求值。
- constexpr函数通常用于执行简单的计算,并且其参数和返回值都必须是能够在编译期间确定的常量表达式。
- constexpr函数可以在编译时被用作模板参数。
示例:
constexpr int square(int x) {return x * x;
}
前面说了这么多constexpr在编译时的注意事项,这里再总结一下constexpr在编译时的作用:
-
常量表达式的求值:constexpr关键字告诉编译器,变量或函数的值可以在编译时求值。即编译器会在编译阶段计算constexpr变量和函数的值,而不是在运行时。这可以在一定程度上提高程序的性能,因为编译时求值的常量表达式可以避免在运行时进行重复的计算。
-
编译时的优化:使用constexpr可以让编译器在编译时对代码进行更多的优化。例如,编译器可以在编译期间内联constexpr函数,消除不必要的计算,以及在一些情况下将表达式简化为常量。这可以提高程序的执行效率,并减少运行时的开销。
constexpr的限制:
- constexpr函数必须是单一返回语句,并且该语句必须返回一个常量表达式。
- constexpr函数在C++11中还有更多的限制,例如不能包含循环、局部变量和复杂的控制流,但在C++14中这些限制已经有所放宽。
- constexpr变量必须在声明时进行初始化,并且初始化表达式必须是常量表达式。
constexpr的适用场景:
- 当变量的值在编译时已知,并且永远不会改变时,可以使用constexpr变量。这对于一些数学常数或者其他不变的配置参数非常有用。
- 当函数需要在编译时进行计算,并且其参数和返回值都是常量表达式时,可以使用constexpr函数。这可以用于在编译时生成特定的值或序列,避免在运行时进行重复的计算。
- constexpr还可以用于模板编程中,特别是对于元编程和编译时计算相关的需求。
四、const和constexpr的区别对比
4.1、编译时计算能力
const:
- const关键字用于声明常量,它指定了一个变量的值在程序执行期间不能被修改。在编译时,const常量的值是不可更改的,但并不要求其在编译时进行计算。
- 由于const变量的值在运行时不能被改变,因此编译器会将const变量存储在只读存储区域中,但并不要求其在编译时进行计算。
constexpr:
- constexpr关键字用于声明常量表达式,它要求变量或函数在编译时就能得到计算结果。
- 对于constexpr变量,编译器会在编译期间进行常量表达式的求值,而不是在运行时。这意味着constexpr变量的值必须在编译时就能确定。
- 同样地,constexpr函数在编译时执行,并且其参数必须是常量表达式,返回值也必须是常量表达式。
示例 1:const
#include <iostream>
using namespace std;int main() {const int x = 5;const int y = x + 3;cout << y << endl;return 0;
}
定义了一个 const 变量 x,并将其值设为 5。然后又定义了一个 const 变量 y,并将其设为 x + 3。这里的 x 和 y 都是在运行时确定的,因此编译器会在程序运行时对 y 的值进行计算。
示例 2:constexpr
#include <iostream>
using namespace std;int main() {constexpr int x = 5;constexpr int y = x + 3;cout << y << endl;return 0;
}
constexpr 来定义 x 和 y。在这种情况下,编译器会在编译时就计算出 y 的值,因为 x 和 3 都是在编译时就可以确定的常量。因此,y 的值在编译时就被确定了。
小结:const和constexpr在编译时计算能力上的区别在于const仅指示变量的值在运行时不可修改,而constexpr则要求在编译时进行常量表达式的计算。constexpr更适用于那些需要在编译时确定值或进行编译时计算的场景,而const更适用于普通的常量声明。
4.2、可以赋值的范围
const:
- const 可用于声明常量,可以赋值给任何类型的变量,包括全局变量、局部变量、类的成员变量和函数参数。
- 可以通过 const 指针指向常量或者通过 const 引用绑定到常量对象,但这些常量本身可以在编译时或者运行时进行初始化。
constexpr:
- constexpr 可以用于声明常量,可以赋值给变量、函数、模板参数和构造函数的初始化器。
- 在 C++11 中,constexpr 主要用于声明常量,而在 C++14 中,constexpr 进一步扩展到了函数,允许对常量表达式进行计算。
- constexpr 也可以用于指针和引用,但是需要指向或者引用在编译时就能确定其值的对象。
const 可以用于声明各种类型的常量,并且可以用于指针和引用的限制不是很严格;而 constexpr 主要用于声明常量,同时还可以用于指示编译时计算。constexpr 在赋值的范围上更加灵活,特别是在 C++14 中的扩展。
4.3、对类和对象的适用性
const:
- const 可以用于成员函数的声明,表示该函数不会修改对象的成员变量。同时,const 成员函数可以被一个 const 对象调用,但不能修改其成员变量。
- const 对象可以调用对象的 const 成员函数,但不能调用非 const 成员函数,确保对象的成员变量不被修改。
constexpr:
- constexpr 关键字在类的成员函数中表示该函数可以在编译时求值,可以用于构造函数、成员函数和类的静态成员函数。
- 对于构造函数,可以使用 constexpr 来声明编译时可求值的构造函数,要求构造函数中只能包含编译时可计算的操作。
- constexpr 成员函数可以在编译时求值,适用于一些固定值的计算,在 C++14 中可以用 constexpr 成员函数替换类中的静态常量成员。
当涉及到赋值的范围,const 和 constexpr 也有一些不同。让我们通过示例来说明这一点。
示例 1:const
#include <iostream>
using namespace std;int main() {const int x = 5;const int* ptr = &x; // 指向常量的指针cout << *ptr << endl;*ptr = 10; // 编译器会报错,因为指针指向的是一个常量return 0;
}
示例 2:constexpr
#include <iostream>
using namespace std;int main() {constexpr int x = 5;constexpr int* ptr = &x;cout << *ptr << endl;*ptr = 10; // 编译器会报错,因为指针指向的是一个常量return 0;
}
小结:const 主要用于指示对象或者成员函数不可修改,限定对象的只读访问行为,而 constexpr 用于指示在编译时可以进行求值的场景,特别适用于一些对值就能确定的操作。constexpr 对于类和对象的适用性更加注重在编译时进行的操作,而 const 更多是关于对象的只读性质。
4.4、对函数的适用性
const:
- const 可以用于函数参数和函数返回值的声明。在函数参数中,const 可以表示该参数不会被修改;在函数返回值中,const 可以表示返回的值为常量。
- const 成员函数可以用于表示该函数不会修改对象的成员变量,在类中通过 const 关键字来声明成员函数,以确保其在调用过程中不会修改对象的状态。
constexpr:
- constexpr 可以用于函数声明,表示该函数可以在编译时求值。在 C++11 中,constexpr 主要用于常量表达式,而在 C++14 中,扩展到了允许对更复杂的函数进行编译时求值。
- 在 C++14 中,constexpr 还可以用于标记类的成员函数,以及构造函数和析构函数,表示在编译时就能确定其值或者执行结果的函数。
示例 1:const
#include <iostream>
using namespace std;void printMessage(const string& msg) {cout << msg << endl;
}int main() {const string message = "Hello, world!";printMessage(message);return 0;
}
示例 2:constexpr
#include <iostream>
using namespace std;constexpr int square(int x) {return x * x;
}int main() {constexpr int num = 5;constexpr int result = square(num);cout << result << endl;return 0;
}
小结:const 主要用于标记函数参数和返回值的常量性质,以及在类中用于声明不会修改对象状态的成员函数;而 constexpr 则主要用于表示可以在编译时求值的函数,适用于对一些值在编译时就能确定的操作。constexpr 对于函数的适用性更加注重在编译时进行的操作,而 const 则更多用于标记常量性质。
4.5、性能和效率的差异
const和constexpr的主要区别在于编译时进行的操作和值的确定性。
const:
- const 定义的常量在运行时是不可修改的,但它的值是在运行时确定的。
- const 变量的值在编译时可能无法确定,因此每次使用时都需要进行运行时计算。
- 当 const 变量被频繁地使用并且其值是运行时计算得到的时候,const 可能会导致性能下降。
constexpr:
- constexpr 在编译时就能确定其值,因此可以用于在编译时进行计算。
- 使用 constexpr 可以提高程序的性能和效率,因为它在编译时就能确定值,而不需要在运行时进行计算。
- constexpr 变量可以在编译时被替换为其确定的值,这样可以减少程序运行时的开销。
示例 1:const
#include <iostream>
#include <vector>
using namespace std;void printVector(const vector<int>& vec) {for (const int& num : vec) {cout << num << " ";}cout << endl;
}int main() {const int size = 1000000;vector<int> numbers;for (int i = 0; i < size; i++) {numbers.push_back(i);}printVector(numbers);return 0;
}
示例 2:constexpr
#include <iostream>
using namespace std;constexpr int square(int x) {return x * x;
}int main() {constexpr int num = 5;constexpr int result = square(num);cout << result << endl;return 0;
}
从性能和效率的角度来看,constexpr 在编译时确定值的特性使得它更有可能比 const 变量更有效率。因为它减少了在运行时进行计算的需要,可以在适当的情况下提高程序的性能。但对于一般的常量定义,使用 const 或者 constexpr 都不会对程序的性能产生显著的影响。
五、使用示例
// 使用 const 定义常量
#include <iostream>
using namespace std;int main() {const int max_value = 100;cout << "The maximum value is: " << max_value << endl;// max_value = 200; // 这行代码会导致编译错误,因为常量不可更改return 0;
}
// 使用 constexpr 定义常量
#include <iostream>
using namespace std;int main() {constexpr int max_value = 100;cout << "The maximum value is: " << max_value << endl;return 0;
}
六、总结
const:
- const 变量在编译时不一定会被计算出具体的值,它可以是一个运行时才能得到的值。所以,const 变量不能用于需要在编译期间计算值的场合。
- const 变量可以存储在内存中,并可以被编译器优化。
- const 变量可以用于任何场合,包括函数参数、类成员等。
constexpr:
- constexpr 变量必须在编译时期就能得到一个确定的值,其值必须能够在编译时计算得出,所以一般用于需要在编译期确定常量值的场合。
- constexpr 变量更多的是被视为一个编译时的常量表达式,在一些需要常量表达式的地方必须使用 constexpr。
- constexpr 允许编译器在编译时进行计算,并且可以在一些上下文中被用于要求常量表达式的场合(比如数组大小、模板参数等)。
常量有不同的用法和适用场景:
-
const变量:
- 用法:可以通过const关键字定义一个不可改变的变量,如:const int a = 10;
- 适用场景:常用于定义一个在程序执行过程中其值不会改变的变量,例如常数、固定参数等。
-
constexpr变量:
- 用法:可以使用constexpr关键字定义一个编译时常量,要求在编译时期就能得到一个确定的值。
- 适用场景:常用于要求在编译期计算得到值的场合,例如定义数组大小、模板参数、常量表达式等。
-
#define预处理器宏:
- 用法:可以通过#define指令定义一个常量宏,如:#define PI 3.14159
- 适用场景:常用于定义一些简单的常量,例如数学常数、特定数值、标志位等。
-
枚举类型(enum):
- 用法:可以通过enum关键字定义一组具名的整型常量,如:enum Week {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
- 适用场景:常用于定义一组相关的常量,例如星期、状态码等。
相关文章:

C++中const和constexpr的区别:了解常量的不同用法
C中const和constexpr的区别 一、C中的常量概念二、const关键字的用法和特点三、constexpr关键字的用法和特点四、const和constexpr的区别对比4.1、编译时计算能力4.2、可以赋值的范围4.3、对类和对象的适用性4.4、对函数的适用性4.5、性能和效率的差异 五、使用示例六、总结 一…...

高级架构师是如何设计一个系统的?
架构师如何设计系统? 系统拆分 通过DDD领域模型,对服务进行拆分,将一个系统拆分为多个子系统,做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出,多扇入,根据服务器的承载,进行客户端负…...

力扣:474. 一和零(动态规划)(01背包)
题目: 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入&#…...

【复现】Apache Solr信息泄漏漏洞_24
目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 Apache Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求&#x…...

《WebKit 技术内幕》之五(4): HTML解释器和DOM 模型
4 影子(Shadow)DOM 影子 DOM 是一个新东西,主要解决了一个文档中可能需要大量交互的多个 DOM 树建立和维护各自的功能边界的问题。 4.1 什么是影子 DOM 当开发这样一个用户界面的控件——这个控件可能由一些 HTML 的标签元素…...

记录一个sql:查询商品码对应多个商品的商品码
目录 背景sql 语句总结 背景 一个项目中,商品表和商品码表是一对多的关系,但由于程序没有控制好,导致有些商品码对应有多个商品,为了修正数据,我们得把商品码对应多个商品的商品码找出来. sql 语句 goods_detail表结构…...

Linux内核--网络协议栈(三)sk_buff介绍
目录 一、引言 二、sk_buff ------>2.1、skb介绍 ------>2.2、控制字段 ------>2.3、其他字段 ------>2.4、特定功能字段 ------>2.5、管理字段 ------>2.6、内存分配 ------>2.7、内存释放 ------>2.8、克隆和拷贝 ------>2.9、队列管理…...

尝试解决githubclone失败问题
BV1qV4y1m7PB 根据这个视频 似乎是我的linux的github似乎下好了 我没有配置好 比如我的ssh-key 现在根据视频试试 首先需要跳转到ssh的文件夹: cd ~/.ssh 然后生成一个ssh-key: ssh-keygen -t rsa -C "<github资料里的邮箱>" 然后…...

VUE表单中多个el-upload上传组件共享回调函数解决方案
产品需求界面: 在产品配置页面表单中需要上传多个图片,项目中上传组件采用Element Plus 中的 el-upload,目前问题是每个上传组件都需要实现自己的回调,比如:on-change,采用官方推荐标准代码如下: <el-fo…...

Opencv4快速入门笔记
opencv4 一、数据载入显示和储存 1.Mat类 cv::Mat a(640,480,CN_8UC3); //640*480 3通道 cv::Mat a(Size(480,640),CV_8UC1); Mat m a.clone();//克隆 Mat b (a,Range(2,5),Range(3,5));//截取a中2-5行,3-5列 Mat b(2,2,CV_8UC3,Scalar(0,0,255));//构造时赋值…...

three.js 点按钮,相机飞行靠近观察设备
效果: 点击按钮或直接点击模型都可以实现运动效果 代码: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…...

什么情况下物理服务器会运行出错?
物理服务器,也称为裸机服务器,一般可以提供高性能计算水平和巨大的存储容量。然而,它们也难免会遇到一些问题。运行出错时,可能会导致停机和数据丢失。在这篇文章中,介绍了常见的物理服务器在一些情况下显示出错…...

配置免费的SSL
1 引言 本文介绍了如何在 Linux 环境下使用免费的 Let’s Encrypt 为你的网站配置 SSL 证书的方法,以及如何在 Nginx 服务器中启用 SSL。对于需要在自己的网站上启用 HTTPS 的用户来说非常实用。 2 SSL 简介 SSL,全称为 Secure Sockets Layer…...

(2)(2.1) Andruav Android Cellular(一)
文章目录 前言 1 Andruav 是什么? 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App 前言 Andruav 是一个基于安卓的互联系统,它将安卓手机作为公司计算机,为你的无人机和遥控车增添先进功能。 1 Andruav 是什么ÿ…...

[GN] Vue3.2 快速上手 ---- 核心语法(终章)_3
文章目录 路由器工作模式命名路由to的三种写法嵌套路由路由传参query参数params参数 路由的props配置replace 和 push编程式导航重定向 总结 路由器工作模式 history模式 优点:URL更加美观,不带有#,更接近传统的网站URL。 缺点:后…...

在k8s上部署ClickHouse
概述 clickhouse的容器化部署,已经有非常成熟的生态了。在一些互联网大厂也已经得到了大规模的应用。 clickhouse作为一款数据库,其容器化的主要难点在于它是有状态的服务,因此,我们需要配置PVC。 目前业界比较流行的部署方式有…...

快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索
Gemini 是 Google DeepMind 开发的多模态大语言模型家族,作为 LaMDA 和 PaLM 2 的后继者。由 Gemini Ultra、Gemini Pro 和 Gemini Nano 组成,于 2023 年 12 月 6 日发布,定位为 OpenAI 的竞争者 GPT-4。 本教程演示如何使用 Gemini API 创建…...

【网络安全】-入门版
secure 一、基本工具1、metasploit framework ps.本着兴趣爱好,加强电脑的安全防护能力,并严格遵守法律和道德规范。一、基本工具 1、metasploit framework msf(metasploit framework)是一个开源的渗透测试框架,用于…...

Elasticsearch各种高级文档操作3
本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 State 聚合查询文档概述操作实例 桶聚…...

【算法题】66. 加一
题目 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:…...

查看服务器资源使用情况
查看服务器资源使用情况 一、top命令二、理解IOPS三、腾讯云机器cvm四、iotop五、atop六、查看内存使用情况一、top命令 "top"命令是一个Linux系统的实用工具,用于动态监视系统的运行状态。它会实时显示系统中正在运行的进程列表,并按照CPU使用率、内存使用率等指…...

锐浪报表 Grid++Report 明细表格标题重复打印
一、问题提出 锐浪报表 GridReport,打印表格时,对于明细表格的标题,打开换页时,需要重复打印明细表格的标题,或取消打印明细表格的标题。见下表: 首页: 后续页:(无明细表…...

编程笔记 html5cssjs 048 CSS链接
编程笔记 html5&css&js 048 CSS链接 一、设置链接样式二、文本装饰三、背景色四、链接按钮五、练习小结 通过 CSS,可以用不同的方式设置链接的样式。 一、设置链接样式 链接可以使用任何 CSS 属性(例如 color、font-family、background 等&…...

Spring DI
目录 什么是依赖注入 属性注入 构造函数注入 Setter 注入 依赖注入的优势 什么是依赖注入 依赖注入是一种设计模式,它通过外部实体(通常是容器)来注入一个对象的依赖关系,而不是在对象内部创建这些依赖关系。这种方式使得对象…...

CorelDRAW Graphics Suite2024专业图形设计软件Mac/Windows版
以激情为创造动力,以目的为设计导向。“对专业的图形设计人士来说,CorelDRAW 是市面上最易于使用的软件。 我用它设计过标牌、横幅、T 恤,甚至 45 英尺长的房车图形!” 使用 CorelDRAW 全新的聚焦模式,现在可以单独编…...

如何本地部署虚拟数字克隆人 SadTalker
环境: Win10 SadTalker 问题描述: 如何本地部署虚拟数字克隆人 SadTalker 解决方案: SadTalker:学习逼真的3D运动系数,用于风格化的音频驱动的单图像说话人脸动画 单张人像图像🙎 ♂️音频dz…...

电容充电时间的计算
电容充电时间的计算公式有两种。一种用于已知V0,Vu,Vt,R和C的情况,另一种用于已知E,R和C的情况。 当已知V0,Vu,Vt,R和C时: 设 V0 为电容上的初始电压值设 Vu 为电容充满…...

MicroPython核心(1):源码获取、编译构建
本文介绍了MicroPython在主要平台进行构建的基本方法,包括如何进行版本控制、获取和构建移植的源代码、构建文档、运行测试,以及MicroPython代码库的目录结构。 使用git进行源码管理 MicroPython托管在GitHub上,并使用Git进行源码管理。在进…...

pyspark之Structured Streaming file文件案例1
# generate_file.py # 生成数据 生成500个文件,每个文件1000条数据 # 生成数据格式:eventtime name province action ()时间 用户名 省份 动作) import os import time import shutil import time FIRST_NAME [Zhao, Qian, Sun, Li, Zhou, Wu, Zheng, Wang] SEC…...

虚幻UE 特效-Niagara特效实战-雨天
回顾Niagara特效基础知识:虚幻UE 特效-Niagara特效初识 其他两篇实战:虚幻UE 特效-Niagara特效实战-火焰、烛火、虚幻UE 特效-Niagara特效实战-烟雾、喷泉 本篇笔记我们再来实战雨天,雨天主要用到了特效中的事件。 文章目录 一、雨天1、创建雨…...