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

【C++】构造函数与析构函数

写在前面

构造函数与析构函数都是属于类的默认成员函数!
默认成员函数是程序猿不显示声明定义,编译器会中生成。

构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的,关于类与对象不才在前面笔记中有详细的介绍:点我跳转


文章目录

  • 写在前面
  • 一、构造函数的特性
    • 1.1、函数名与类名相同。
    • 1.2、 无返回值。
    • 1.3、 对象实例化时编译器自动调用对应的构造函数。
    • 1.4、构造函数可以重载。
    • 1.5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
    • 1.6、无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。
    • 1.7、构造函数的初始化列表
  • 二、析构函数
    • 2.1、析构函数名是在类名前加上字符 ~
    • 2.2、无参数无返回值类型
    • 2.3、一个类只能有一个析构函数。
    • 2.4、对象生命周期结束时,C++编译系统系统自动调用析构函数。
    • 2.5、编译器生成的默认析构函数,对自定类型成员调用它的析构函数
    • 2.6、如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数


一、构造函数的特性

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

其特征如下:

1.1、函数名与类名相同。

1.2、 无返回值。

1.3、 对象实例化时编译器自动调用对应的构造函数。

在这里插入图片描述

class stack {
public:stack() {//构造函数cout << "this is stack()" << endl;}void Init(int defintCapacity) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}
private:int* _arr;int _size;int _capacity;
};int main() {stack s1;return 0;
}

程序运行结果:
在这里插入图片描述

  • 在上述代码中,不才创建了一个默认构造函数stack,在构造函数中,我们只让其打印字符串this is stack(),之后,我们在s1对象中,并没有显示的调用构造函数,但是字符串就被打印出来了,这就说明的对象实例化时编译器自动调用对应的构造函数

这时候,我们就可以把stack的初始化函数设置放入构造函数中,每当我们创建一个对象时,通过构造函数自动初始化数据。如下:

class stack {
public:stack(int defintCapacity = 4) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}
private:int* _arr;int _size;int _capacity;
};int main() {stack s1;return 0;
}

运行结果:
在这里插入图片描述

  • 这时候,我们就不用每次都显示的初始化数据了,而且也不怕忘记初始化。

1.4、构造函数可以重载。

构造函数也是函数,是函数就可以重载
在这里插入图片描述

class stack {
public:stack(int defintCapacity = 4) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;}stack(int* arr, int defintCapacity) {if (nullptr == arr) {perror("malloc申请空间失败");return;}_arr = arr;_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}
private:int* _arr;int _size;int _capacity;
};int main() {int* arr = (int*)calloc(2, sizeof(int));stack s1(arr, 2);return 0;
}

程序运行结果:
在这里插入图片描述
和函数重载一样的逻辑,编译器会根据符号名去调用对应的构造函数。
需要注意,调用默认构造函数不需要加括号,因为加上括号后,编译器会认为是函数

举个栗子:
stack s1:这时s1代表的是调用stack的默认构造函数的对象
stack s1():这时s1就被当做,返回值是stack类且没有形参的函数。
有参调用就和普通函数一样,只不过是对象+参数列表stack s1(arr, 2)


1.5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。

默认构造函数在C++中有特殊定义,在C++标准中,默认构造函数不会对内置类型进行处理,自定义类型会调用它的默认构造函数。但是现在有些编译器会对内置类型进行初始化,但这是该编译器自己的行为,C++标准中是不进行处理的。

内置类型/基本类型:语言本身定义的基础类型(如intchar、指针、double等)
自定义类型:使用classstruct等定义的类型

在这里插入图片描述

class stack {
public:stack(int defintCapacity = 4) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;}stack(int* arr, int defintCapacity) {if (nullptr == arr) {perror("malloc申请空间失败");return;}_arr = arr;_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}
private:int* _arr;int _size;int _capacity;
};class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};
int main() {Date d1;return 0;
}

程序运行结果:(在vs2022环境下)
在这里插入图片描述

在默认构造函数中,并不会对定义类型进行任何操作,貌似不能证明默认构造函数的存在,但是我们把Date类设置为,下程序时:

class stack {
public:stack(int defintCapacity = 4) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;}stack(int* arr, int defintCapacity) {if (nullptr == arr) {perror("malloc申请空间失败");return;}_arr = arr;_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}
private:int* _arr;int _size;int _capacity;
};class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private://内置类型int _year;int _month;int _day;//自定义类型stack _st;
};int main() {Date d1;return 0;
}

运行结果:(在VS2013编译器中)
在这里插入图片描述

  • 在vs2013中,我们可以清晰看出内置类型不会进行处理的,而自定义类型会调用其默认构造函数

但是我们在VS2022中尝试一下

在这里插入图片描述

  • 我们发现在vs2022编译环境下,有自定义类型情况中,内置类型会被初始化为0,在上例中,我们也发现,在没有自定义类型情况中,内置类型是不会处理的

所以,不才推荐在C++中类中,我们默认内置类型是未被处理的,自定义类型是会调用其默认构造函数的,这样不会出现程序运行错误。

C++11后,对成员变量做了一个补丁,可以在声明成员变量时给定一个缺省值。

在这里插入图片描述
这里不才以内置类型为例,

class Date
{
public:Date(){}Date(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private://内置类型 //这里不是初始化,而是声明//这里给的是默认缺省值,给编译器生成默认构造函数时使用int _year = 1;int _month = 1;int _day = 1;};int main() {Date d1;d1.Print();return 0;
}

程序运行结果:

在这里插入图片描述
如果我们调用默认构造函数,那么内置类型的值就是程序猿给定的缺省值。如果我们调用不是默认构造函数,那么使用的就是自定义构造函数的值,如下图。
在这里插入图片描述

什么情况下可以直接使用默认构造函数:

  • 内置类型成员都有缺省值,且初始化符合要求
  • 全部都是自定义类型成员,且这些类型都定义了默认构造函数。

1.6、无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。

虽然在语法中,无参的构造函数和全缺省的构造函数形参了函数重载,编译不会有错,但是在对象初始化时,无参调用存在歧义。

在这里插入图片描述

class Date
{
public:Date() {}Date(int year = 2035, int month = 1, int day = 1) {_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year = 1;int _month = 1;int _day = 1;};int main() {Date d1;d1.Print();return 0;
}

程序运行结果:

在这里插入图片描述

  • 无参构造函数和全缺省的构造函数都是不需要传参调用的,所以在函数调用时,就会报错对重载函数的调用不明确

无参构造函数全缺省构造函数、我们没写编译器默认生成的构造函数,只要不传参就可以调用的,都可以认为是默认构造函数,而默认构造函数只能存在一个!

1.7、构造函数的初始化列表

构造函数体赋值

在上述的构造器中,我们构造函数内进行的操作是构造函数体赋值,这些操作只是赋值,并不是属性的初始化定义。如下

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
  • _year = year; _month = month;_day = day;这些在构造器中只是充当赋值的作用,并不是对属性_year_month_day的初始化定义。因为初始化只能初始化一次,而构造函数体内可以多次赋值。

初始化列表把类中的所有属性进行初始化定义

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个 “成员变量” 后面跟一个放在括号中的初始值或表达式。如下代码

class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),_day(day)//,_day(day) err:最多只能出现一次{}
private:int _year;int _month;int _day;
};
  1. 每个成员变量在初始化列表中最多只能出现一次(初始化只能初始化一次)
  2. 类中包含以下成员必须在初始化列表位置进行初始化
    • 引用成员变量
    • const成员变量
    • 自定义类型成员(且该类没有默认构造函数时)

因为引用成员变量const成员变量在初始化时,必须要进行赋值。而自定义类型成员。构造函数编译器只会调用自定义类型的默认构造函数,如果没有默认构造函数的情况编译器就无法找到自定义类型所对应的构造函数。

在这里插入图片描述
引用成员变量const成员变量 不在初始化列表进行初始化。而在构造函数体赋值中进行赋值来达到初始化。

在这里插入图片描述

自定义类型在没有默认构造函数的情况下,让编译器自己去寻找默认构造函数。

在这里插入图片描述
所以我们就必须在属性初始化的时候赋初值。如下代码:

class A {
public:A(int a):_a(a){	}
private:int _a = 0;
};class Date
{
public:Date(int year, int month, int day):_year(year),_month(month),aa(10){}
private:A aa;const int _year;int& _month;int _day;
};

尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。 对于内置类型也是在初始化列表中进行初始化。

我们属性都是在初始化列表中进行初始化构造函数体赋值一般是完成初始化列表不能完成的工作。如检查动态开辟内存是否为空等操作。
在这里插入图片描述

class stack {
public:stack(int size):_arr( (int*)malloc(sizeof(int) * size) ),_capacity(0),_size(size){//检查_arr动态开辟的空间是否为空if (_arr == nullptr) {perror("malloc::>");exit(1);}//再把_arr初始化为0memset(_arr, 0, (sizeof(int) * size) );}private:int* _arr;int _capacity;int _size;
};int main() {stack s1(10);return 0;
}

成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

在这里插入图片描述
在上述的stack类中,很多小伙伴在动态开辟_arr的初始化时,先在初始化列表时把_size放在了_arr的前面,之后把_arr计算空间大小的size使用了属性的_size这样导致的程序崩溃

class stack {
public:stack(int size): _capacity(0), _size(size),_arr( (int*)malloc(sizeof(int) * _size) ){//检查_arr动态开辟的空间是否为空if (_arr == nullptr) {perror("malloc::>");exit(1);}//再把_arr初始化为0memset(_arr, 0, (sizeof(int) * size) );}private:int* _arr;int _capacity;int _size;
};int main() {stack s1(10);return 0;
}
  • 这时候初始化顺序是先初始化_arr数组,此时_size并没有被初始化,那么这时候_size就是一个随机值。
  • 我们使用一个巨大的随机值去动态开辟一个空间,那么动态开辟出来的空间也是一个巨大的空间,所以程序会崩溃。
  • 只有初始化完了_arr数组,再初始化_capacity,最后初始化_size

为了深刻理解:我们再举个栗子,下面程序运行结果是什么。

class A
{
public:A(int a):_a1(a), _a2(_a1){}void Print() {cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};int main() {A aa(20);aa.Print();
}
  • 根据我们理解的:成员变量在类中声明次序就是其在初始化列表中的初始化顺序,此时程序的运行结果为:20 随机值

不才这里建议:声明的顺序与初始化列表顺序保持一致

二、析构函数

析构函数:与构造函数功能相反析构函数不是完成对对象本身的销毁局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数完成对象中资源的清理工作

析构函数是特殊的成员函数,其特征如下:

2.1、析构函数名是在类名前加上字符 ~

2.2、无参数无返回值类型

2.3、一个类只能有一个析构函数。

若未显式定义,系统会自动生成默认的析构函数。注意:析构函数没有形参所以不能重载

2.4、对象生命周期结束时,C++编译系统系统自动调用析构函数。

在这里插入图片描述

class Date
{
public:Date() {cout << "Date()" << endl;}Date(int year, int month, int day) {_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Date() {cout << "~Date()" << endl;}private:int _year = 1;int _month = 1;int _day = 1;};int main() {Date d1;{//创建了代码块用于验证:对象生命周期结束时,C++编译系统系统是否会自动调用析构函数Date d2;d2.Print();printf("\n");cout << &d2 << endl;}printf("\n");d1.Print();return 0;
}

程序运行结果:

在这里插入图片描述


2.5、编译器生成的默认析构函数,对自定类型成员调用它的析构函数

在这里插入图片描述

class stack {
public:stack(int defintCapacity = 4) {_arr = (int*)calloc(defintCapacity, sizeof(int));if (nullptr == _arr){perror("malloc申请空间失败");return;}_capacity = defintCapacity;_size = 0;cout << "stack()" << endl;}stack(int* arr, int defintCapacity) {if (nullptr == arr) {perror("malloc申请空间失败");return;}_arr = arr;_capacity = defintCapacity;_size = 0;}void push(int x) {//....扩容等_arr[_size++] = x;}~stack() {free(_arr);_arr = nullptr;cout << "~stack()" << endl;}
private:int* _arr;int _size;int _capacity;
};class Date
{
public:Date() {cout << "Date()" << endl;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private://内置类型 给定缺省值int _year = 1;int _month = 1;int _day = 1;//自定义类型stack _st;
};int main() {Date d1;d1.Print();return 0;
}

程序运行结果:

在这里插入图片描述

  • main方法中创建了Date对象d1,而d1中包含4个成员变量,其中_year, _month,_day三个是内置类型成员,销毁时不需要资源清理,最后系统直接将其内存回收即可。
  • 但是_ststack类的对象,所以在d1销毁时,要将其内部包含的stack类的_st对象销毁,所以要调用stack类的析构函数
  • main函数中不能直接调用stack类的析构函数,实际要释放的是Date类对象,所以编译器会调用Date类的析构函数,而Date没有显式提供,则编译器会给Date生成一个默认的析构函数,目的是在其内部调用stack类的析构函数,即当Date对象销毁时,要保证其内部每个自定义对象都可以正确销毁

2.6、如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数

析构函数的使用:

  1. 一般情况下,有动态申请资源 ,就需要显示写析构函数释放资源
  2. 没有动态申请资源,不需要写析构函数
  3. 需要释放资源的类型都是自定义类型,在该类中就不需要写析构函数。因为默认生成的析构函数遇到自定义类型会自动调用自定义类型的析构函数
  4. 特殊场景特殊使用

以上就是本章所有内容。若有勘误请私信不才。万分感激💖💖 如果对大家有用的话,就请多多为我点赞收藏吧~~~💖💖
请添加图片描述

ps:表情包来自网络,侵删🌹

相关文章:

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…...

力扣刷题汇总

动态规划 1 . 最大子序和 (Maximum Subarray Sum) Leetcode 53. 最大子数组和 经典dp 问题描述&#xff1a;给定一个整数数组&#xff0c;求其中和最大的连续子数组的和。 状态定义&#xff1a;dp[i] 表示以第 i 个元素结尾的最大子序和。 2 . 最长公共子序列 (Longest Commo…...

Ansible自动化运维:基础与实践

在当今的IT运维领域&#xff0c;Ansible作为一款强大的自动化运维工具&#xff0c;正发挥着日益重要的作用。本文将详细介绍Ansible的相关知识&#xff0c;包括其作用、特点、安装配置以及常用模块的使用方法&#xff0c;旨在帮助读者快速上手并熟练运用Ansible进行自动化运维工…...

微信小程序在使用页面栈保存页面信息时,如何避免数据丢失?

微信小程序在使用页面栈保存页面信息时避免数据丢失的方法&#xff1a; 一、使用全局变量存储关键数据&#xff1a; 定义一个全局变量&#xff0c;例如在 app.js 中&#xff0c;用于存储页面的重要信息。在页面的 onHide 或 onUnload 生命周期中&#xff0c;将需要保存的数据…...

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…...

vue3+vite+ts+router4+Pinia+Axios+sass 从0到1搭建

1、使用vite构建项目 npm create vitelatest 填写项目名的时候不能大写 2、跑起来之后配置下 import { defineConfig } from vite import vue from vitejs/plugin-vue import { resolve } from path // https://vite.dev/config/ export default defineConfig({plugins: [vue…...

C语言:-三子棋游戏代码:分支-循环-数组-函数集合

思路分析&#xff1a; 1、写菜单 2、菜单之后进入游戏的操作 3、写函数 实现游戏 3.1、初始化棋盘函数&#xff0c;使数组元素都为空格 3.2、打印棋盘 棋盘的大概样子 3.3、玩家出棋 3.3.1、限制玩家要下的坐标位置 3.3.2、判断玩家要下的位置是否由棋子 3.4、电脑出棋 3.4.1、…...

前端调试遇到的无限debugger的原理与绕过

背景 debugger 是 JavaScript 中定义的一个专门用于断点调试的关键字,只要遇到它,JavaScript 的执行便会在此处中断,进入调试模式。有了 debugger 这个关键字,我们就可以非常方便地对 JavaScript 代码进行调试,比如使用 JavaScript Hook 时,我们可以加入 debugger 关键字…...

Java负载均衡

Java中的负载均衡原理是指通过合理分配网络请求或计算任务的方式&#xff0c;将工作负载分配到多个服务器、处理单元或服务实例上&#xff0c;从而提高系统的性能、可扩展性和可用性。负载均衡不仅可以分散请求压力&#xff0c;还能增强系统的容错能力&#xff0c;避免单点故障…...

spark,读取和写入同一张表问题

读取a表&#xff0c;写入a表 1.写入的是分区表&#xff0c;不报错 2.读取上来之后&#xff0c;创建为临时视图temp&#xff0c;然后先写入a表&#xff0c;再使用temp&#xff0c;就会报错 解决办法&#xff1a;可以先使用temp&#xff0c;再写入a表 3.写入的不是分区表&…...

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说&#xff0c;命令的各个部分含义如下&#xff1a; …...

HIVE技术

本文章基于黑马免费资料编写。 hive介绍 简介 hive架构 hive需要启动的配置 执行元数据库初始化命令 使用hive必须启动的服务 ./schematool -initSchema -dbType mysql -verbos启动 Hive 创建一个 hive 的日志文件夹 mkdir /export/server/hive/logs启动元数据管理服务 n…...

我的世界-与门、或门、非门等基本门电路实现

一、红石比较器 (1) 红石比较器结构 红石比较器有前端单火把、后端双火把以及两个侧端 其中后端和侧端是输入信号,前端是输出信号 (2) 红石比较器的两种模式 比较模式 前端火把未点亮时处于比较模式 侧端>后端 → 0 当任一侧端强度大于后端强度时,输出…...

GPU 硬件原理架构(一)

这张费米管线架构图能看懂了&#xff0c;整个GPU的架构基本就熟了。市面上有很多GPU厂家&#xff0c;他们产品的架构各不相同&#xff0c;但是核心往往差不多&#xff0c;整明白一了个基本上就可以触类旁通了。下面这张图信息量很大&#xff0c;可以结合博客GPU 英伟达GPU架构回…...

[Qt]窗口-QMainWindow类-QMenuBar、QToolBar、QStatusBar、QDockWidget控件

目录 1.QMainWindow类介绍 2.菜单栏-QMenuBar控件 创建菜单栏 添加菜单和菜单选项 triggered信号 设置快捷键 添加分割线 添加图标 使用案例 3.工具栏-QToolBar控件 使用介绍 设置停靠位置 设置浮动属性 设置移动属性 使用案例 4.状态栏-QStatusBar控件 状…...

Linux命令行工具-使用方法

参考资料 Linux网络命令&#xff1a;网络工具socat详解-CSDN博客 arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别_aarch64-elf-gcc aarch64-linux-gnu-CSDN博客 解决Linux内核问题实用技巧之-dev/mem的新玩法-腾讯云开发者社区-腾讯云 热爱学习地派大星-CS…...

HTML中如何保留字符串的空白符和换行符号的效果

有个字符串 储值门店{{thing3.DATA}}\n储值卡号{{character_string1.DATA}}\n储值金额{{amount4.DATA}}\n当前余额{{amount5.DATA}}\n储值时间{{time2.DATA}} &#xff0c; HTML中想要保留 \n的换行效果的有下面3种方法&#xff1a; 1、style 中 设置 white-space: pre-lin…...

ASP.NET Core WebApi接口IP限流实践技术指南

在当今的Web开发中&#xff0c;接口的安全性和稳定性至关重要。面对恶意请求或频繁访问&#xff0c;我们需要采取有效的措施来保护我们的WebApi接口。IP限流是一种常见的技术手段&#xff0c;通过对来自同一IP地址的请求进行频率控制&#xff0c;可以有效地防止恶意攻击和过度消…...

SparkSQL数据模型综合实践

文章目录 1. 实战概述2. 实战步骤2.1 创建数据集2.2 创建数据模型对象2.2.1 创建常量2.2.2 创建加载数据方法2.2.3 创建过滤年龄方法2.2.4 创建平均薪水方法2.2.5 创建主方法2.2.6 查看完整代码 2.3 运行程序&#xff0c;查看结果 3. 实战小结 1. 实战概述 在本次实战中&#…...

C++实现设计模式---外观模式 (Facade)

外观模式 (Facade) 外观模式 是一种结构型设计模式&#xff0c;为子系统中的一组接口提供一个一致的界面。外观模式定义了一个更高层次的接口&#xff0c;使得子系统更容易使用。 意图 简化复杂子系统的接口。为客户端提供一个统一的入口&#xff0c;屏蔽子系统的内部细节。 …...

计算机网络 (43)万维网WWW

前言 万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是Internet上集文本、声音、动画、视频等多种媒体信息于一身的信息服务系统。 一、基本概念与组成 定义&#xff1a;万维网是一个分布式、联机式的信息存储空间&#xff0c;通过超文本链接的方式将分散的信息…...

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中&#xff0c;字体的选择和使用对最终作品的质量有着重要影响。然而&#xff0c;有时我们可能会遇到包含未知字体的PDF文件&#xff0c;这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题&#xff0c;让我们能够更好地处理这些文件。…...

Docker Desktop 中安装 MySQL 并开启远程访问的详细教程

是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程&#xff1a; 一、安装 MySQL 容器 拉取 MySQL 镜像&#xff1a; docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL&#xff0c;可以将 latest 替换为具体…...

沸点 | 聚焦嬴图Cloud V2.1:具备水平可扩展性+深度计算的云原生嬴图动力站!

近日&#xff0c;嬴图正式推出嬴图Cloud V2.1&#xff0c;此次发布专注于提供无与伦比的用户体验&#xff0c;包括具有水平可扩展性的嬴图Powerhouse的一键部署、具有灵活定制功能的管理控制台、VPC / 专用链接等&#xff0c;旨在满足用户不断变化需求的各项前沿功能&#xff0…...

西门子【Library of Basic Controls (LBC)基本控制库”(LBC) 提供基本控制功能】

AF架构中使用的库 文章目录 Table of contents Legal information ..............................................................................................................................2 1 Introduction ................................................…...

EMQX集群搭建

集群搭建 通过使用 EMQX 集群&#xff0c;您可以在一个或多个节点发生故障时仍然保持集群运行&#xff0c;从而享受到容错和高可用性的好处。 尽管没有严格的上限&#xff0c;但建议在 EMQX 开源版中将集群大小限制为三个节点。仅使用核心类型节点时&#xff0c;较小的集群规模…...

【Flink系列】10. Flink SQL

10. Flink SQL Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理框架&#xff0c;无论是批处理&#xff08…...

Java安全—SPEL表达式XXESSTI模板注入JDBCMyBatis注入

前言 之前我们讲过SpringBoot中的MyBatis注入和模板注入的原理&#xff0c;那么今天我们就讲一下利用以及发现。 这里推荐两个专门研究java漏洞的靶场&#xff0c;本次也是根据这两个靶场来分析代码&#xff0c;两个靶场都是差不多的。 https://github.com/bewhale/JavaSec …...

TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG

注&#xff1a;本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态&#xff1a;SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层&#xff0c;有个 FLAGS 字段&#xff0c;这个字段有…...

OSPF的LSA的学习研究

OSPF常见1、2、3、4、5、7类LSA的研究 1、拓扑如图&#xff0c;按照地址表配置&#xff0c;激活OSPF划分相关区域并宣告相关网段 2、1类LSA&#xff0c;每台运行了OSPF的路由器都会产生&#xff0c;描述了路由器的直连接口状况和cost 可以看到R1产生了一条router lsa&#xff0…...

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里&#xff0c;阿杰正在他那充满科技感的实验室里&#xff0c;对着一堆奇奇怪怪的仪器发呆。突然&#xff0c;手机铃声如一道凌厉的剑气划破寂静&#xff0c;原来是工厂的赵厂长打来的紧急电话&#xff1a;“阿杰啊&#xff0c;咱们工厂新…...

wireshark 网络分析工具

✍作者&#xff1a;柒烨带你飞 &#x1f4aa;格言&#xff1a;生活的情况越艰难&#xff0c;我越感到自己更坚强&#xff1b;我这个人走得很慢&#xff0c;但我从不后退。 &#x1f4dc;系列专栏&#xff1a;网络安全从菜鸟到飞鸟的逆袭 目录 一、网络截获数据包的基础1、以太网…...

XXL-JOB 加入 GitCode:推动分布式任务调度进阶发展

在当今企业数字化转型加速的时代背景下&#xff0c;任务调度在保障系统高效运行方面的关键作用日益凸显。XXL-JOB 正式加入 GitCode&#xff0c;成为 G-Star 优秀毕业项目&#xff0c;为分布式任务调度领域带来了新的契机与活力&#xff0c;助力企业应对复杂多变的业务需求。 X…...

Java Web开发进阶——WebSocket与实时通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;广泛应用于需要实时数据交换的应用程序中。它能够实现服务器与客户端之间的双向通信&#xff0c;避免了传统 HTTP 请求/响应的延迟。结合 Spring Boot&#xff0c;开发实时通信应用变得更加高效与简便。 1. …...

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题

解决“无法定位程序输入点 av_buffer_create 于动态链接库 XXX\Obsidian.exe 上”问题 问题描述 本人在使用zotero中的zotero one&#xff08;青柠学术插件&#xff09;的时候&#xff0c;使用插件跳转obsidian中的对应笔记&#xff0c;出现上图情况。&#xff08;错误中提到的…...

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

分布式数据存储基础与HDFS操作实践(副本)

以下为作者本人撰写的报告&#xff0c;步骤略有繁琐&#xff0c;不建议作为参考内容&#xff0c;可以适当浏览&#xff0c;进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统&#xff08;HDFS&#xff09;的基本操作。 …...

Rust:指针 `*T` 和引用 `T`的区别

在 Rust 编程语言中&#xff0c;*T 和 &T 是两种不同类型的指针&#xff0c;它们各自代表了不同的内存访问方式和所有权模型。 *T&#xff08;原始指针或裸指针&#xff09;&#xff1a; *T 是一个原始指针&#xff08;也称为裸指针或裸引用&#xff09;&#xff0c;它可以…...

【2025最新版】PCL点云处理算法汇总(C++长期更新版)

博客长期更新&#xff0c;最近一次更新时间为&#xff1a;2025年1月17日。 pcl::copyPointCloud(*cloud, indicesY, *cloud_yboundary);目录 配库常用数据免费下载链接一、点云滤波1、常用滤波器2、采样滤波3、裁剪滤波 二、KD树与八叉树1、KD树2、八叉树 三、点云配准粗配准精…...

换了城市ip属地会变吗?为什么换了城市IP属地不变

当我们跨越城市的界限&#xff0c;从一个地方迁移到另一个地方时&#xff0c;许多日常使用的网络服务和应用程序都会感知到这种变化&#xff0c;其中一个显著的现象就是IP属地的变化。IP属地&#xff0c;即IP地址所在的地理位置信息&#xff0c;它通常与互联网服务提供商&#…...

mysql 如何快速删除表数据

在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...

Windows安装Jenkins——及修改主目录、配置简体中文、修改插件源

一、简介 Jenkinshttps://www.jenkins.io/zh/ Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 二、Windows安装配置Jenkins2.479 2.1、J...

【机器学习:二十二、机器学习项目开发的技巧】

机器学习项目开发的技巧 机器学习项目的开发不仅仅依赖于算法的选择和模型的调优&#xff0c;还需要良好的项目管理技巧和方法论。以下是机器学习项目开发中的关键技巧&#xff1a; 明确需求&#xff1a;在项目启动之前&#xff0c;明确问题定义和业务目标。例如&#xff0c;…...

用python实战excel和word自动化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 python实现excel和word自动化--批量处理 前言--需求快要期末了需要&#xff0c;提交一个年级的学生成绩数据&#xff0c;也就是几百份。当前我们收集了一份excel表格&#xf…...

Conda的一些常用命令

以下是Conda的一些常用命令&#xff1a; pip freeze > requirements.txt pip install -r requirements.txt 基本信息查看类 查看conda版本&#xff1a; conda -V 或 conda --version 可以查看当前安装的conda版本。 查看conda帮助信息&#xff1a; conda -h 或 conda --he…...

ESP8266 AP模式 网页配网 arduino ide

ESP8266的AP配网,可以自行配置网络,一个简单的demo,文档最后有所有的代码,已经测试通过. 查看SPIFFS文件管理系统中的文件 账号密码是否存在,如不存在进入AP配网,如存在进入wifi连接模式 // 检查Wi-Fi凭据if (isWiFiConfigured()) {Serial.println("找到Wi-Fi凭据&#…...

《AI与鸿蒙Next:建筑设计可视化的革新力量》

在建筑设计领域&#xff0c;可视化对于呈现设计理念、与客户沟通以及指导施工等环节都至关重要。人工智能与鸿蒙Next图形渲染技术的发展&#xff0c;为建筑设计可视化带来了前所未有的变革与机遇。 人工智能在建筑设计可视化中的作用 快速生成设计方案&#xff1a;人工智能可以…...

Edge Scdn是什么,它如何提升网站安全性与访问速度?

随着网络攻击的日益猖獗&#xff0c;尤其是分布式拒绝服务&#xff08;DDoS&#xff09;攻击的频繁发生&#xff0c;如何保护网站的安全性并确保用户的访问体验变得极为重要。Edge Scdn&#xff08;内容分发网络&#xff09;作为一种新兴的技术方案&#xff0c;逐渐被越来越多的…...

[Collection与数据结构] PriorityQueue与堆

1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场景下&#xff0c;使用队列显然…...

C#调用OpenCvSharp实现图像的开运算和闭运算

对图像同时进行腐蚀和膨胀操作&#xff0c;顺序不同则效果也不同。先腐蚀后膨胀为开运算&#xff0c;能够消除小斑点和细小的突出物、平滑图像以及改善边缘&#xff1b;先膨胀后腐蚀为闭运算&#xff0c;能够去除噪点、填补图像孔洞、连接邻近物体和平滑物体边界。   OpenCvS…...