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

C++ 结构体与函数

一.结构体

1.概念:

结构体(struct)是一种用户自定义复合数据类型,其中可以包含不同类型的不同成员

2.结构体的应用场景:

我们在使用多个变量描述一个对象时,虽然也可以做到,但是难免显得杂乱和繁琐,比如我们在描述一个人时,经常会使用例如姓名、年龄、性别等等属性来描述他,那么在这种情况下,我们使用结构体就会显得一切都有序起来

3.结构体的声明定义和使用的基本语法:

#include"iostream"
using namespace std;int main() {// 声明结构体/*struct 结构体类型 {成员1类型 成员1名称;...成员N类型 成员N名称; }; */// 结构体声明案例:// 在此案例中我们声明了一个Student结构体,也就是一个学生对象,其中包含name,age,gender三个属性struct Student {string name;int age;string gender;}; // 在结构体变量的声明中,可以在前面带上struct关键字(也可以省略不写)// 但是还是建议写上,可以清晰的知道变量是自定义结构体类型的Student stu1; // 创建一个叫做stu1的结构体变量struct Student stu2; // 创建一个叫做stu2的结构体变量// 为结构体变量赋值stu1 = {"zhansgan", 18, "男"};stu2 = {"lisi", 19, "女"};// 若是想要输出结构体变量,不能使用cout << stu1 << endl;的形式// 因为结构体变量是一个整体的包装,无法直接cout输出// 那么如果想要输出的话,就需要访问它的每一个成员进行输出,访问语法:结构体变量.成员名称cout << stu1.name << endl;cout << stu1.age << endl;cout << stu1.gender << endl;cout << stu2.name << endl;cout << stu2.age << endl;cout << stu2.gender << endl;//我们还可以在初始化一个结构体变量时就对其中的数值进行定义:struct Student stu3 = {"wangwu", 20, "男"};cout << stu3.name << endl;cout << stu3.age << endl;cout << stu3.gender << endl;return 0; 
}

4.结构体成员默认值:

在我们设计一个结构体的时候,可以根据需要向成员设置默认值

如下:

#include"iostream"
using namespace std;int main() {// 定义一个Student结构体struct Student {string name;int age = 18; // 默认年龄为18string gender = "男"; // 默认性别为男};// 创建两个结构体变量,一个使用结构体成员默认值,一个不使用struct Student stu1 = {"zhangsan"};struct Student stu2 = {"lisi", 20, "女"};cout << stu1.name << endl;cout << stu1.age << endl;cout << stu1.gender << endl;cout << endl;cout << stu2.name << endl;cout << stu2.age << endl;cout << stu2.gender << endl;return 0;
}

5.结构体数组

作为用户自定义数据类型,结构体是支持数组模式的

#include"iostream"
using namespace std;int main() {/*// 声明数组对象[struct] 结构体类型 数组名[数组长度];// 赋值数组的每一个元素数组名[0] = {a, b, ...};数组名[1] = {c, d, ...};...//声明和赋值同步的快捷写法[struct] 结构体类型 数组名[数组长度] = {{第一个数组中的数值}, {第二个数组中的数值}, ..., {第n个数组中的数值}};*/struct Student {string name;int age;string  gender;};struct Student stu[3]; // 结构体数组对象的声明// 对创建的结构体数组对象进行赋值stu[0] = {"zhangsan", 18, "男"};stu[1] = {"lisi", 19, "女"};stu[2] = {"wangwu", 20, "男"};// 使用for循环遍历结构体数组对象中的成员for (int i = 0; i < 3; i++) {cout << stu[i].name << endl;cout << stu[i].age <<endl;cout << stu[i].gender << endl;cout << endl;}// 在对结构体数组声明的同时对其进行赋值:struct Student student[3] = {{"chen", 21, "男"},{"zhang", 22, "女"},{"li", 23, "男"}};for (int i = 0; i < 3; i++) {cout << student[i].name << endl;cout << student[i].age <<endl;cout << student[i].gender << endl;cout << endl;}return 0;
}

6.结构体指针

作为一种数据类型,结构体同样支持使用指针

(1).引入已经存在的结构体地址

(2).通过new操作符申请指针空间

注意:在我们使用指针变量访问结构体成员时需要更换操作符号为:->

#include"iostream"
using namespace std;int main() {struct Student {string name;int age;string  gender;};// 先创建一个结构体对象struct Student stu = {"zhangsan", 18, "男"};// 引入已经存在的结构体地址struct Student *p1 = &stu; // 注意这里的取地址符,也就是&,指针中存储的是地址,必须加上这个符号获取该变量的地址// 通过结构体指针访问结构体的成员,其中我们需要使用的符号是:->cout << p1->name << endl;cout << p1->age << endl;cout << p1->gender << endl;// 通过new操作符申请指针空间struct Student *p2 = new Student {"lisi", 19, "女"};cout << p2->name << endl;cout << p2->age << endl;cout << p2->gender << endl;return 0;
}

7.结构体指针数组

在结构体中可以使用指针数组,其主要用于动态内存分配,方便管理大量结构体占用的内存

(1).引入已经存在的结构体数组地址

(2).通过new操作符申请指针数组空间

注意:在我们使用指针变量访问结构体指针数组的成员时需要更换操作符号为一开始的:.

#include"iostream"
using namespace std;int main() {struct Student {string name;// 设置了默认值,省事儿int age = 18;string  gender = "男";};// 引入已经存在的结构体数组地址// 创建一个结构体数组struct Student stu1[3] = {{"zhangsan"}, {"lisi"}, {"wangwu"}};// 数组的存储方式本来就是地址,所以不需要使用取地址符号取出该变量对应的地址struct Student *p1 = stu1;// 若要取出结构体指针数组中的成员不再是使用->符号,而是回到.for (int i = 0; i < 3; i++) {cout << p1[i].name << endl;cout << p1[i].age << endl;cout << p1[i].gender << endl;}// 通过new操作符自行申请结构体数组的空间(通过delete操作符回收)struct Student *p2 = new Student[3] {{"chen"}, {"li"}, {"wang"}};for (int i = 0; i < 3; i++) {cout << p2[i].name << endl;cout << p2[i].age << endl;cout << p2[i].gender << endl;}// 在使用结束之后使用delete操作符释放申请的空间,可以减轻内存压力delete[] p2;return 0;
}

二.函数

1.函数的概念:

函数是一个提前封装好的,可以重复使用的,完成特定功能的独立代码单元

2.使用函数的好处:

(1).提前封装:

提前准备好了代码逻辑

(2).可重复使用:

可以多次调用

(3).完成特定功能:

只用来完成我们所希望它完成的部分特定功能

3.函数的使用场景:

我们可以将针对特定功能的、有重复使用需求的代码提前封装到函数内,以便我们在需要的时候随时调用

4.函数的结构:

    函数返回值类型 函数名(传入参数1, 传入参数2, ..., 传入参数n) { // 共同构成了函数声明函数体;return 返回值;}

5.基础函数语法

注意:return语句执行之后函数就会立刻结束;函数不可以被定义在main函数内部

#include"iostream"
using namespace std;// 编写一个函数返回两个传入参数中的较大值
int max(int a, int b) {int max = a > b ? a : b;return max;
}
// 注意在return语句执行之后函数就会立刻结束,以及函数不可以被定义在main函数的内部int main() {// 调用函数int a = 10, b = 20;cout << max(a, b) << endl;return 0;
}

6.无返回值函数与void类型

函数的返回值并非是必须提供的,也就是说可以声明一个不提供返回值的函数

声明一个不提供返回值的函数时需要做到以下几点:

①:声明函数返回值类型为void(void表示“空”,用于声明无返回值函数)

②:不需要写return语句

③:调用者无法得到返回值

#include"iostream"
using namespace std;// 编写一个无返回值函数
void love(string name) {cout << "I love you, my lovely lover——" << name << endl;
}int main() {// 调用函数love("unmasked lover");love("my beauty");return 0;
}

7.空参函数

除了返回值以外,函数的传入参数也是可选的,也就是声明一个不需要传入参数的函数(括号是不能省略的嗷)

#include"iostream"
using namespace std;// 编写一个无返回值,同时无参的函数
void love() {cout << "I'll betray my instinct to fall in love with you, until the end of my life" << endl;
}int main() {// 调用函数while(1) {love(); // 无限循环,记得手动暂停嗷(别在没设置停止条件的时候这么写,我写着玩的)}return 0;
}

8.函数嵌套调用

函数作为一个独立的代码单元,可以在函数内调用其他函数,这种嵌套调用关系没有任何限制,可以根据需要无限嵌套

#include"iostream"
using namespace std;void yesturday() {cout << "I just want to love you" << endl;
}void today() {cout << "for three days," << endl;
}void tomorrow() {cout << "yesturday, today, and tomorrow." << endl;
}// 写出本函数调用上方的三个函数,需要注意的是我们需要先定义再调用,也就是说如果我们把函数定义在了调用处的下方就会报错
void love() {yesturday();today();tomorrow();
}int main() {// 调用函数while(1) {love(); // 无限循环,记得手动暂停嗷(别在没设置停止条件的时候这么写,我写着玩的)}return 0;
}

9.参数的值传递和地址传递

在这之前学习的函数的形参声明其实都是在使用“值传递”的参数传入方式,但是像这样的值传递方式会出现问题,例如:

#include"iostream"
using namespace std;// 这是一个交换两数之值的函数,但是值传递方式根本无法达到我们想要的效果
void exchange(int a, int b) {int temple = a;a = b;b = temple;
}int main() {int a = 10, b = 20;exchange(a, b);cout << a << " " << b << endl;// 你会发现像这样值传递的函数根本无法做到交换两个变量的值,这是因为交换的只是传递过去的形参的值,对两个变量中存储的数值而言并没有影响return 0;
}

那么为了不出现这样的问题,我们就需要进行地址(指针)的传递,将函数体的效果直接作用于内存上

#include"iostream"
using namespace std;// 地址传递方式下的值交换函数
void exchange(int *a, int *b) {int temple = *a;*a = *b;*b = temple;
}int main() {int a = 10, b = 20;exchange(&a, &b);// 地址传递方式之下就能够完成我们所想要的值交换效果了cout << a << " " << b << endl;return 0;
}

10.函数传入数组

由于数组对象本身只是第一个元素的地址,所以数组传参不区分值传递还是地址传递,从本质上来说都是地址传递(在传入数组时一般建议附带数组长度的传入,因为C++不会检查数组的内存边界)

#include"iostream"
using namespace std;// 传入函数后的数组由于已经变成了指针的形式,所以大小固定为8
void function(int arr[]) {cout << sizeof(arr) << endl;
}int main() {// 但是在main函数中计算的数组大小为数组长度*数据类型的大小int arr[3];// 所以在这里计算出的结果就是3*4(int类型数据的大小)cout << sizeof(arr) << endl;function(arr);return 0;
}

也因为传入函数后的数组有着这样的特点,所以我们很难在函数中计算出该数组的长度,所以一般都会在传入数组后顺带传入该数组的长度

#include"iostream"
using namespace std;// 在main函数中计算出数组的长度传入函数中,我们在函数里面很难获取数组长度
void function(int arr[], int length) {for (int i = 0; i < length; i++) {cout << arr[i] << endl;}
}int main() {int arr[10];for (int i = 0; i < 10; i++) {arr[i] = i;}int length = sizeof(arr) / sizeof(arr[0]);function(arr, length);return 0;
}

11.函数的引用传参

函数的形参还有引用传参这一形式

引用指的是变量的一个别名,它是某个已存在变量的另一个名字

注意:引用不是指针,指针可以修改指向,但是引用不行

引用的特点:

①:引用在创建后不可更改(更改它的指向到其他内存区域)

②:因为引用的不可更改特性,所以引用必须初始化

③:因为引用的必须初始化特性,所以引用不可为空(不可被修改)

引用的语法:

主要使用&表明引用

    数据类型& 引用名 = 被引用变量;

举例:

#include"iostream"
using namespace std;int main() {int a = 10;int& b = a;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}

虽然不可以改变引用的指向,但是可以改变引用指向中的内容,例如:

#include"iostream"
using namespace std;int main() {int a = 10;int& b = a;cout << "a = " << a << endl;cout << "b = " << b << endl;a = 20;cout << "a = " << a << endl;cout << "b = " << b << endl;a = 30;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}

12.引用传参

除了值传递和地址传递以外,函数也可以使用引用传递的形式传参,同时引用传参也是最为常见的传参方式

各种函数传参方式的对比:

①:值传递虽然会复制值,但是无法对实参本身产生影响

②:地址传递虽然会复制地址,可以对实参本身产生影响,但是指针的写法麻烦

③:引用传递可以像普通变量那样操作,但是对实参本身可以产生影响

#include"iostream"
using namespace std;// 定义形参,使用&表示传递引用的对象
void exchange(int &a, int &b) {int temple = a;a = b;b = temple;
}int main() {int a = 10, b = 20;exchange(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}
方式/特征形参定义传递内容对实参的影响是否直接内存操作
值传递普通变量(int)赋值变量值(数据传递)
地址传递指针变量(int*)赋值指针值(地址传递)
引用传递引用变量(int &)复制引用对象

13.返回指针的函数以及局部变量的生命周期

函数的返回值可以是一个指针(内存地址),语法为:

返回值类型 * 函数名(传入的形参) {函数体;return 指针;
}

注意:

①:在声明中,提供*,表示返回值是指针

②:return所返回的返回值一定要是一个指针变量

但是可能出现语法正确,但无法正常返回结果的情况,例如:

#include"iostream"
using namespace std;// 定义了一个加法函数
int* add(int a, int b) {int sum = a + b;return &sum;
}
// 虽然像这样的代码是符合语法的,但是无法正常返回结果
// 因为sum变量是一个局部变量,它的作用域仅在函数内,函数一旦执行完毕,sum变量就会被销毁,根本传不出去
// 这就是C++的静态内存管理的弊端,如果需要进行规避,那么就要用到动态内存管理(new和delete)int main() {int a = 10, b = 20;int* sum = add(a, b);cout << sum << endl;return 0;
}

局部变量:

①:在函数内部创建的变量

②:其作用范围仅在函数内部,函数一旦执行完毕就会将此变量销毁并且将其占用的内存空间释放

上述代码想要正确表达出效果的解决方式:

#include"iostream"
using namespace std;int* add(int a, int b) {// 动态分配一块空间给sum,这样sum才能正确地传递出去int* sum = new int;*sum = a + b;return sum;
}int main() {int a = 10, b = 20;int* sum = add(a, b);cout << *sum << endl;// 使用完毕之后记得delete删除动态分配出去的内存,减轻内存压力delete sum;return 0;
}

14.static关键字

(1).static是C++中的一个关键字,并且在众多的编程语言中都有static的应用

(2).static表示静态(将内容存入静态内存区域),可以修饰变量和函数

(3).当static修饰变量时,比如函数中的局部变量,可以将其的生命周期延长到整个程序的运行周期

函数内局部变量的特点:函数内static修饰的变量的特点:
函数运行结束后销毁程序运行结束后销毁

static关键字的语法:

在变量类型之前加入static关键字即可

例如:

#include"iostream"
using namespace std;// 使用static关键字将sum变量由局部变量转换为全局变量之后本函数依然能正常生效
int* add(int a, int b) {static int sum = a + b;return &sum;
}
// 在本例中,sum变量将会获得:
// ①:仅被初始化一次(在函数第一次调用时)
// ②:将持续存在(转换为全局变量,不会因函数运行结束而销毁)int main() {int a = 10, b = 20;int* sum = add(a, b);cout << *sum << endl;return 0;
}

15.函数返回数组

由于数组对象本身是第一个元素的地址,所以返回数组的本质就是返回指针

语法要求按照返回指针声明返回值,例如:

变量类型* 函数名() {...;return 数组名;
}

其中需要注意的是:返回的数组不可以是局部变量(因为其生命周期仅限函数内),可以返回全局数组或者static修饰的数组

错误案例:

int* function() {int arr[] = {1, 2, 3};return arr;
}
// 这样的方式就根本传递不出数组,因为该数组是在函数内部创建的,属于局部变量,一旦函数运行完毕就销毁

正确示范:

int* function() {static int arr[] = {1, 2, 3};return arr;
}
int* function() {int* arr = new int[3]{1, 2, 3};return arr;
}
int arr[3] = {1, 2, 3};
int* function() {return arr;
}

16.函数返回数组(改进)

前言:

一般不建议使用函数返回数组的方式

注意:

①:函数接受数组指针传入

②:调用函数前需要自行创建数组

③:传入数组到函数中进行操作

#include"iostream"
using namespace std;// 定义一个函数为数组中每个元素都+1,因为实际操作的是地址,所以能够正常生效
void plus_one(int* arr, int length) {for (int i = 0; i < length; i++) {arr[i] += 1;}
}int main() {int arr[3] = {0, 1, 2};plus_one(arr, 3);for (int i = 0; i < 3; i++) {cout << arr[i] << endl;}return 0;
}

17.函数默认值

在定义函数的时候我们可以指定函数的默认值,也就是说,调用函数不传入实参,则使用函数默认值进行代替

注意:

每个提供默认值的参数,其右侧参数也必须提供默认值(当不传递参数时,使用提供的默认值)

使用默认值的函数的案例:

#include"iostream"
using namespace std;void love(const string& name = "beauty") {cout << "I love you, my " << name << endl;
}int main() {love();love("little girl");return 0;
}

错误写法:

void add(int x = 3, int y, int z)
void add(int x, int y = 6, int z)

正确写法:

void add(int x = 3, int y = 6, int z = 9)
void add(int x, int y = 6, int z = 9)
void add(int x, int y, int z = 9)

相关文章:

C++ 结构体与函数

一.结构体 1.概念&#xff1a; 结构体&#xff08;struct&#xff09;是一种用户自定义复合数据类型&#xff0c;其中可以包含不同类型的不同成员 2.结构体的应用场景&#xff1a; 我们在使用多个变量描述一个对象时&#xff0c;虽然也可以做到&#xff0c;但是难免显得杂乱…...

【Java全栈】Java + Vue 项目框架与运行流程详解

文章目录 ⭐前言⭐一、框架介绍&#x1f31f;1、后端框架&#xff08;Java Spring Boot&#xff09;&#x1f31f;2、前端框架&#xff08;Vue 3 Element Plus&#xff09; ⭐二、项目结构&#x1f31f;1、后端目录&#xff08;Spring Boot&#xff09;&#x1f31f;2、前端目…...

JAVA:利用 JSONPath 操作JSON数据的技术指南

1、简述 JSONPath 是一种强大的工具&#xff0c;用于查询和操作 JSON 数据。类似于 SQL 的语法&#xff0c;它为处理复杂的 JSON 数据结构提供了简单且高效的解决方案。✨ 代码样例&#xff1a;https://gitee.com/lhdxhl/springboot-example.git 本文将介绍 JSONPath 的基本…...

5.2.1 WPF 通过ItemControl自己做柱状图

1. 最终效果如下图&#xff1a; 1.1 准备数据 ViewModel public class PrimaryItemModel{public double Value { get; set; }public string XLabel { get; set; }}public class MainViewModel{public ObservableCollection<PrimaryItemModel> PrimaryList { get; set; }…...

3.31 代码随想录第三十一天打卡

1049.最后一块石头的重量II (1)题目描述: (2)解题思路: class Solution { public:int lastStoneWeightII(vector<int>& stones) {vector<int> dp(15001, 0);int sum 0;for (int i 0; i < stones.size(); i) sum stones[i];int target sum / 2;for (in…...

基于网启PXE服务器的批量定制系统平台

一.项目背景 公司新购了一批服务器和台式机&#xff0c;需要为台式机和服务器安装系统&#xff0c;一部分需要安装国产OpenEuler&#xff0c;一部分要求安装CentOS 7.9&#xff0c;同时也要满足定制化需求&#xff0c;即按要求分区安装相应软件。 二.项目环境 安装win10/11 …...

Unity光线传播体积(LPV)技术实现详解

一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术&#xff0c;通过将场景中的间接光信息存储在3D网格中&#xff0c;实现动态物体的间接光照效果。 核心优势&#xff1a; 实时性能&#xff1a;相比传统光照贴图&#xff0c;支持动态场景 硬件…...

蓝桥杯备考---》贪心算法之矩阵消除游戏

我们第一次想到的贪心策略一定是找出和最大的行或者列来删除&#xff0c;每次都更新行和列 比如如图这种情况&#xff0c;这种情况就不如直接删除两行的多&#xff0c;所以本贪心策略有误 so我们可以枚举选的行的情况&#xff0c;然后再贪心的选择列和最大的列来做 #include …...

python+playwright 学习-93 结合pands 抓取网页表格数据

playwright 结合 pands 抓取网页表格数据 pandas 直接抓取网页表格数据 web 网页表格数据 """ 上海 202501 天气抓取 """ import pandas as pddf = pd.read_html(fhttp://www.tianqihoubao.com/lishi/shanghai/month/202501.html,encoding...

MVC编程

MVC基本概述 例子——显示本地文件系统结构 先分别拖入ListView,TableView,TreeView 然后在进行布局 在widget.cpp 结果 mock测试 1&#xff0c;先加入json测试对象 2.创建后端目录 3&#xff0c;在src添加新文件 在models文件夹里 在mybucket.h,添加测试用例的三个字段 4.在…...

51单片机总结

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.31 51单片机学习总结&#xff08;有感而发&#xff09; 一、总结结语 一、总结 一路…...

端到端语音识别案例

《DeepSeek大模型高性能核心技术与多模态融合开发&#xff08;人工智能技术丛书&#xff09;》(王晓华)【摘要 书评 试读】- 京东图书 语音识别这一技术正如其名&#xff0c;是通过精密地解析说话人的语音来识别并准确转写出其所说的内容。它不仅仅是一个简单的转录过程&#…...

iOS自定义collection view的page size(width/height)分页效果

前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定&#xff0c;并且还能实现的分页效果UI还是很常见的 实现 我们这里实现主要采用collection view&#xff0c;实现的方式是自定义一个UICollectionViewFlowLayout的子类&#xff0c;在这个类里对…...

CI/CD基础知识

什么是CI/CD CI&#xff1a;持续集成&#xff0c;开发人员频繁地将代码集成到主干&#xff08;主分支&#xff09;中每次集成都通过自动化构建和测试来验证&#xff0c;从而尽早发现集成错误&#xff0c;常用的CI工具包括Jenkins、Travis CI、CircleCI、GitLab CI等 CD&#…...

MySQL 的 SQL 语句执行顺序

MySQL 的 SQL 语句执行顺序并不完全按照代码的书写顺序执行&#xff0c;而是遵循一套固定的逻辑流程 1. FROM 和 JOIN 作用&#xff1a;确定查询的数据来源&#xff0c;包括表和它们的连接方式&#xff08;如 INNER JOIN, LEFT JOIN 等&#xff09;。 细节&#xff1a; 先执行…...

Dubbo(21)如何配置Dubbo的注册中心?

在分布式系统中&#xff0c;注册中心是一个关键组件&#xff0c;用于服务的注册和发现。Dubbo 支持多种注册中心&#xff0c;包括 ZooKeeper、Nacos、Consul、Etcd 等。下面详细介绍如何配置 Dubbo 的注册中心&#xff0c;以 ZooKeeper 为例。 配置步骤 引入依赖&#xff1a;…...

AISEO中的JSON 如何部署?

一、JSON 是什么&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据格式&#xff0c;用于在不同系统之间传递结构化信息。它的核心特点是&#xff1a; 易读&#xff1a;用简单的 {键: 值} 对表示数据&#xff0c;例如&#xff1a; json…...

力扣hot100——最长连续序列(哈希unordered_set)

题目链接&#xff1a;最长连续序列 1、错解&#xff1a;数组做哈希表&#xff08;内存超出限制&#xff09; int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…...

几种常见的.NET单元测试模拟框架介绍

目录 1. Moq 2. NSubstitute 3. AutoFixture 4. FakeItEasy 总结对比 单元测试模拟框架是一种在软件开发中用于辅助单元测试的工具。 它的主要作用是创建模拟对象来替代真实对象进行测试。在单元测试中&#xff0c;被测试的代码可能依赖于其他组件或服务&#xff0c;如数…...

装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展

pom <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 --> </dependency>MPJLambdaWrapperX /*** 拓展 MyBatis Plus Join QueryWrapper 类&…...

11-SpringBoot3入门-整合aop

1、概念&#xff08;个人理解&#xff09; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff0c;面向切面编程。 1&#xff09;切面&#xff08;Aspect&#xff09;&#xff1a;提供切入连接点的方法 2&#xff09;连接点&#xff08;Joinpoint&#xff09;…...

naive_admin项目实战03 基于Go语言的后端

01.使用Goland打开项目 02.使用Goland连接MySQL 03.执行SQL脚本 set names utf8mb4; set foreign_key_checks 0;-- ---------------------------- -- table structure for permission -- ---------------------------- drop table if exists permission; create table permiss…...

基于卷积神经网络的眼疾识别系统,resnet50,efficentnet(pytorch框架,python代码)

更多图像分类、图像识别、目标检测、图像分割等项目可从主页查看 功能演示&#xff1a; 眼疾识别系统resnet50&#xff0c;efficentnet&#xff0c;卷积神经网络&#xff08;pytorch框架&#xff0c;python代码&#xff09;_哔哩哔哩_bilibili &#xff08;一&#xff09;简介…...

Python数据可视化-第1章-数据可视化与matplotlib

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第1章 数据可视化与matplotlib 本文主要介绍了什么是数据集可视化&#xff0c;数据可视化的目的&#xff0c;常见的数据可视化方式…...

Ansible playbook-ansible剧本

一.playbook介绍 便于功能的重复使用 本质上就是文本文件&#xff0c;一般都是以.yml结尾的文本文件。 1.遵循YAML语法 1.要求同级别代码要有相同缩进&#xff0c;建议4个空格。【同级别代码是同一逻辑的代码】 在计算机看来空格和Tob键是两个不同的字符。 2.一个键对应一…...

UDP网络通信

UDP网络通信&#xff1a; 步骤1 创建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);参数一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…...

【学习笔记】计算机网络(六)

第6章应用层 文章目录 第6章应用层6.1 域名系统DNS6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器域名服务器的分区管理DNS 域名服务器的层次结构域名服务器的可靠性域名解析过程-两种查询方式DNS 高速缓存机制 6.2 文件传送协议6.2.1 FTP 概述6.2.2 FTP 的基本工作…...

RK3588使用笔记:系统算法依赖库安装

一、前言 嵌入式设备随着需求的提升&#xff0c;不再仅仅只只运行个单机程序那么简单了&#xff0c;社会发展设备升级&#xff0c;都会逐步引用人工智能&#xff0c;涉及到算法模型&#xff0c;这里基础的部分就是算法环境的安装&#xff0c;有的算法是C&#xff0c;大部分算法…...

数据结构C语言练习(单双链表)

本篇练习题(单链表)&#xff1a; 1.力扣 203. 移除链表元素 2.力扣 206. 反转链表 3.力扣 876. 链表的中间结点 4.力扣 21. 合并两个有序链表 5. 牛客 链表分割算法详解 6.牛客 链表回文结构判断 7. 力扣 160. 相交链表 8. 力扣 141 环形链表 9. 力扣 142 环形链表 II…...

Linux驱动开发 中断处理

目录 序言 1.中断的概念 2.如何使用中断 中断处理流程 中断上下文限制 屏蔽中断/使能 关键区别与选择 上半部中断 下半部中断 软中断&#xff08;SoftIRQ&#xff09; 小任务(Tasklet) 工作队列&#xff08;Workqueue&#xff09; 线程 IRQ&#xff08;Threaded IRQ…...

C++ set map

1.set和map是什么 set和map是 C STL 提供的容器&#xff0c;用于高效的查找数据&#xff0c;底层采用红黑树实现&#xff0c;其中set是Key模型&#xff0c;map是Key-Value模型 set和map的基本使用较为简单&#xff0c;这里不再叙述&#xff0c;直接进入实现环节 2.set和map的…...

Vue2和Vue3响应式的基本实现

目录 简介Vue2 响应式Vue2 响应式的局限性 Vue3 响应式Vue3 响应式的优点 Vue2 和 Vue3 响应式对比 简介 在 Vue 框架中&#xff0c;数据的响应式是其核心特性之一。当页面数据发生变化时&#xff0c;我们希望界面能自动更新&#xff0c;而不是手动操作 DOM。这就需要对数据进…...

PyQt6实例_批量下载pdf工具_界面开发

目录 前置&#xff1a; 代码&#xff1a; 视频&#xff1a; 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本系列涉及到的PyQt6知识点&#xff1a; 线程池&#xff1a;QThreadPool,QRunnable&#xff1b; 信号…...

FOC 控制笔记【三】磁链观测器

一、磁链观测器基础 1.1 什么是磁链 磁链&#xff08;magnetic linkage&#xff09;是电磁学中的一个重要概念&#xff0c;指导电线圈或电流回路所链环的磁通量。单位为韦伯&#xff08;Wb&#xff09;&#xff0c;又称磁通匝。 公式为&#xff1a; 线圈匝数 穿过单匝数的…...

前端Material-UI面试题及参考答案

目录 Material-UI 的设计理念与 Material Design 规范的关系是什么? 如何通过 npm/yarn/pnpm 安装 Material-UI 的核心依赖? Material-UI 的默认主题系统如何实现全局样式管理? 如何在项目中配置自定义字体和颜色方案? 什么是 emotion 和 styled-components,它们在 Ma…...

【LeetCode基础算法】链表所有类型

1. 遍历链表 二进制链表转整数找出临界点之间的最小和最大距离 2. 删除节点 移除链表元素从链表中移除在数组中存在的节点删除排序链表中的重复元素删除排序链表中的重复元素 II 3. 插入节点 在链表中插入最大公约数 计算最大公约数的内置函数gcd(a,b)&#xff0c;也可以m…...

备赛蓝桥杯之第十六届模拟赛第1期职业院校组第五题:回忆画廊

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…...

51 驱动 INA219 电流电压功率测量

文章目录 一、INA219简介二、引脚功能三、寄存器介绍1.配置寄存器 0x002.分流电压寄存器 0x013.总线电压寄存器 0x024.功率寄存器 0x035.电流寄存器 0x046.基准寄存器 0x05 四、IIC 时序说明1.写时序2.读时序 五、程序六、实验现象1.线路图2.输出数据 一、INA219简介 INA219是…...

JavaScript弹出框的使用:对话框、确认框、提示框、弹窗操作

关于 Window对象和 Document 对象的详细使用,系列文章: 《Window对象的常用属性和方法》 《Document对象的常用属性和方法:getElementById()、getElementsByName()、createElement()方法》 《Document获取元素并修改内容:getElementById()方法、value属性、innerHTML属性、…...

【设计模式】深入解析设计模式:门面模式(外观模式)的定义、优点和代码实现

门面模式&#xff08;外观模式&#xff09; SLF4J是门面模式的典型应用&#xff08;但不仅仅使用了门面模式&#xff09;。 门面模式定义 门面模式&#xff08;Facade Pattern&#xff09;又称为外观模式&#xff0c;提供了一个统一的接口&#xff0c;用来访问子系统中的一群…...

UE5学习笔记 FPS游戏制作34 触发器切换关卡

文章目录 搭建关卡制作触发器传送门显示加载界面 搭建关卡 首先搭建两个关卡&#xff0c;每个关卡里至少要有一个角色 制作触发器传送门 1 新建一个蓝图&#xff0c;父类为actor&#xff0c;命名为portal&#xff08;传送门&#xff09; 2 为portal添加一个staticMesh&#…...

UE5学习笔记 FPS游戏制作26 UE中的UI

文章目录 几个概念创建一个UI蓝图添加UI获取UI的引用 切换设计器和UI蓝图将UI添加到游戏场景锚点轴点slotSizeToContent三种UI数据更新方式(Text、Image)函数绑定属性绑定事件绑定 九宫格分割图片按钮设置图片绑定按下事件 下拉框创建添加数据修改样式常用函数 滚动框创建添加数…...

Spring Boot分布式项目重试实战:九种失效场景与正确打开方式

在分布式系统架构中&#xff0c;网络抖动、服务瞬时过载、数据库死锁等临时性故障时有发生。本文将通过真实项目案例&#xff0c;深入讲解Spring Boot项目中如何正确实施重试机制&#xff0c;避免因简单粗暴的重试引发雪崩效应。 以下是使用Mermaid语法绘制的重试架构图和决策…...

首个物业plus系列展 2025上海国际智慧物业博览会开幕

AI赋能服务升级&#xff01;首个“物业plus”系列展 2025上海国际智慧物业博览会盛大开幕 3月31日&#xff0c;2025上海国际智慧物业博览会&#xff08;简称“上海物博会”&#xff09;在上海新国际博览中心N4馆隆重开幕。本届展会由广州旭杨国际展览有限公司主办&#xff0c…...

《C++多线程下单例 “锁钥” 法则》

一、概述 本文章介绍了一段 C 代码&#xff0c;该代码实现了在多线程环境下的单例模式。单例模式确保一个类只有一个实例&#xff0c;并提供全局访问点。在多线程场景中&#xff0c;需要额外的同步机制来保证单例对象创建的线程安全性。单例模式在许多场景中都有重要应用&#…...

WEB或移动端常用交互元素及组件 | Axure / 元件类型介绍(表单元件、菜单和表格 、流程元件、标记元件)

文章目录 引言I Axure / 元件类型介绍基本元件表单元件菜单和表格流程元件标记元件II Axure 基础Axure / 常用功能介绍Axure / 常用元素实例Axure / 动态交互实例Axure / 常用设计分辨率推荐III Axure / 创建自己的元件库元件库作用元件库的创建及使用引言 I Axure / 元件类型介…...

开发环境解决Secure Cookie导致302重定向

问题现象与根源分析 故障现象 前端本地开发时&#xff08;HTTP协议&#xff09;&#xff0c;调用接口返回302 Found状态码浏览器控制台警告&#xff1a;“Cookie被阻止&#xff0c;因为设置了Secure属性但未通过HTTPS传输”登录态无法保持&#xff0c;页面陷入重定向循环 技…...

华为三进制逻辑与高维量子计算的对比分析

此博客深入探讨华为三进制逻辑状态的技术意义&#xff0c;并与高维量子计算系统进行对比。文章将全面展开技术原理、实现机制、计算能力对比、未来应用前景等方面的内容。 目录 引言 华为三进制逻辑的创新意义 2.1 二进制逻辑的局限与历史探索 2.2 三进制逻辑的优势&#xff…...

网红指路机器人是否支持环境监测功能?

嘿呀&#xff0c;你可知道&#xff1f;如今的叁仟网红指路机器人那可太牛啦&#xff01;它们可不单单局限于为行人指明方向&#xff0c;还纷纷兼职当起了 “环境小卫士”&#xff0c;为咱们的城市生活注入了前所未有的超智能便利。就拿那个依托叁仟智慧杆打造的数智指路机器人来…...

【进阶】vscode 中使用 cmake 编译调试 C++ 工程

基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统&#xff0c;结合VSCode及其扩展插件&#xff08; ms-vscode.cmake-tools&#xff09;&#xff0c;可实现高效的全流程C开发调试。既可通过 VSCode 可视化界面&#xff08;命令面板、状态栏按钮&#xff09;便捷完成配置、…...