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

【C++初阶】类和对象(中)

目录

一.类的6个默认成员函数

1.知识引入 

​编辑 2.构造函数 

(1)概念 

(2)语法特性

(3)特征 

①问题引入1

②问题引入2  (缺少默认构造函数)

3.析构函数

(1)概念

(2)特性

4.拷贝构造函数 

(1)概念

(2)特征

①拷贝构造函数是构造函数的一个重载形式。

②拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。 

③若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象的内置类型成员按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。自定义类型成员调用它的拷贝构造。

5.赋值运算符重载  

 (1)运算符重载

① 语法及注意事项

(2)赋值运算符重载

二.总结 


一.类的6个默认成员函数

1.知识引入 

如果一个类中什么成员都没有,简称为空类

空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成6个默认成员函数。

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数

  • 示例 

 2.构造函数 

(1)概念 

构造函数是一个特殊的成员函数,名字与类名相同,创建类 类型对象时由编译器自动调用,以保证每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。 

  • 注意

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

(2)语法特性

  1. 函数名与类名相同。
  2. 无返回值。(不是void,是就不需要写)
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。
  •  示例 
class Date
{
public:Date()//构造函数{_year = 1;_month = 1;_day = 1;}/*Date(int year=1,int month=1,int day=1)带参构造函数(函数重载){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{//调用无参构造函数Date d1;d1.Print();//调用带参构造函数/*Date d2(2024,2,8);d2.Print();*/return 0;
}
  • 注意
 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)//Date d3();

 通常情况只写一个构造函数,避免调用时存在歧义。

 (3)特征 

①问题引入1

关于编译器生成的默认成员函数,会有以下疑惑:不实现构造函数的情况下,编译器会生成默认的构造函数。但是看起来默认构造函数又没什么用?d对象调用了编译器生成的默认构造函数,但是d对象_year/_month/_day,依旧是随机值。也就说在这里编译器生成的默认构造函数并没有什么用?? 

class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;d1.Print();return 0;
}

  • 解答

 C++把类型分成内置类型(基本类型)自定义类型。内置类型就是语言提供的数据类型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型。默认生成的构造函数,对于内置类型不做处理,自定义类型会去调用他的默认构造函数。 

class A
{
public:A(){cout <<"A()" << endl;_a = 0;}
private:int _a;
};
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;//也可以在这里给缺省值int _month;int _day;A _aa;
};int main()
{Date d1;d1.Print();return 0;
}
  •  结果显示

 ②问题引入2  (缺少默认构造函数)
class Date
{
public: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;};int main()
{Date d1;d1.Print();return 0;
}

无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数全缺省构造函数我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

问题存在:我们写了一个带参数的构造函数,编译器就不再给我们生成构造函数了。

  • 修改 
class Date
{
public:Date(){_year = 1;_month = 1;_day = 1;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private://也可以在声明时给缺省值int _year=1;int _month=1;int _day;};int main()
{Date d1;d1.Print();return 0;
}

3.析构函数

 (1)概念

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

(2)特性

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值类型。
3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。

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

class Date
{
public:Date(){_year = 1;_month = 1;_day = 1;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}~Date(){cout << this << endl;cout << "~Date()" << endl;}
private://也可以在声明时给缺省值int _year=1;int _month=1;int _day;};
void func()
{Date d2;
}
int main()
{func();Date d1;d1.Print();return 0;
}

 

4.拷贝构造函数 

(1)概念

拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。

(2)特征

①拷贝构造函数是构造函数的一个重载形式
//拷贝构造函数
class Date
{
public:Date(int year = 2024, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//Date(const Date& d) // 错误写法:编译报错,会引发无穷递归Date(const Date& d) // 正确写法{_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1(2024,1,28);Date d2(d1);return 0;
}
②拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用。 
  •  C++规定自定义类型的拷贝都会调用拷贝构造

而传引用传参则不再需要调用拷贝构造。 

  • 为什么会引发无穷递归 

③若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象的内置类型成员按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。自定义类型成员调用它的拷贝构造。
class Date
{
public:Date(int year = 2024, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024,1,28);Date d2(d1);d1.Print();d2.Print();return 0;
}
  • 深拷贝 
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack st1;Stack s2(st1);return 0;
}

程序最终崩溃,这是为什么呢?

  • 问题分析 

  • 代码修改(手写拷贝构造)
typedef int DataType;
class Stack
{
public:Stack(size_t capacity = 10){_array = (DataType*)malloc(capacity * sizeof(DataType));if (nullptr == _array){perror("malloc申请空间失败");return;}_size = 0;_capacity = capacity;}//Stack st2(st1)Stack(const Stack& s){DataType* tmp = (DataType*)malloc(sizeof(s._capacity * (sizeof(DataType))));if (tmp == nullptr){perror("malloc fail");exit(-1);}memcpy(tmp, s._array, sizeof(DataType) * s._size);_array = tmp;_size = s._size;_capacity = s._capacity;}void Push(const DataType& data){// CheckCapacity();_array[_size] = data;_size++;}~Stack(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}
private:DataType* _array;size_t _size;size_t _capacity;
};
int main()
{Stack st1;Stack s2(st1);return 0;
}

5.赋值运算符重载  

 (1)运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 

① 语法及注意事项

函数原型:返回值类型 operator操作符(参数列表) 

  • 注意事项
  1. 不能通过连接其他符号来创建新的操作符:比如operator@
  2. 重载操作符必须有一个类类型参数
  3. 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  4. 作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
  5. .*    ::    sizeof    ?:    .注意注意以上5个运算符不能重载。
  • 比较两个日期相等及小于(传统写法) 
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//private:int _year;int _month;int _day;
};
//判断日期相等
bool DataEqual(const Date& x, const Date& y)
{return x._year == y._year&& x._month == y._month&& x._day == y._day;
}
//判断日期小于
bool DateLess(const Date& x, const Date& y)
{if (x._year < y._year){return true;}else if (x._year == y._year){if (x._month < y._month){return true;}else if (x._month == y._month){return x._day < y._day;}}return false;
}
int main()
{Date d1(2024, 1, 28);Date d2(2024, 2, 27);cout << DataEqual(d1, d2) << endl;cout << DateLess(d1, d2) << endl;return 0;
}

缺陷:由于函数名可能会存在取名字不规范的情况,将导致不知道这个函数的作用是什么。

因此采用运算符重载,来更容易让看代码的人知道这个代码的作用,增强代码可读性。 

  • 运算符重载写法 
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//private:int _year;int _month;int _day;
};
//判断日期相等
bool operator==(const Date& x, const Date& y)
{return x._year == y._year&& x._month == y._month&& x._day == y._day;
}
//判断日期小于
bool operator<(const Date& x, const Date& y)
{if (x._year < y._year){return true;}else if (x._year == y._year){if (x._month < y._month){return true;}else if (x._month == y._month){return x._day < y._day;}}return false;
}
int main()
{Date d1(2024, 1, 28);Date d2(2024, 2, 27);cout << (d1==d2) << endl;//cout<<(operator==(d1,d2)<<endl;cout << (d1<d2) << endl;return 0;
}
  • 注意 

这里代码能执行是因为我们将类内的成员设置成了公有权限,否则在类外面是不能访问类里面的成员的。

  • 处理方式(将类外函数放入类内)
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//判断日期相等bool operator==( const Date& y){return _year == y._year&& _month == y._month&& _day == y._day;}//判断日期小于bool operator<( const Date& y){if (_year < y._year){return true;}else if (_year == y._year){if (_month < y._month){return true;}else if (_month == y._month){return _day < y._day;}}return false;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 1, 28);Date d2(2024, 2, 27);cout <<d1.operator==(d2) << endl;cout << d1.operator<(d2) << endl;cout << (d1==d2) << endl;cout << (d1<d2) << endl;return 0;
}

(2)赋值运算符重载

赋值运算符重载格式 :

  1.  参数类型:const T&,传递引用可以提高传参效率
  2. 返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
  3. 检测是否自己给自己赋值
  4. 返回*this :要复合连续赋值的含义
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}//d1=d2void operator=(const Date& d){_year = d._year;_month = d._month;_day = d._day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 1, 28);Date d2(2024, 2, 27)Date d3(d1);//拷贝构造,同类型一个存在的对象进行初始化要创建的对象d1 = d2;//已经存在的对象,一个拷贝赋值给另一个d1.Print();d2.Print();return 0;
}
  • 返回值问题 
d1=d2=d3;

我们知道赋值操作是将右操作数赋值给左操作数,然后将左操作数作为返回值,因此该赋值函数需要有明确的返回值类型。因此要对上方代码进行部分修改:

    Date& operator=(const Date& d)//这里的“&”是引用{if (this != &d)//这里的“&”是取地址{_year = d._year;_month = d._month;_day = d._day;}return *this;}
  • 赋值运算符只能重载成类的成员函数不能重载成全局函数  
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
// 赋值运算符重载成全局函数,注意重载成全局函数时没有this指针了,需要给两个参数
Date& operator=(Date& left, const Date& right)
{if (&left != &right){left._year = right._year;left._month = right._month;left._day = right._day;}return left;
}
// 编译失败:
// error C2801: “operator =”必须是非静态成员

原因:赋值运算符如果不显式实现,编译器会生成一个默认的。此时用户再在类外自己实现 一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值 运算符重载只能是类的成员函数。 

 

二.总结 

 

  

相关文章:

【C++初阶】类和对象(中)

目录 一.类的6个默认成员函数 1.知识引入 ​编辑 2.构造函数 (1)概念 (2)语法特性 (3)特征 ①问题引入1 ②问题引入2 &#xff08;缺少默认构造函数&#xff09; 3.析构函数 (1)概念 (2)特性 4.拷贝构造函数 (1)概念 (2)特征 ①拷贝构造函数是构造函数的一…...

Python爬虫知识图谱

下面是一份详细的Python爬虫知识图谱&#xff0c;涵盖了从基础入门到进阶实战的各个环节&#xff0c;涉及网络请求、页面解析、数据提取、存储优化、反爬策略应对以及法律伦理等多个方面&#xff0c;并配以关键点解析和代码案例&#xff0c;以供读者深入学习和实践。 一、Pyth…...

安宝特AR汽车行业解决方案系列1-远程培训

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…...

微服务篇之分布式系统理论

一、CAP定理 1.什么是CAP 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; 1. Consistency&#xff08;一致性&#xff09;。 2. Availability&#xff08;可用性&#xff09;。 3. Partition tolerance &#xff0…...

MLflow【部署 01】MLflow官网Quick Start实操(一篇学会部署使用MLflow)

一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step-1 Get MLflowStep-2 Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) and us…...

NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]

org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码&#xff1a; #include <android/log.h> #define LOG_TAG "MyJNI" #d…...

【计算机网络:DHCP协议】

文章目录 前言一、DHCP是什么&#xff1f;二、DHCP的工作原理1.基本流程发现&#xff08;DISCOVER&#xff09;提供&#xff08;OFFER&#xff09;请求&#xff08;REQUEST&#xff09;确认&#xff08;ACKNOWLEDGEMENT&#xff09; 2.DHCP租约的概念3.DHCP续租过程 三、DHCP服…...

http前生今世

HTTP/0.9&#xff0c;仅支持GET方法&#xff0c;并且响应中没有HTTP头信息&#xff0c;只有文档内容。 HTTP/1.0增加了对POST方法、状态码、HTTP头信息等的支持&#xff0c;这一版本也是广泛应用的历史性版本。 HTTP/1.1引入了持久连接&#xff08;Persistent Connections&…...

一键安装ROS适用于Ubuntu22/20/18

一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个用于机器人软件开发的框架。它提供了一套工具和库&#xff0c;用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…...

OLED透明屏厂家:开启2024年新征程

随着科技的不断进步和创新&#xff0c;OLED透明屏作为一种前沿的显示技术&#xff0c;正逐渐走进人们的视野&#xff0c;成为多个领域的焦点。在2024年2月21日这个特殊的日子&#xff0c;我们这家领先的OLED透明屏厂家正式开工&#xff0c;预示着我们将迎来一个充满机遇和挑战的…...

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…...

第四十一回 还道村受三卷天书 宋公明遇九天玄女-python创建临时文件和文件夹

宋江想回家请老父亲上山&#xff0c;晁盖说过几天带领山寨人马一起去。宋江还是坚持一个人去。 宋江到了宋家村&#xff0c;被两个都头和捕快们追捕&#xff0c;慌不择路&#xff0c;躲进了一所古庙。一会儿&#xff0c;听见有人说&#xff1a;小童奉娘娘法旨&#xff0c;请星主…...

Tofu5m 高速实时推理Yolov8

Tofu5m 是高性价比目标识别跟踪模块&#xff0c;支持可见光视频或红外网络视频的输入&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 Yolov8推理速度达到40帧每秒。 实测视频链接&#xff1a;Tofu5m识别跟踪模块_哔哩哔哩_bilibili 产品支持视频编码、设备管理…...

[SWPUCTF 2021 新生赛]crypto8

第一眼看见是乱码不确定是什么的编码 看了下感觉是UUencode编码 UUencode编码是一种古老的编码方式&#xff0c;通常用于将二进制数据转换成可打印字符的形式。UUencode编码采用一种基于64个字符的编码表&#xff0c;将每3个字节的数据编码为4个可打印字符&#xff0c;以实现…...

学习使用js调用动态函数名(动态变量函数名)

学习使用js调用动态函数名-动态变量函数名 背景代码 背景 函数名写在 html 上&#xff0c;在 js 中定义这个变量&#xff0c;js 报错该函数不存在&#xff0c;在此给出解决方法 代码 //html代码如下 <a data-function"qipa" class"clickMe">250&l…...

CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果

<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…...

MYSQL--存储过程操作

一&#xff1a;概念&#xff1a; 存储过程实际上对标了JAVA当中的方法&#xff0c;两者是相似的&#xff0c;同时需要注意的一点是&#xff0c;MYSQL仅仅在5.0版本之后才出现这种存储操作的过程&#xff1b; 优点&#xff1a; 1.存储过程能够让运行的速度变得更加迅速&#xff…...

C#上位机与三菱PLC的通信09---开发自己的通讯库(A-3E版)

1、A-3E报文回顾 具体细节请看&#xff1a; C#上位机与三菱PLC的通信05--MC协议之QnA-3E报文解析 C#上位机与三菱PLC的通信06--MC协议之QnA-3E报文测试 2、为何要开发自己的通讯库 前面开发了自己的A-1E协议的通讯库&#xff0c;实现了数据的读写&#xff0c;对于封装的通…...

【LeetCode】70. 爬楼梯(简单)——代码随想录算法训练营Day38

题目链接&#xff1a;70. 爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到…...

图数据库 之 Neo4j - Cypher语法基础(5)

节点(Nodes) Cypher使用()来表示一个节点。 () # 最简单的节点形式,表示一个任意无特征的节点,其实就是一个空节点(movie) # 如果想指向一个节点在其他地方,我们可以给节点添加一个变量名(如movie),表示一个变量名为 movie的节点。(:Movie) # 表示一个标签为 Movie 的匿名…...

Qwen3.7-Max深度解析:智能体Agent、AI编程、MCP工作流、跨框架泛化与百炼API,一次讲透国产大模型新前沿

一句话看懂&#xff1a;Qwen3.7-Max 的重点不是“又会聊天了”&#xff0c;而是更像一个能长期执行任务的智能体底座。它要面对的不是单轮问答&#xff0c;而是编程、办公、数据分析、工具调用、验证和迭代。一、为什么 Qwen3.7-Max 值得重点关注大模型发展到今天&#xff0c;单…...

企业级应用如何利用 TaoToken 构建高可用的大模型服务网关

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业级应用如何利用 TaoToken 构建高可用的大模型服务网关 应用场景类&#xff0c;探讨在中大型企业应用中&#xff0c;为内部多个…...

飞凌FETMX8MP-C核心板多媒体实战:编解码、多屏与4K摄像头深度测评

1. 项目概述与核心板定位作为一名在嵌入式行业摸爬滚打了十多年的老工程师&#xff0c;我经手过不少核心板方案&#xff0c;从早期的ARM9到现在的多核A系列&#xff0c;各家方案在性能、功耗和功能集成度上的差异&#xff0c;直接决定了终端产品的竞争力。最近&#xff0c;飞凌…...

不止于测试:用GStreamer打造你的树莓派低成本视频监控/图传系统

树莓派视频监控实战&#xff1a;用GStreamer构建低成本图传系统 树莓派搭配普通USB摄像头能做什么&#xff1f;大多数人可能只想到简单的视频采集测试。但如果你掌握GStreamer这个多媒体框架的进阶用法&#xff0c;就能将它变成一套功能完整的视频监控或无线图传系统。本文将彻…...

2026 国内大厂 Java 最全面试真题(含场景方案+数据库+分布式必问)

开源一套金三银四自刷的面试题库&#xff0c;自己感觉还不错&#xff0c;也拿了几个 Offer&#xff08;三个大厂的&#xff0c;字节、蚂蚁、滴滴&#xff09;&#xff01;下面直接上干货哈&#xff01;需要获取得话可以在文末免费领取JVM 篇&#xff08;87 道&#xff09;JVM 篇…...

书籍分享:《VirtualLab Fusion物理光学实验教程》

第一章 物理光学概念介绍 1.1 几何光学和光线追迹 1.2 物理光学和光场追迹 1.3 电场、磁场以及坡印廷矢量 1.4 振幅、相位及实部和虚部 1.5 振幅、相位与偏振 1.6菲涅尔公式 1.7 全反射 1.8倏逝波 第二章 光的干涉及干涉系统建模仿真 2.1 牛顿环模拟仿真 2.1.1 牛顿…...

端侧AI算力瓶颈与优化企业格局解析

一、引言&#xff1a;端侧AI的发展困境与研究核心1.1 端侧AI的产业价值与普及现状端侧AI作为边缘计算的核心落地形态&#xff0c;正深度渗透工业制造、智能终端、车载电子、安防监控等领域。据IDC数据&#xff0c;2025年全球端侧AI芯片市场规模突破180亿美元&#xff0c;工业端…...

迪文串口屏界面开发避坑指南:T5L_DGUS Tool变量地址设置与数据通信那些事儿

迪文串口屏界面开发避坑指南&#xff1a;T5L_DGUS Tool变量地址设置与数据通信实战解析 在工业控制、智能家居和物联网设备的人机交互界面开发中&#xff0c;迪文串口屏因其高性价比和易用性广受欢迎。然而&#xff0c;当开发者从基础界面制作进阶到实际数据通信时&#xff0c;…...

基于STM32H750XBH6开发板的LwIP socket编程初探

这里写目录标题 1、RAW、NETCONN和socket编程特点 2、基于socket的UDP编程 3、基于socket的TCP编程 3.1、TCP客户端编程 3.2、TCP客户端编程 4、问题记录 1、RAW、NETCONN和socket编程特点 LwIP下三种编程方式分别是RAW API、NETCONN API和Socket API,这三种方式均可以实现常用…...

可视化AI工作流:从零开始构建智能应用的46个实战模板

可视化AI工作流&#xff1a;从零开始构建智能应用的46个实战模板 【免费下载链接】Awesome-Dify-Workflow 分享一些好用的 Dify DSL 工作流程&#xff0c;自用、学习两相宜。 Sharing some Dify workflows. 项目地址: https://gitcode.com/GitHub_Trending/aw/Awesome-Dify-W…...