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

进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持

C++的编程精华,走过路过千万不要错过啊!废话少说,我们直接进入正题!!!!

函数高级

C++的函数提高

函数默认参数

在C++中,函数的形参列表中的形参是可以有默认值的。

语法返回值类型 函数名 (参数 = 默认值){}

示例

#include<iostream>
using namespace std;
​
//函数的默认参数
//如果我们自己传入数据,就用自己的数据,如果没有那就用默认值
//语法:返回值类型 函数名称(形参 = 默认值){}
int func(int a,int b = 20,int c = 30)
{return a + b + c;
}
​
//注意事项
//如果某个位置已经有了默认参数,那么这个位置从左往右都必须有默认值
//如果函数声明有了默认参数,函数实现就不能有默认值
//声明和实现只能有一个默认参数
int func2(int a = 10,int b = 20);
int func2(int a = 10,int b = 20)//error
{return a + b;
}
​
​
int main()
{cout << func(10) << endl;cout << func(30) << endl;return 0;
}

函数占位参数

C++中函数的形参列表里可以有占位参教,用来做占位,调用函数时必须填补该位置

语法返回值类型 函数名 (数据类型){}

在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术

示例

#include<iostream>
using namespace std;
//函数占位参数,占位参数也可以有默认参数
void func(int a,int )
{cout << "this is func" << endl;
}
​
int main()
{func(10,10);//占位参数必须填补return 0;
}

函数重载

作用:函数名可以相同,提高复用性

函数重载满足条件

  1. 同一个作用域下

  2. 函数名称相同

  3. 函数参数类型不同或者个数不同或者顺序不同

注意:函数的返回值不可以作为函数重载的条件

示例

#include<iostream>
using namespace std;
​
//函数重载
//可以让函数名相同,提高复用性
​
//函数重载满足条件
//1. 同一个作用域下
//2. 函数名称相同
//3. 函数参数类型不同或者个数不同或者顺序不同
void func()
{cout << "func函数的调用" << endl;
}
​
void func(int a)
{cout << "func(int a)函数的调用!" << endl;
}
​
void func(double a)
{cout << "func(double a)函数的调用!" << endl;
}
​
void func(int a, double b)
{cout << "func(int a, double b)函数的调用!" << endl;
}
​
void func(double a,int b)
{cout << "func(double a,int b)函数的调用!" << endl;
}
​
int main()
{func();func(1);func(3.14);func(1,3.14);func(3.14,1);return 0;
}
func函数的调用
func(int a)函数的调用!
func(double a)函数的调用!
func(int a, double b)函数的调用!
func(double a,int b)函数的调用!

注意

int func(double a,int b)//这个无法重载,函数重载不可以作为函数重载条件
{cout << "func(double a,int b)函数的调用!" << endl;
}

函数重载的注意事项

  1. 引用作为重载条件

  2. 函数重载碰到函数默认参数

示例

#include<iostream>
using namespace std;
//引用作为重载条件
void func(int &a)
{cout << "func(int &a)" << endl;
}
​
void func(const int &a)//const int &a = 10;这是合法的代码
{cout << "func(const int &a)" << endl;
}
//函数重载碰到默认参数
void func2(int a,int b = 10)
{cout << "func2(int a,int b)" << endl;
}
​
void func2(int a)
{cout << "func2(int a)" << endl;
}
​
int main()
{int a = 10;func(a);//实现的是func(int &a)的函数func(10);//实现的是fun(const int &a)的函数func2(10);//当函数重载碰到默认参数,就会出现二义性,errorreturn 0;
}

内存模型

C++核心编程

主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。

内存分区模型

C++程序在执行时。将内存大方向划分为4个区域

  1. 代码区:存放函数体的二进制代码。由操作系统进行管理的。

  2. 全局区:存放全局变量和静态变量以及常量。

  3. 栈区:由编译器自动分配释放,存放函数的参数值局部变量等。

  4. 堆区:由程序员分配和释放,若程序员下释放,程序结束时由操作系统回收。

内存四区意义

不同区域存放的数据。暖予不同的生金周明,给我们更大的灵活编程

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域 代码区:

  1. 存放CPU执行的机器指令

  2. 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

  3. 代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

  1. 全局变量和静态变量存放在此

  2. 全局区还包含了常量区,字符串常量和其他常量也存放在此

  3. 该区域的数据在程序结束后由操作系统释放

示例:

#include<iostream>
using namespace std;
//全局变量
int g_a = 10;
int g_b = 10;
//const修饰的全局变量
const int c_g_a = 10;
const int c_g_b = 10;
int main()
{//创建普通的局部变量int a = 10;int b = 10;cout << "局部变量a的地址为:" << (int*)&a << endl;cout << "局部变量b的地址为:" << (int*)&b << endl;cout << "全局变量g_a的地址为:" << (int*)&g_a << endl;cout << "全局变量g_b的地址为:" << (int*)&g_b << endl;//静态变量,在普通变量前面加static,属于静态变量static int s_a = 10;static int s_b = 10;cout << "静态变量s_a的地址为:" << (int*)&s_a <<endl;cout << "静态变量s_b的地址为:" << (int*)&s_b <<endl;//常量//字符串常量cout << "字符串常量的地址:" << (int*)&"hello" << endl;//const修饰常量cout << "全局常量 c_g_a的地址为:" << (int*)&c_g_a << endl;cout << "全局常量 c_g_b的地址为:" << (int*)&c_g_b << endl;//const修饰的局部变量const int c_l_a = 10;const int c_l_b = 10;cout << "局部变量 c_l_a的地址为:" << (int*)&c_l_a << endl;cout << "局部变量 c_l_b的地址为:" << (int*)&c_l_b << endl;return 0;
}
局部变量a的地址为:0x61fe1c
局部变量b的地址为:0x61fe18
全局变量g_a的地址为:0x403010
全局变量g_b的地址为:0x403014
静态变量s_a的地址为:0x403018
静态变量s_b的地址为:0x40301c
字符串常量的地址:0x40409f
全局常量 c_g_a的地址为:0x404004
全局常量 c_g_b的地址为:0x404008
局部变量 c_l_a的地址为:0x61fe14
局部变量 c_l_b的地址为:0x61fe10

总结:

  1. C++中在程序运行前分为全局区和代码区

  2. 代码区特点是共享和只读

  3. 全局区中存放全局变量、静志变量、常量

  4. 常量区中存放const修饰的全局常量和字符串常量

程序运行后

栈区:

  1. 由编译器自动分配程放存放函数的参数,局部变量等

  2. 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

示例:

#include<iostream>
using namespace std;
//栈区数据注意事项,不要返回局部变量的地址
//栈区的数据由编译器管理开辟和释放
int* func(int b)//形参数据也会放在栈区
{b = 100;int a = 10;//局部变量 存放在栈区,栈区的数据在执行完后自动释放return &a;//返回局部变量的地址
}
int main()
{//接受func函数的返回值int* p = func();cout << *p << endl;//这里显示错误,errorreturn 0;
}

堆区:

  1. 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

  2. 在C++中主要利用new在堆区开辟内存

示例:

#include<iostream>
using namespace std;
int* func()
{//利用new关键,可以将数据开辟到堆区//指针 本质是一个局部变量,放在栈上,但是数据放在堆区int *p = new int(10);return p;
}
​
int main()
{//堆区开辟数据int* a = func();cout << *a << endl;return 0;
}

总结: 堆区数据由程序员管理开辟和释放 堆区数据开辟利用new关键字进行开辟内存

new操作符

C++中利用new操作符在堆区开辟数据 堆区开辟的数据,由程序员手动开辟,手动释放。 释放利用操作符delete 语法:new 数据类型 利用new创建的数据,返回该数据对应的类型的指针

示例:

#include<iostream>
using namespace std;
//new的基本语法
int * func()
{//在堆区创建整型数据//返回该数据类型的指针int * p = new int(10);return p;
}
​
void test01()
{int * p = func();cout << *p << endl;//堆区的数据由程序员管理开辟,程序员管理释放//如果想释放堆区数据,delete p;cout << *p << endl;//非法访问,数据已释放,error,会出现乱码
}
​
//在堆区利用new开辟数据
void test02()
{//创建10个整型数据的数组在堆区int * arr = new int[10];//代表数组有10个元素for(int i = 0;i < 10; i++){arr[i] = i + 100;}for(int i = 0;i < 10; i++){cout << arr[i] << " ";}cout << endl;//释放堆区数组//释放数组的时候,要加[]才可以delete[] arr;
}
int main()
{test01();test02();return 0;
}

引用

引用C++核心编程引用的基本使用引用注意事项引用做函数参数引用函数返回值引用的本质常量引用

C++核心编程

引用的基本使用

作用:给变量起名

语法数据类型 &别名 = 原名

示例

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

引用注意事项

  1. 引用必须初始化

  2. 引用在初始化后,不可以改变

示例

#inlcude<iostream>
using namespace std;
int main()
{//引用必须初始化int a = 10;int &b;//errorint &b = a;//引用初始化后,是不能更改引用的int c = 20;b = c;//errorcout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;return 0;
}

引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参

优点:可以简化指针修改实参

示例

#include<iostream>
using namespace std;
//交换函数
//值传递
void mySwap01(int a,int b)
{int tmp = a;a = b;b = tmp;cout << "a = " << a << endl;cout << "b = " << b << endl;//只在这个函数里面才有效,结束后还给系统
}
​
//指针的地址传递
void mySwap02(int* a,int* b)
{int tmp = *a;*a = *b;*b = tmp;
}
​
//引用传递
void mySwap03(int &a,int &b)
{int tmp = a;a = b;b = tmp;
}
​
int main()
{int a = 10;int b = 20;mySwap01(a,b);mySwap02(&a,&b);mySwap03(a,b);//引用传递,形参会修饰实参的cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;
}

引用函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量引用

用法:函数调用作为左值

示例

#include<iostream>
using namespace std;
​
//不要返回局部变量的引用
int& test01()
{int a = 10;//局部变量存放在四区中的栈区return a;
}
​
//函数的调用可以作为左值
int& test02()
{static int a = 10;//静态变量存放在全局区,在程序结束后由系统回收return a;
}
​
int main()
{int &ref = test01();cout << ref << endl;//error,a的内存已经释放,属于非法访问int &ret = test02();cout << ret <<endl;test02() = 1000;cout << ret <<endl;//这里的值ret会改成1000return 0;
}
引用的本质

本质:引用的本质在C++内部实现是一个指针常量。

示例

#include<iostream>
using namespace std;
​
//发现是引用,转化为int* const ref = &a;
void func(int& ref)
{ref = 100;//ref是引用,转换为*ref = 100;
}
​
int main()
{int a = 10;//自动转换为int* const ref = &a;指针常量是指针指向不可改,也说明了为何引用不可更改int& ref = a;ref = 20;//内部发现ref是引用,自动帮我们转化为*ref = 20;cout << "a = " << a << endl;cout << "ref = " << ref << endl;func(a);return 0;
}

常量引用

作用:常量引用主要用来修饰形微,防止误操作

在函数形参列表中,可以加const修饰形参,防止形参改变实参

#include<iostream>
using namespace std;
​
void showValue(const int & ref)
{ref = 20;//error,无法改变
}
int main()
{//常量引用//使用场景:用来修饰形参,防止误操作int a = 10;//int & ref = 10;error 引用必须引用一块合法的内存空间const int & ref =10;//这是允许的,编译器将代码修改为 int temp = 10; const int & ref = temp;int b = 100;showValue(b);cout << b << endl;return 0;
}

类与对象

C++中类与对象的学习

C++面向对象的三大特性为:封装继承多态

C++认为万事万物皆为对象。对象上有其属性和行为

例如: 人可以作为对象,属性有姓名、年龄、身高、体重…… 行为有走、跑、跳、吃饭、唱歌……

车也可以作为对象,属性有轮胎、方向盘、车灯……行为有载人、放音乐、开启空调……

具有相同性质的对象,我们可以抽象称为,人属于人类,车属于车类

封装

封装的意义1

封装是C++面向对象的三大特性之一

封装的意义:

  1. 将属性和行为作为一个整体

  2. 将属性和行为加以权限控制

封装意义1:

在设计类的时候,属性和行为写在一起,表现事物

语法class 类名 { 访问权限: 属性 / 行为 };

设计一个圆类

求圆的周长

#include<iostream>
using namespace std;
​
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2 * PI * 半径
//class代表设计一个类,类后面紧跟着的就是类名称
class Circle
{//访问权限//公共权限public://属性//半径int m_r;//行为//获取圆的周长double calculateZC(){return 2 * PI * m_r;}};
​
int main()
{//通过圆类 创建一个具体的圆(对象)//实例化 (通过一个类 创建一个对象的过程)Circle c1;//对圆对象的属性进行赋值c1.m_r = 10;cout << "圆的周长" << c1.calculateZC() << endl;return 0;
}

设计一个学生类

属性有姓名学号,可以给姓名学号赋值,可以显示学生姓名和学号

#include<iostream>
#include<string>
using namespace std;
​
class Student
{
public:string m_Name;int m_Id;void showStudent(){cout << "姓名:" << m_Name << "\t" << "学号:" << m_Id << endl; }
};
​
int main()
{//实例化对象Student s1;//s1对象进行属性赋值操作s1.m_Name = "zhangsan";s1.m_Id = 12345;s1.showStudent();//实例化对象Student s2;//s1对象进行属性赋值操作s2.m_Name = "lisi";s2.m_Id = 12346;s2.showStudent();return 0;
}

亦可以用下面的方式对类进行赋值操作

#include<iostream>
#include<string>
using namespace std;
​
class Student
{
public://类中的属性和行为统一称为成员string m_Name;int m_Id;
public:void showStudent(){cout << "姓名:" << m_Name << "\t" << "学号:" << m_Id << endl; }void setName(string name){m_Name = name;}void setId(int id){m_Id = id;}
};
​
int main()
{//实例化对象Student s1;//s1对象进行属性赋值操作s1.setName("zhangsan");s1.setId(12345);s1.showStudent();return 0;
}

封装的意义2

类在设计时,可以吧属性和行为放在不同的权限下,加以控制

访问权限有三种:

  1. public 公共权限

  2. protected 保护权限

  3. private 私有权限

示例

#include<iostream>
#include<string>
using namespace std;
//访问权限
//公共权限public    成员类内可以访问    类外也可以访问
//保护权限protected 成员类内可以访问    类外不可以访问
//私有权限private   成员类内可以访问    类外不可以访问
class Person
{
public://公共权限string m_Name;
protected://保护权限string m_Car;
private://私有权限int m_Password;
public:void func(){m_Name = "zhangsan";m_Car = "Tractor";m_Password = 123456;}void func2(){cout << "1." << m_Name << "\t" << "2." << m_Car << "\t" << "3." << m_Password << endl;}
};
​
int main()
{//实例化具体对象Person p1;//p1.m_Car = "Benz";//error,保护权限内容在类外是访问不到的//p1.m_Password = 123;error,保护权限内容在类外是访问不到的p1.func();p1.m_Name = "Lisi";p1.func2();return 0;
}

struct和class的区别

在C++中struct和class唯一的区别就在于默认的访问权限不同 区别:

  1. struct 默认权限为公共

  2. class 默认权限为私有

#include<iostream>
using namespace std;
​
class C1
{int m_A;//默认权限是私有权限
};
​
struct C2
{int m_A;//默认权限是公共权限
};
​
int main()
{C1 c1;c1.m_A = 10;//errorstruct C2 c2;c2.m_A = 10;//正确的return 0;
}

成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

示例

#include<iostream>
#include<string>
//成员属性设置为私有
//可以自己控制读写权限
//对于写权限可以检测数据的有效性
using namespace std;
int main()
{return 0;
}

相关文章:

进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持

C的编程精华&#xff0c;走过路过千万不要错过啊&#xff01;废话少说&#xff0c;我们直接进入正题&#xff01;&#xff01;&#xff01;&#xff01; 函数高级 C的函数提高 函数默认参数 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的。 语法&#xff1a;返…...

Chapter6:机器人SLAM与自主导航

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…...

Sass的使用要点

Sass 是一个 CSS 预处理器&#xff0c;完全兼容所有版本的 CSS。实际上&#xff0c;Sass 并没有真正为 CSS 语言添加任何新功能。只是在许多情况下可以可以帮助我们减少 CSS 重复的代码&#xff0c;节省开发时间。 一、注释 方式一&#xff1a;双斜线 // 方式二&#xff1a;…...

计算机启动过程,从按下电源按钮到登录界面的详细步骤

1、背景 自接触计算机以来&#xff0c;一直困扰着我一个问题。当我们按下电脑的开机键后&#xff0c;具体发生了哪些过程呢&#xff1f;计算机启动的具体步骤是什么&#xff1f; 计算机启动过程通常分为五个步骤&#xff1a;电源自检、BIOS自检、引导设备选择、引导程序加载和…...

LeetCode 刷题之 BFS 广度优先搜索【Python实现】

1. BFS 算法框架 BFS&#xff1a;用来搜索 最短路径 比较合适&#xff0c;如&#xff1a;求二叉树最小深度、最少步数、最少交换次数&#xff0c;一般与 队列 搭配使用&#xff0c;空间复杂度比 DFS 大很多DFS&#xff1a;适合搜索全部的解&#xff0c;如&#xff1a;寻找最短…...

Hadoop01【尚硅谷】

大数据学习笔记 大数据概念 大数据&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决&#xff0c;海量数据的存储…...

Echarts 配置横轴竖轴指示线,更换颜色、线型和大小

第018个点击查看专栏目录本示例是描述如何在Echarts上配置横轴竖轴指示线&#xff0c;更换颜色、线型和大小。方法很简单&#xff0c;参考示例源代码。 文章目录示例效果示例源代码&#xff08;共85行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共85行&a…...

OpenAI 官方API Java版SDK,两行代码即可调用。包含GhatGPT问答接口。

声明&#xff1a;这是一个非官方的社区维护的库。 已经支持OpenAI官方的全部api&#xff0c;有bug欢迎朋友们指出&#xff0c;互相学习。 注意&#xff1a;由于这个接口&#xff1a; https://platform.openai.com/docs/api-reference/files/retrieve-content 免费用户无法使…...

SpringBoot 日志文件

(一)日志文件有什么用&#xff1f;除了发现和定位问题之外&#xff0c;我们还可以通过日志实现以下功能&#xff1a;记录用户登录日志&#xff0c;以便分析用户是正常登录还是恶意破解用户。记录系统的操作日志&#xff0c;以便数据恢复和定位操作 。记录程序的执行时间&#x…...

SQL71 检索供应商名称

描述Vendors表有字段供应商名称&#xff08;vend_name&#xff09;、供应商国家&#xff08;vend_country&#xff09;、供应商州&#xff08;vend_state&#xff09;vend_namevend_countryvend_stateappleUSACAvivoCNAshenzhenhuaweiCNAxian【问题】编写 SQL 语句&#xff0c;…...

02:入门篇 - 漫谈 CTK

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 十万个为什么 五千个在哪里?七千个怎么办?十万个为什么?。。。生活中,有很多奥秘在等着我们去思考、揭示! 同样地,在使用 CTK 时,很多小伙伴一定也存在诸多疑问: 为什么 CTK Plugin Framework 要借…...

SpringBoot常用注解

SpringBootApplication注解包含如下三个SpringBootConfigurationEnableAutoConfigurationComponentScanSpringBootConfiguration等同于Configuration&#xff0c;是属于spring的一个配置类这里的 Configuration 对我们来说并不陌生&#xff0c;它就是 JavaConfig 形式的 Spring…...

RBAC权限模型

什么是RBAC权限模型&#xff1f; RBAC是基于角色的访问控制&#xff0c;在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。 1.0级 用户、角色、权限 2.0 权限分级 公司>部门>小组 2.1 权限继承 ps: 这个人是一个小组长…...

【郭东白架构课 模块一:生存法则】07|法则三:架构师如何找到自己的商业模式?

你好&#xff0c;我是郭东白&#xff0c;今天我们来聊聊架构活动中对商业价值的考量。 今天我们要讲的是架构师的第三个生存法则&#xff1a;作为一个架构师&#xff0c;必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言&#xff0c;架构师的可…...

STM32 - 看门狗

独立看门狗 IWDG专业时钟LSI 低功耗仍可以运行对定时的控制比较松喂狗这些时间是按照40kHz时钟给出。实际上&#xff0c;MCU内部的RC频率会在30kHz到60kHz之间变化。此外&#xff0c;即使RC振荡器的频率是精确的&#xff0c;确切的时序仍然依赖于APB接口时钟与RC振荡器时钟之间…...

Redis集群搭建

一、哨兵模式 在 redis3.0之前&#xff0c;redis使用的哨兵架构&#xff0c;它借助 sentinel 工具来监控 master 节点的状态&#xff1b;如果 master 节点异常&#xff0c;则会做主从切换&#xff0c;将一台 slave 作为 master。 哨兵模式的缺点&#xff1a; &#xff08;1&…...

车载基础软件——AUTOSAR AP典型应用案例

我是穿拖鞋的汉子&#xff0c;魔都中一位坚持长期主义的工程师&#xff01; 最近不知道为何特别喜欢苏轼的一首词&#xff1a; 缺月挂疏桐&#xff0c;漏断人初静。谁见幽人独往来&#xff0c;缥缈孤鸿影。 惊起却回头&#xff0c;有恨无人省。拣尽寒枝不肯栖&#xff0c;寂寞…...

消息中间件----内存数据库 Redis7(第3章 Redis 命令)

Redis 根据命令所操作对象的不同&#xff0c;可以分为三大类&#xff1a;对 Redis 进行基础性操作的命令&#xff0c;对 Key 的操作命令&#xff0c;对 Value 的操作命令。3.1 Redis 基本命令首先通过 redis-cli 命令进入到 Redis 命令行客户端&#xff0c;然后再运行下面的命令…...

react-03-react-router-dom-路由

react-router-dom:react路由 印记中文:react-router-dom 1、路由原理 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>前端路由的基石_history</title> </head> <body><a hre…...

2自由度悬架LQR控制

目录 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 1.3 路面激励 2.仿真分析 2.1simulink模型 2.2 仿真结果 2.3 结论 3. 总结 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 其中&#xff1a;x1为悬架动扰度&#xff0c;x2为车身加速度&#xff0c;x3为轮胎…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...