《类和对象:基础原理全解析(下篇)》
目录
- 一、类的构造函数的初始化列表
- 1. 初始化列表的使用
- 2. 初始化列表的初始化顺序
- 3. 使用初始化列表的注意事项
- 二、类的自动类型转换
- 1. 类的自动类型转换的使用
- 2. 关闭类的自动类型转换
- 三、静态类成员
- 1. 静态成员的特性
- 2. 使用静态成员计算类创建了多少个对象
- 3. 使用静态类成员的注意事项
- 四、友元函数
- 1. 友元函数的使用
- 2. 使用友元函数的注意事项
一、类的构造函数的初始化列表
使用函数时需要传递对应的参数,而在传参的过程中就已经完成了形参的创建并使用实参对其初始化。而构造函数不同于其他函数,因为构造函数是在创建类对象时编译器自动调用的,我们传递的参数只是用来给形参初始化,然后把形参赋值给类对象的成员变量。而在进入函数体时,类对象的成员变量就已经创建好了但并没有初始化,此时类对象的成员变量中存储的都是垃圾值(上一次使用遗留的值),只有在执行完构造函数之后,该类对象的成员变量中存储的才是我们想要的值。
说的直白一点,在构造函数的函数体中对类对象成员变量进行修改都是赋值,不是初始化。但是有的成员变量必须初始化,如:常量成员变量(const 成员)和引用成员等。而针对这些成员就需要使用构造函数的初始化列表,在初始化列表中可以对类的成员变量进行初始化。
1. 初始化列表的使用
初始化列表的使用方法是在构造函数定义的圆括号后面使用冒号(:),然后列出需要初始化的成员变量,中间用逗号(,)隔开,且圆括号中是用来初始化的值。
// A 类声明
class A
{
private:const int a; // const 成员变量const int& ra; // 引用成员变量public:A(int b, int c);
};// A 类的构造函数
A::A(int b, int c): a(b), ra(c)
{}
&esmp; 虽然上述的初始化列表使用正确了,但是成员变量 ra 引用了一个局部变量,出了该函数以后会导致 ra 成为野引用。
2. 初始化列表的初始化顺序
观察下面的 Stakc 类的构造函数:
// 类型声明
typedef int DataType;// Stack 类声明
class Stack
{
private:DataType* _pdata;size_t _top;size_t _capacity;public:Stack(size_t capacity = 4);void push(const DataType& data);
};Stack::Stack(size_t capacity): _capacity(capacity), _top(1), _pdata((DataType*)malloc(sizeof(DataType)*_capacity))
{}void Stack::push(const DataType& data)
{// 入栈_pdata[_top++] = data;
}
如果按照构造函数初始化列表中的初始化顺序来说,该构造函数没有问题。但是如果进行调试的话,可以发现初始化的顺序与之并不一致。
(1)刚进入构造函数
作者使用的是 VS2022,编译器自动把成员变量设置为 0 了。
(2)初始化第一个成员变量
可以看到下面的代码中第一个初始化的是成员变量 _pdata,并不是构造函数定义中的 _capacity。
(3)初始化剩下两个成员变量
通过对上面调试结果的分析,可以得出初始化列表的初始化顺序并不是按照构造函数中的顺序进行初始化的,而是按照类声明中成员变量的声明顺序进行初始化的。
这样就会产生一个问题,如果先初始化 _pdata,但是此时 _capacity 还没有初始化,它的值可能会是随机值(并不是所有的编译器都会在进入构造函数的瞬间把成员变的值设置为 0),这样就会开辟一个随机大小的空间,很容易造成严重的问题。
所以,初始化列表中的初始化顺序需要和类声明中成员变量的声明顺序一致。防止由于初始化的顺序和预期的顺序不一致,从而产生难以预估的影响。
3. 使用初始化列表的注意事项
(1)对于下面四种类型必须使用初始化列表:常量成员变量(const 成员)、引用成员变量、没有默认构造函数的自定义成员变量和基类构造(基类在后面的博客中会介绍);
当自定义类型作为其他类的成员变量时,该类的构造函数必须在初始化列表中使用该自定义类型的构造函数对该自定义类型初始化。如果不在初始化列表中显式使用,那么编译器会在初始化列表中隐式调用其默认构造函数。如果该自定义类型没有默认构造函数且又没有在初始化列表中显式调用其构造函数,编译器会报错。
为什么必须在初始化列表中调用自定义类型的构造函数?
1)首先只要创建类对象就必须调用其构造函数,这是 C++ 规定;
2)其次该类对象也可能包含 const 成员变量或者引用等必须初始化的成员变量,这些成员变量必须在它们自己类的构造函数中通过初始化列表进行初始化;
3)最后,该自定义类型可能涉及动态内存开辟,使用它自己的构造函数可以正确地开辟动态内存。
(2)初始化列表的初始化顺序应该和类声明中的成员变量的声明顺序保持一致,避免出现由于初始化顺序产生的错误;
(3)尽量使用初始化列表,哪怕不显式使用初始化列表,编译器也会把所有的成员变量在初始化列表中走一遍,因为初始化列表是成员变量的创建过程。并且一般情况下,使用初始化列表的效率更高。
二、类的自动类型转换
对于自动类型转换相信大家都不陌生,如:int a = 1.1;,该语句就是常见的 double 值自动类型转换为 int 值,只不过要默认舍弃后面的小数。
而在类中也存在类似的自动类型转换,在类中,把只有一个参数的构造函数用来自动类型转换。
1. 类的自动类型转换的使用
下面依旧是 Stack 类的声明:
// 类型声明
typedef int DataType;// Stack 类声明
class Stack
{
private:size_t _capacity;size_t _top;DataType* _pdata;public:Stack(size_t capacity = 2);
};Stack::Stack(size_t capacity): _capacity(capacity), _top(0), _pdata(nullptr)
{_pdata = (DataType*)malloc(sizeof(DataType) * capacity);// 申请判断if (nullptr == _pdata){perror("Stack::Stack::malloc: ");return;}
}
再来看下面的 Stack 类对象的创建语句:
为什么该语句可以通过编译?首先,编译器检测到该语句的右侧需要 Stack 类型的值,然后就会尝试把 int 类型的常量值 2 转换为 Stack 类型。而我们编写的 Stack 类的构造函数刚好包含一个 size_t 的参数,且 int 类型转换成 size_t 类型(满足隐式转换条件)。所以,编译器会先把 int 类型的 2 隐式转换成 size_t 类型,然后用这个 size_t 类型的 2 去构造一个 Stack 类型的临时对象,再用这个临时的 Stack 类型的对象去拷贝构造 sk1。
但是现在的编译器很智能,编译器会优化上述的构造过程。编译器会把 2 转换为 size_t 类型之后直接去构造 sk1,因为编译器觉得调用两次构造函数太浪费了。当在一条语句中使用两次构造函数时,编译器会尝试把这个过程优化成一次构造函数。
2. 关闭类的自动类型转换
自动类型转换有时候也会带来问题,比如当我们误写了 Stack sk1 = 10; 这种语句时,编译器并不会报错,而是进行隐式类型转换从而构造出一个容量为 10 的 Stack 类对象,因为我们编写了一个只包含一个 size_t 类型参数的构造函数——Stack(size_t capacity);。
可以在类的只有一个参数的构造函数的声明之前加上 explicit 关键字来关闭自动类型转换的特性。
可以看到当我们在只有一个参数的构造函数的声明前面加上了 explicit 关键字之后,该类的自动类型转换特性就消失了,无法从 int 类型转换为 Stack 类型。
通常情况下不建议使用类的自动类型转换,因为这样如果代码错了,把一个 int 值用来初始化或者赋值给 Stack 类对象,编译器不会报错,而是会进行自动类型转换。
三、静态类成员
如果我们想要计算一个类创建了多少个类对象,那么常规的方法肯定是创建一个全局变量或者静态变量,然后再构造函数中对该变量 +1,在析构函数中对该变量 -1。
但是这样会破坏类的封装特性,因为不管是全局变量还是静态变量都可以被直接访问,这样很不安全。这时就需要使用类的静态成员(static 成员)。
在类成员前面加上 static 就可以使该成员成为静态成员,成员变量前面加上 static 就变成了静态成员变量,成员函数前面加上 static 就成为了静态成员函数。
1. 静态成员的特性
(1)静态成员只有一个实例,被所有类对象共享,存放在静态区;
(2)静态成员必须在类外定义,定义时不添加关键字,类中只是声明;
(3)静态成员可以通过类名::静态成员或者对象.静态成员来访问;
(4)静态成员函数没有 this 指针,不能访问任何其他非静态成员;
(5)静态成员也是类成员,受 private、public 和 protected 访问限定符的限制。
2. 使用静态成员计算类创建了多少个对象
下面通过静态成员变量和静态成员函数计算 A 类创建了多少个对象。
// A 类声明
class A
{
private:static int _num_object;int _a;public:A(int a = 0);~A();// 静态成员函数static int GetObjectNum();
};// A 类静态成员变量定义
int A::_num_object = 0;// A 类成员函数定义
A::A(int a)
{_a = a;// 对象数量 +1++_num_object; // 实际上是 ++this->_num_object
}A::~A()
{// 对象数量 -1--_num_object;
}int A::GetObjectNum()
{cout << "当前对象个数: " << _num_object << endl;return _num_object;
}int main()
{{A a1;A::GetObjectNum();{A a2;A::GetObjectNum();A a3;A::GetObjectNum();}A a4;A::GetObjectNum();}A::GetObjectNum();return 0;
}
程序运行结果如下:
上述代码通过把静态成员变量 _num_object 放在私有(private)中实现了封装,只能通过公有的静态成员函数访问。
且静态函数中没有 this 指针,不能访问类的其他非静态成员变量。
3. 使用静态类成员的注意事项
(1)静态类成员变量在类中声明(前面加 static),在类外定义(不加 static,需要加类名::限定)。静态类成员函数也是如此;
(2)公有的静态成员可以直接通过类名和作用域解析运算符进行访问,或者通过类对象进行访问,但是建议使用类名和作用域解析运算符进行访问;
因为静态类成员属于整个类,被所有对象共享,使用类名::来进行访问更加能提现其是一个静态成员。
(3)由于静态类成员函数不包含 this 指针,所以不能访问其他非静态成员变量;
(4)通常把静态成员变量放在私有区域,然后通过公有区域的静态类成员函数进行访问。
四、友元函数
友元函数在类中声明,在类外定义。它不是类的成员函数,但是可以访问类的私有成员和保护成员。因为友元函数不是类的成员函数,所以它没有 this 指针,需要把类对象当作参数传递。友元函数不受访问限定符的限制,可以在类的任何地方定义,但是需要在前面加上关键字 friend。但是在类外定义时不需要加上 friend 关键字,也不需要使用类名::限定,因为友元函数不属于类的成员函数。
为什么需要友元函数?比如在 Date 类中,我们想要直接使用流插入运算符(<<)打印 Date 类对象,那么我们就必须重载流插入运算符(<<)。但是这里有个问题,如果把流插入运算符当作类的成员函数,那么就需要把类对象放在前面,如:
Date d1(2025, 1, 2);
d1 << cout;
我们平常都习惯把 cout 放在前面,如果像上面这样使用就导致可读性很差,所以我们需要使用友元函数来把 cout 放在前面。
1. 友元函数的使用
下面使用友元函数重载了加法运算符和流插入运算符。
// Date 类声明
class Date
{
private:size_t _year;size_t _month;size_t _day;public:Date(size_t year = 1949, size_t month = 10, size_t day = 1);size_t GetMonthDay() const;// 友元函数friend Date operator+(size_t days, const Date& date);friend std::ostream& operator<<(std::ostream& os, const Date& date);
};// Date 类成员函数定义
Date::Date(size_t year, size_t month, size_t day): _year(year), _month(month), _day(day)
{}size_t Date::GetMonthDay() const
{// 十二个月份的天数static const size_t MONTH_DAYS[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 闰年判断if ((2 == _month) && ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400 == 0)))return 29;elsereturn MONTH_DAYS[_month];
}// 友元函数
Date operator+(size_t days, const Date& date)
{Date tmp(date);// 计算tmp._day += days;while (tmp._day > tmp.GetMonthDay()){// 减去当月的天数tmp._day -= tmp.GetMonthDay();// 12 月if (12 == tmp._month){++tmp._year;tmp._month = 1;}else // 其他月{++tmp._month;}}// 返回return tmp;
}std::ostream& operator<<(std::ostream& os, const Date& date)
{os << date._year << "-" << date._month << "-" << date._day;return os;
}int main()
{Date d1(2025, 1, 2);cout << d1 << endl;cout << "10000 天以后: ";cout << 10000 + d1 << endl;return 0;
}
程序的运行结果如下:
可以看到使用了友元函数之后,不仅可以直接使用 cout 和流插入运算符直接打印日期类对象,还可以实现数字在前和类对象相加。
2. 使用友元函数的注意事项
(1)友元函数在类内声明,声明时前面加上关键字 friend,在类外定义,定义时前面不加关键字 friend;
(2)友元函数可以直接访问类的私有成员和保护成员,但是友元函数不是类的成员函数;
(3)由于友元函数不是类的成员函数,所有定义时不需要使用类名::限定;
(4)友元函数不受访问限定符的限制,可以在类的任意位置声明;友元函数可以重载;
(5)尽量少使用友元函数,因为友元函数破坏了类的封装性。
相关文章:
《类和对象:基础原理全解析(下篇)》
目录 一、类的构造函数的初始化列表1. 初始化列表的使用2. 初始化列表的初始化顺序3. 使用初始化列表的注意事项 二、类的自动类型转换1. 类的自动类型转换的使用2. 关闭类的自动类型转换 三、静态类成员1. 静态成员的特性2. 使用静态成员计算类创建了多少个对象3. 使用静态类成…...
==和===的区别,被坑的一天
在 JavaScript 中, 和 都用于比较两个值,但它们有一个重要的区别: 1. (宽松相等运算符) 进行比较时,会 自动类型转换(也叫做强制类型转换),即如果比较的两个值的类型不同,JavaScr…...
Azure Airflow 中配置错误可能会使整个集群受到攻击
网络安全研究人员在 Microsoft 的 Azure 数据工厂 Apache Airflow 中发现了三个安全漏洞,如果成功利用这些漏洞,攻击者可能会获得执行各种隐蔽操作的能力,包括数据泄露和恶意软件部署。 “利用这些漏洞可能允许攻击者以影子管理员的身份获得…...
【数据结构】链表(2):双向链表和双向循环链表
双向链表(Doubly Linked List) 定义: 每个节点包含三个部分: 数据域。前驱指针域(指向前一个节点)。后继指针域(指向下一个节点)。 支持从任意节点向前或向后遍历。 #define dat…...
鸿蒙开发:了解正则表达式
前言 从给出的文本中,按照既定的相关规则,匹配出符合的数据,其中的规则就是正则表达式,使用正则表达式,可以使得我们用简洁的代码就能实现一定复杂的逻辑,比如判断一个邮箱账号是否符合正常的邮箱账号&…...
【juc】AQS是什么
目录 1. 说明2. 资源共享方式3. 核心思想与实现4. 自定义同步器5. 常用实现类 1. 说明 1.AQS是AbstractQueuedSynchronizer的简称,即抽象的队列式同步器,也可以称作队列同步器。2.它是Java并发包(java.util.concurrent)中的一个重…...
最好用的图文识别OCR -- PaddleOCR(1) 快速集成
最近在项目中遇到了 OCR 的需求,希望能够实现高效而准确的文字识别。由于预算限制,我并未选择商业付费方案,而是优先尝试了开源工具。一开始,我测试了 GOT-OCR2.0,但由于我的 Mac 配置较低,不支持 GPU 运算…...
【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
17个Apache SeaTunnel案例下载见附件! 开发篇 1.Apache SeaTunnel——OLAP 引擎的数据动脉 1.1项目定位——EtLT 时代的新一代数据集成平台 1.2Apache SeaTunnel 核心功能 1.3Apache SeaTunnel 在 OLAP 场景下的应用 1.4WhaleTunnel 产品特性 2.教你从头到尾开发一…...
第2章波动光学引论—抓本质,本质必定简单
1波动光学的电磁理论 1.1波动方程 1)波动方程是通过描述波函数随时间和空间的变化来表达波动的传播和演化。 2)一维波动方程: a.一维波动方程描述了沿着一条直线传播的波动。它的一般形式为: ∂u/∂t v ∂u/∂x 其中ÿ…...
基于通义千问2-VL-7B-Instruct模型的微调技术指南
基于通义千问2-VL-7B-Instruct模型的微调技术指南 引言 通义千问2-VL-7B-Instruct 是一个强大的多模态大语言模型,支持文本和图像的联合理解与生成。为了使其在特定任务或领域上表现更优,微调(Fine-tuning)是一个关键步骤。本文将详细介绍如何对通义千问2-VL-7B-Instruct…...
IDEA XML 文件 SQL 提示
首先连接到对应的数据库。Database 里面要填写对应的数据库名称 配置当前项目的 SQL 方言,例如我这里是 MySQL 数据库管理系统,那么就选择 MySQL 此时就有 SQL 语法、表名、字段名等提示信息了...
Node.js 模块系统
Node.js 模块系统 1. 引言 Node.js,作为一个轻量级、高效的服务器端 JavaScript 运行环境,其模块系统是其最核心的特性之一。Node.js 的模块系统允许开发者将代码组织成多个文件,每个文件都是一个模块,这样可以提高代码的可维护性和可重用性。本文将详细介绍 Node.js 的模…...
面试题:@Transactional 注解在自调用情况下会失效原因
Transactional 注解在自调用情况下会失效,这主要是由于 Spring 事务管理的实现机制所导致的。以下是对这一问题的详细解释: 一、Spring 事务管理的实现机制 Spring 的事务管理是基于 AOP(面向切面编程)实现的,它通过…...
KMP 2024 年总结,Kotlin 崛起的一年
2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…...
super_vlan
Super VLAN产生的背景 就经典的酒店例子来说,若是将101房和102房的网络划分在同一个vlan下面,那么101房出现了一个懂得某些安全技术的大佬,就会使得102房的隐私得到严重的隐患 所以这时我们就需要将二层给隔离开,但又要去保证10…...
Harbor仓库部署安装、向仓库推送,拉取镜像、容器的基础使用(超级详细,非常透彻)
Harbor 环境搭建笔记 作为新手,在搭建 Harbor 环境的过程中,我参考了大量资料,学到了很多宝贵的知识,但也遇到了不少挑战。虽然目前这套环境仅在测试环境中成功运行,但仍有许多细节需要完善。记录这些经验不仅有助于个…...
【论文+源码】一个基于SSM(Spring + Spring MVC + MyBatis)的公寓电能计量系统
为了实现一个基于SSM(Spring Spring MVC MyBatis)的公寓电能计量系统,我们需要创建一个简单的Web应用程序来记录和显示每个公寓的电能使用情况。以下是一个基本的实现示例。 我们将包括以下几个部分: 数据库表设计实体类DAO层…...
开源架构的容器化部署优化版
上三篇文章推荐: 开源架构的微服务架构实践优化版(New) 开源架构中的数据库选择优化版(New) 开源架构学习指南:文档与资源的智慧锦囊(New) 我管理的社区推荐:【青云交社区…...
linux安装redis及Python操作redis
目录 一、Redis安装 1、下载安装包 2、解压文件 3、迁移文件夹 4、编译 5、管理redis文件 6、修改配置文件 7、启动Redis 8、将redis服务交给systemd管理 二、Redis介绍 1、数据结构 ①字符串String ②列表List ③哈希Hash ④集合Set ⑤有序集合Sorted Set 2、…...
万里数据库GreatSQL监控解析
GreatSQL是MySQL的一个分支,专注于提升MGR(MySQL Group Replication)的可靠性及性能。乐维监控平台可以有效地监控GreatSQL,帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理,收集数据库性…...
商米电子秤服务插件
概述 SunmiScaleUTS封装商米电子秤服务模块,支持商米旗下S2, S2CC, S2L CC等设备,设备应用于超市、菜市场、水果店等,用于测量商品的重量,帮助实现快捷、准确、公正的交易等一系列商业场景。 功能说明 SDK插件下载 一. 电子秤参数 型号:S2, S2CC, …...
Java-写一个计数器
一个简单的线程安全的计数器实现。我们将使用AtomicInteger来确保计数操作是线程安全的,并 且提供基本的增减和获取计数值的功能。 简单线程安全计数器 import java.util.concurrent.atomic.AtomicInteger;public class Counter {private final AtomicInteger count = new …...
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”解决方案: 1.用get-ExecutionP…...
微信小程序 单选多选radio/checkbox 纯代码分享
单选按钮 <radio-group class"radiogroup" bindchange"radioChange"> <label class"radio" wx:for"{{items}}"> <radio value"{{item.name}}" checked"{{item.checked}}" /> {{item.value}} &…...
Visual Studio 2022安装教程
1、下载网址 Visual Studio 2022 IDE安装网址借助 Visual Studio 设计,具有自动完成、构建、调试、测试功能的代码将与 Git 管理和云部署融为一体。https://visualstudio.microsoft.com/zh-hans/vs/ 点击图片所示 双击运行 2、安装 点击C桌面开发(右边…...
批量读取pdf发票中二维码的信息
如下代码Java类: import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.metadata.Writ…...
Apache Hive常见问题
入门问题 什么是Apache Hive? 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的?与传统关系型数据库相比,使用Hive有什么优势? Hive和关系型数据库管理系统(RDBMS)之间的区别是什么&#…...
SpringCloud源码分析-Gateway
Gateway核心原理,请求经过一系列的责任链最后到达服务端。...
基于N-HiTS神经层次插值模型的时间序列预测——cross validation交叉验证与ray tune超参数优化
论文链接:https://arxiv.org/pdf/2201.12886v3 N-HiTS: Neural Hierarchical Interpolation for TimeSeries Forecasting \begin{aligned} &\text{\large \color{#CDA59E}N-HiTS: Neural Hierarchical Interpolation for TimeSeries Forecasting}\\ \end{aligne…...
Windmill 实战:快速构建自动化工作流和用户界面
1. 引言 在当今快节奏的开发环境中,能够快速构建内部工具和自动化工作流的平台变得越来越重要。Windmill 就是这样一个强大的开源开发者基础设施平台,它能够将脚本自动转换为工作流程和用户界面。本文将深入探讨 Windmill 的使用,从安装到实际应用,帮助您了解如何利用这个…...
51c自动驾驶~合集44
我自己的原文哦~ https://blog.51cto.com/whaosoft/12969097 #Towards Generalist Robot Policies 清华大学&字节 | 迈向通用机器人策略:如何选择VLA? 论文标题:Towards Generalist Robot Policies: What Matters in Building Vision…...
设计模式 创建型 工厂模式(Factory Pattern)与 常见技术框架应用 解析
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种封装对象创建过程的方式,使得对象的创建与使用分离,从而提高了系统的可扩展性和可维护性。 一、核心思想 工厂模式的核心思想是将“实例化对象”的操作与…...
ElasticSearch7.10-分词器
文章目录 分词器1.字符过滤器1.介绍2.过滤html标签3.mappings过滤规则(屏蔽非文明用语)4.正则替换 2.自定义分词器1.代码2.查询 3.中文分词器1.下载ik分词器7.10.0版本(跟es对应)2.应用ik分词器1.进入插件目录下创建一个ik目录2.将…...
MLP、CNN、Transformer 的区别解析
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
Android Camera压力测试工具
背景描述: 随着系统的复杂化和业务的积累,日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化,需要对Android Camera应用进行全面的压测。 对于压…...
[Qt] 常用控件 | QWidget | “表白程序2.0”
目录 一、控件概述 控件体系的发展阶段: 二、QWidget 核心属性 核心属性概览: 1、enabled 2、Geometry 实例 1: 控制按钮的位置 实例 2: 表白 程序 i、Window Frame 的影响 ii、API 设计理念 iii、Geometry 和 FrameGeometry 的区别 …...
word无法插入svg格式图片
插入后出现这样的窗口,表明word版本低,没有svg这个选项。 因此这就是区别。在b站找升级word视频。...
【UE5 C++课程系列笔记】20——共享指针的简单使用
目录 概念 创建共享指针示例 重设共享指针 共享指针内容转移 概念 共享指针(主要以 TSharedPtr 为例),TSharedPtr 基于引用计数机制来工作,旨在解决对象所有权共享以及确保在合适的时候自动释放对象资源的问题。它允许多个 TS…...
Oracle 数据库 dmp文件从高版本导入低版本的问题处理
当前有个需求是将oracle 19c上的数据备份恢复到oracle 11g上使用。我们通过exp命令远程进行备份,然后通过imp进行恢复时出现IMP-00010: not a valid export file, header failed verification报错。 这是数据库版本问题,在使用exp命令导出的时候使用的客…...
Tomcat优化指南
以下是一份详细的Tomcat优化指南: 一、JVM(Java虚拟机)优化 内存设置 堆内存(Heap Memory) 调整-Xms(初始堆大小)和-Xmx(最大堆大小)参数。一般来说,将初始…...
本地调试自定义Maven Plugin步骤
添加自定义插件到dependencies 找到对应依赖的类,打上断点。 debug运行插件。...
css实现文字描边
效果 学习啦 -webkit-text-stroke-width: 设置文本描边的宽度,值可以是任何长度单位(如 px, em, rem 等) -webkit-text-stroke-color:设置文本描边的颜色,值可以是任何颜色值(如 red, green, bl…...
B2B营销的新篇章:开源AI智能名片S2B2C商城小程序的应用探索
摘要: B2B营销,作为企业间营销活动的总称,因其独特的业务特性而呈现出不同于B2C营销的显著特征。在数字化转型的大潮中,B2B企业正积极探索新的营销手段以提高效率和竞争力。本文旨在探讨B2B营销的基本特性,并重点引入…...
坐标系统转换方法研究与实现
坐标系统转换方法研究与实现 摘要:坐标系统是测量工作中定位的基础,坐标系统有很多形式和基准,不同历史时期所建立和使用的坐标系是不同的。随着科学技术的进步,测量方法和观测技术不断改进,采用的参考椭球及定位方式也逐步完善和精化。为更加精确的确定点位信息并综合利…...
naive ui 使用地址记录
naive ui 地址Naive UI Naive UI 是一个 Vue3 的组件库。 要了解如何安装,参见安装。 它比较完整,主题可调,用 TypeScript 写的,快...
std__invoke 的使用
std__invoke 的使用 文章目录 std__invoke 的使用1. std::invoke 的功能2. 语法3. 使用场景1. 调用普通函数2. 调用成员函数3. 调用成员函数(通过指针或引用)4. 调用函数对象(仿函数)5. 调用 Lambda 表达式 4. std::invoke 的优势…...
【Vue】深入理解v-model指令-父子组件数据绑定
一、什么是v-model? v-model是Vue.js中的一个指令,用于在表单元素上实现数据的双向绑定。简单来说,v-model可以让我们轻松地读取和更新数据,无需手动操作DOM。 二、标签选择器组件分析 我们先来看一下子组件的代码:…...
html+css+js网页设计 美食 六角西餐厅美食3个页面
htmlcssjs网页设计 美食 六角西餐厅美食3个页面 (带js) 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取…...
ubuntu 常见问题(持续记录)
1 ubuntu server 22.04 设置静态 IP ubuntu server 在重启之后,IP 会变化,这很不利于作内网穿透,因此很有必要使用静态 IP。 登录进系统之后: cd /etc/netplan/ ls # 我这里是 50-cloud-init.yamlifconfig # 查看网卡接口&…...
网络安全 | 物联网安全:从设备到网络的全方位防护
网络安全 | 物联网安全:从设备到网络的全方位防护 一、前言二、物联网设备安全2.1 物联网设备的特点与安全风险2.2 物联网设备安全防护策略 三、物联网网络通信安全3.1 物联网网络通信的安全挑战3.2 物联网网络通信安全防护措施 四、物联网数据安全4.1 物联网数据的…...