C++的相关知识集
1、C++概述
1 两大编程思想
c++语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c++继承了c语言高效,简洁,快速和可移植的传统。
2 起源
与c语言一样,c++也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在20世纪80年代开发了这种语言。
3 移植性和标准
- ANSI 在1998制定出C第一套标准
- 2003年,发布了c++标准第二版(IOS/IEC 14882:2003),该版本对第一版修订了一些错误,但并没有改变语言特性,因此c++98表示c++98/c++2003
- c++不断发展。IOS标准委员会于2011年8月批准了新标准ISO/IEC 14882:2011,该标准被称为c++11,与c++98一样c++11也新增了许多特性。也是非常常见的一个版本
- 在C++11基础上又出现了C++14和C++17
2、C++初识
#include <iostream> //标准输入输出流 i - input 输入 o - output 输出 stream 流 相当于 stdio.h
using namespace std; //使用 标准 命名空间 //程序入口函数
int main()
{// cout 标准输出流对象// << 左移 在C++下有了新的寓意 用于在cout后拼接输出的内容 // endl --- end line 刷新缓冲区 并且换行 cout << "hello world" << endl;system("pause"); //阻塞return EXIT_SUCCESS; //返回正常退出
}
- 引入头文件 #include 标准输入输出流
- 使用标准命名空间 using namespace std;
- 标准输出流对象 cout << "hello world" << endl;
- 面向对象三大特性:封装、继承、多态
问题1:c++头文件为什么没有.h ?
在c语言中头文件使用扩展名.h,将其作为一种通过名称标识文件类型的简单方式。但是c++的用法改变了,c++头文件没有扩展名。但是有些c语言的头文件被转换为c++的头文件,这些文件被重新命名,丢掉了扩展名.h(使之成为c++风格头文件),并在文件名称前面加上前缀c(表明来自c语言)。例如c++版本的math.h为cmath.
| 头文件类型 | 约定 | 示例 | 说明 |
| c++旧式风格 | 以.h结尾 | iostream.h | c++程序可用 |
| c旧式风格 | 以.h结尾 | math.h | c/c++程序可用 |
| c++新式风格 | 无扩展名 | iostream | c++程序可用,使用namespace std |
| 转换后的c | 加上前缀c,无扩展名 | cmath | c++程序可用,可使用非c特性,如namespace std |
问题2:using namespace std 是什么 ?
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
问题3:cout 、endl 是什么 ?
cout是c++中的标准输出流,endl是输出换行并刷新缓冲区。
3、C++对C的扩展
1 双冒号::作用域运算符
:: 代表作用域 ,如果前面什么都不添加 代表全局作用域
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
//using namespace std;int atk = 1000;
void test01()
{int atk = 2000;std::cout << "atk = " << atk << std::endl;// ::代表作用域 如果前面什么都不添加 代表全局作用域std::cout << "全局 atk = " << ::atk << std::endl;
}int main() {test01();system("pause");return EXIT_SUCCESS;
}
2 namespace命名空间
准备函数:
game1.h
#pragma once
#include <iostream>
using namespace std;namespace KingGlory
{void goAtk();
}
game2.h
#pragma once
#include <iostream>
using namespace std;namespace LOL
{void goAtk();
}
game1.cpp
#include "game1.h"void KingGlory::goAtk()
{cout << "王者荣耀攻击实现" << endl;
}
game2.cpp
#include "game2.h"void LOL::goAtk()
{cout << "LOL攻击实现" << endl;
}
命名空间用途:解决名称冲突
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include "game1.h"
#include "game2.h"//1、命名空间用途: 解决名称冲突
void test01()
{KingGlory::goAtk();LOL::goAtk();
}
int main() {test01();system("pause");return EXIT_SUCCESS;
}

命名空间下可以存放 : 变量、函数、结构体、类…
//2、命名空间下 可以放 变量、函数、结构体、类...
namespace A
{int m_A;void func();struct Person{};class Animal{};
}
命名空间必须要声明在全局作用域

命名空间可以嵌套命名空
//4、命名空间可以嵌套命名空间
namespace B
{int m_A = 10;namespace C{int m_A = 20;}
}
void test03()
{cout << "B空间下的m_A = " << B::m_A << endl;cout << "C空间下的m_A = " << B::C::m_A << endl;
}

命名空间是开放的,可以随时将新成员添加到命名空间下
namespace B
{int m_A = 10;
}namespace B
{int m_B = 100;
}
void test04()
{cout << "B空间下的m_A = " << B::m_A << endl;cout << "B空间下的m_B = " << B::m_B << endl;
}

命名空间可以匿名的
//6、命名空间可以是匿名的
namespace
{int m_C = 1000;int m_D = 2000;//当写的命名空间的匿名的,相当于写了 static int m_C = 1000; static int m_D = 2000;
}void test05()
{cout << "m_C = " << m_C << endl;cout << "m_D = " << ::m_D << endl;
}
命名空间可以起别名
//7、命名空间可以起别名
namespace veryLongName
{int m_E = 10000;void func(){cout << "aaa" << endl;}
}void test06()
{namespace veryShortName = veryLongName;cout << veryShortName::m_E << endl;cout << veryLongName::m_E << endl;}
3 using声明以及using编译指令
using声明
- using KingGlory::sunwukongId
- 当using声明与 就近原则同时出现,出错,尽量避免
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;namespace KingGlory
{int sunwukongId = 1;
}void test01()
{int sunwukongId = 2;//1、using声明//using KingGlory::sunwukongId ; //当using声明与 就近原则同时出现,出错,尽量避免cout << sunwukongId << endl;
}
![]()
using编译指令
- using namespace KingGlory;
- 当using编译指令 与 就近原则同时出现,优先使用就近
- 当using编译指令有多个,需要加作用域 区分
namespace KingGlory
{int sunwukongId = 1;
}namespace LOL
{int sunwukongId = 3;
}
void test02()
{//int sunwukongId = 2;//2、using编译指令using namespace KingGlory;using namespace LOL;//当using编译指令 与 就近原则同时出现,优先使用就近//当using编译指令有多个,需要加作用域 区分cout << KingGlory::sunwukongId << endl;cout << LOL::sunwukongId << endl;
}

注意:使用using声明或using编译指令会增加命名冲突的可能性。也就是说,如果有名称空间,并在代码中使用作用域解析运算符,则不会出现二义性。
4 检测增强
函数检测增强
- 函数的返回值
- 形参类型
- 函数调用参数个数
类型转换检测增强
char p = (char )malloc(64) C下等号必须左右一致类型
//3、类型转换检测增强
void test02()
{char* p = malloc(64);
}
以上c代码c编译器编译可通过,c++编译器无法编译通过。
struct 增强
- C++可以在结构体中放函数
- 创建结构体变量可以简化关键字struct
//1. 结构体中即可以定义成员变量,也可以定义成员函数;;
struct Student {string mName;int mAge;void setName(string name) { mName = name; }void setAge(int age) { mAge = age; }void showStudent() {cout << "Name:" << mName << " Age:" << mAge << endl;}
};//2. c++中定义结构体变量不需要加struct关键字
void test01() {Student student;student.setName("John");student.setAge(20);student.showStudent();
}
bool数据类型扩展
C++才有bool类型,代表真 --- 1 true 假 ---- 0 false。sizeof = 1
//5、bool类型扩展 C语言下 没有这个类型 C++有bool类型
bool flag = true; // bool类型 代表 真和假 true ---- 真(1) false ---- 假(0)void test04()
{cout << sizeof(bool) << endl; //结果是1个字节//flag = false;//flag = 100; //将非0的数都转为1cout << flag << endl;
}// 结果
1
1
三目运算符增强
//6、三目运算符增强
void test05()
{//?:int a = 10;int b = 20;printf("ret = %d\n", a > b ? a : b);(a < b ? a : b) = 100; // C++下返回的是变量 a = 100printf("a = %d\n", a);printf("b = %d\n", b);
}//结果
ret = 20
a = 100
b = 20
5 const
const增强
C语言下
- 全局const 直接修改 失败 间接修改 语法通过,运行失败
- 局部 const 直接修改 失败 间接修改 成功
const int constA = 10;int* p = (int*)&constA;*p = 300;printf("constA:%d\n",constA);printf("*p:%d\n", *p);//结果
constA:300
*p:300
C++语言下
- 全局 const 和C结论一样
- 局部 const 直接修改失败 间接修改 失败
- const可以称为常量,可以用于数组内的常数。
void test05()
{const int constA = 10;int* p = (int*)&constA;*p = 300;cout << "constA:" << constA << endl;cout << "*p:" << *p << endl;
}//结果
constA:10
*p:300
constA在符号表中,当我们对constA取地址,这个时候为constA分配了新的空间,*p操作的是分配的空间,而constA是从符号表获得的值。
对于基础数据类型,如果用一个变量初始化const变量,如果const int a = b,那么也是会给a分配内存。
void test06()
{int b = 10;const int constA = b;int* p = (int*)&constA;*p = 300;cout << "constA:" << constA << endl;cout << "*p:" << *p << endl;}//结果
constA:300
*p:300
const 链接属性
1)C语言下const修饰的全局变量默认是外部链接属性
同一个目录下两个文件:
const int g_a = 1000;
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>int main() {extern const int g_a;printf("g_a = %d\n", g_a);system("pause");return EXIT_SUCCESS;
}
可以正常输出。
2)C++下const修饰的全局变量默认是内部链接属性
可以加extern 提高作用域
extern const int g_b = 1000;//默认是内部链接属性 可以加关键字 extern 提高作用域
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;int main(){extern const int g_b;cout << "g_b = " << g_b << endl;;system("pause");return EXIT_SUCCESS;
}
const分配内存情况
- 对const变量 取地址 ,会分配临时内存
- 使用普通变量 初始化 const变量(const增强中已经举例)
- 对于自定义数据类型
//3、对于自定义数据类型
struct Person
{string m_Name;int m_Age;
};
void test03()
{const Person p;//p.m_Age = 10;Person* pp = (Person*)&p;(*pp).m_Name = "Tom";pp->m_Age = 10;cout << "姓名: " << p.m_Name << " 年龄: " << p.m_Age << endl;
}
尽量用const代替define
define出的宏常量,没有数据类型、不重视作用域
const和#define区别总结:
- const有类型,可进行编译器类型安全检查。#define无类型,不可进行类型检查
- const有作用域,而#define不重视作用域
6 引用
1)简介
- 目的:起别名
- 语法: 类型(与原名类型必须一致) &别名 = 原名
- 引用必须要初始化,引用一旦初始化后,就不可以引向其他变量
void test02()
{int a = 10;//int &b; //引用必须要初始化int& b = a; //引用一旦初始化后,就不可以引向其他变量int c = 100;b = c; // 赋值cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}//结果
a = 100
b = 100
c = 100
2)建立对数组引用
①直接建立引用
int arr[10];
int(&pArr)[10] = arr;
②先定义出数组类型,再通过类型 定义引用
typedef int(ARRAY_TYPE)[10];
ARRAY_TYPE & pArr2 = arr;
//对数组建立引用
void test03()
{//1、直接建立引用int arr[3];int(&pArr)[3] = arr;for (int i = 0; i < 3; i++){arr[i] = 100 + i;}for (int i = 0; i < 3; i++){cout << pArr[i] << endl;}printf("\n --------2------\n");//2、先定义出数组类型,再通过类型 定义引用typedef int(ARRAY_TYPE)[3];//类型 &别名 = 原名ARRAY_TYPE& pArr2 = arr;for (int i = 0; i < 3; i++){cout << pArr2[i] << endl;}}
3)参数的传递方式
- 值传递
- 地址传递
- 引用传递
//1、值传递
void mySwap01(int a, int b)
{int temp = a;a = b;b = temp;cout << ":::b = " << b << endl;*/
}//2、地址传递
void mySwap02(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}//3、引用传递
void mySwap03(int& a, int& b) // int &a = a; int &b = b;
{int temp = a;a = b;b = temp;
}void test01()
{int a = 10;int b = 20;//mySwap01(a, b);//mySwap02(&a, &b);mySwap03(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;
}
第一种其实没有实现交换功能。通过引用参数产生的效果同按地址传递是一样的。引用的语法更清楚简单:
- 函数调用时传递的实参不必加“&”符
- 在被调函数中不必在参数前加“*”符
引用作为其它变量的别名而存在,因此在一些场合可以代替指针。C++主张用引用传递取代地址传递的方式,因为引用语法容易且不易出错。
4)注意事项
- 引用必须引一块合法内存空间
- 不要返回局部变量的引用
int& func()
{int a = 10;return a;
}//引用注意事项
void test02()
{//int &a = 10; //1、引用必须引一块合法内存空间,这种就不能通过,因为后面必须是变量名。//2、不要返回局部变量的引用int& ref = func();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;
}

第一个能正常输出,是因为程序做了优化保留,实际这种做法是有潜在危险的。要想不取消,需要就加上static,看下一个例子。
- 当函数返回值是引用时候,那么函数的调用可以作为左值进行运算
int& func2()
{static int a = 10;return a;
}void test03()
{int& ref = func2();cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;cout << "ref = " << ref << endl;//当函数返回值是引用,那么函数的调用可以作为左值func2() = 1000;cout << "ref = " << ref << endl;
}

5)引用的本质
引用的本质在c++内部实现是一个指针常量.
Type& ref = val; // Type* const ref = &val;
c++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同,只是这个过程是编译器内部实现,用户不可见。
void testFunc(int& ref) {ref = 100; // ref是引用,转换为*ref = 100
}
int main() {int a = 10;int& aRef = a; //自动转换为 int* const aRef = &a;这也能说明引用为什么必须初始化aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;cout << "a:" << a << endl;cout << "aRef:" << aRef << endl;testFunc(a);cout << "a:" << a << endl;cout << "aRef:" << aRef << endl;return EXIT_SUCCESS;
}

6)指针的引用
- 利用引用可以简化指针
- 可以直接用同级指针的 引用 给同级指针分配空间
以下两个示例代码效果是一样的:
struct Person
{int age;
};void allocateSpace(Person** p)
{//p指向指针的指针 *p 指针 指向的是person 本体 **p person本体*p = (Person*)malloc(sizeof(Person));(*p)->age = 10;
}void test01()
{Person* p = NULL;allocateSpace(&p);cout << "p.age = " << p->age << endl;
}
struct Person
{int age;
};void allocateSpace2(Person*& pp) // Person * &pp = p;
{pp = (Person*)malloc(sizeof(Person));pp->age = 20;
}void test02()
{Person* p = NULL;allocateSpace2(p);cout << "p.age = " << p->age << endl;
}
7)常量的引用
- 本质:const int &ref = 10; // 加了const之后, 本质 相当于写成 int temp = 10; const int &ref = temp;当然一般不这么用。
- 常量引用的使用场景:修饰函数中的形参,防止误操作
void test01()
{//int &ref = 10; //这种是不合法的const int& ref = 10; // 加了const之后, 相当于写成 int temp = 10; const int &ref = temp;int* p = (int*)&ref;*p = 10000;cout << ref << endl; //可以被修改
}//常量引用的使用场景 修饰函数中的形参,防止误操作
void showValue(const int& a)
{//a = 100000;cout << "a = " << a << endl;
}void test02()
{int a = 100;showValue(a);
}//结果
1000
a = 100
推荐:
MBA智库百科,全球专业中文经管百科
中文维基百科 - 维基百科
相关文章:
C++的相关知识集
1、C概述 1 两大编程思想 c语言在c语言的基础上添加了面向对象编程和泛型编程的支持。c继承了c语言高效,简洁,快速和可移植的传统。 2 起源 与c语言一样,c也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼斯特劳斯特卢普)在2…...
解决Jmeter报错 :Error generating the report: java.lang.NullPointerException
当我们在使用命令行的方式来执行jmeter 脚本的时候,例如 ./jmeter -n -t /opt/jmeter/script/test.jmx -Juser50 -Jtime100 -l /opt/jmeter/script/restult2.jtl 上面脚本的含义解释如下: -n -t 通过命令行的方式执行脚本test.jmx -Juser50 并发用户…...
QT外部库:zlib
前言 新建项目:pro文件中新增代码 LIBS -lz 在main.cpp函数中#include "zlib.h",如果此时运行代码提示没有找到对应的函数,那么就qt安装目录:D:\C\qt5.12.7\Tools\mingw730_64\x86_64-w64-mingw32\include(这里是博主…...
钡铼技术BL205模块分布式IO集成应用风电场状态监测
在风力发电这一绿色能源领域,高效、精确的状态监测对于提升风电场运维效率、保障设备安全运行至关重要。随着工业4.0和数字化转型浪潮的推进,传统的监测方式已难以满足日益增长的数据处理与分析需求。钡铼技术BL205模块的出现,为风电场状态监…...
java博客目录
博客目录 基础知识 集合列表 List ArrayList: LinkedList: Set Map TreeMap 设计模式 单例模式: 工厂方法...
从零开始学习Linux(8)----自定义shell
shell从用户读入字符串“ls”,shell建立一个新的进程,然后在那个进程中运行ls程序并等待那个进程结束。然后shell读取新的一行输入,建立一个新的进程,在这个进程中运行程序,并等待这个进程结束。所以要写一个shell&…...
《大数据分析-数据仓库项目实战》学习笔记
目录 基本概念 数据仓库 数据仓库整体技术架构 数据仓库主题 数据集市 数据仓库的血缘关系 数据仓库元数据管理 数据仓库的指标 数据仓库维度概念 HDFS Flume Hadoop Kafka 数据仓库分层模型 Superset 即席查询 Sqoop Atlas元数据管理 项目需求描述 系统目标…...
JDK介绍
JDK是Java Development Kit的缩写,是Oracle公司提供的用于开发Java应用程序的开发包。它包括了Java运行环境(Java Runtime Environment),以及一系列Java工具(如javac、java、jdb等)和Java基础类库ÿ…...
JavaScript 对象入门:基础用法全解析
目录 对象 语法 属性和访问 方法和调用 this关键字 null 遍历对象 内置对象 Math 属性 方法 Date 创建日期对象 获取和设置日期 ⭐对象 对象是 JavaScript 数据类型的一种,数据类型也包括数值类型、字符串类型、布尔类型、undefined。对象数据类型可…...
如何获得一个Oracle 23ai数据库(docker容器)
准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 方法包括3种,本文介绍第3种: Virtual ApplianceRPM安装Docker 我已经有了一台Oracle Linux 8的虚机&#x…...
想跨境出海?云手机提供了一种可能性
全球化时代,越来越多的中国电商开始将目光投向了海外市场。这并不是偶然,而是他们在长期的市场运营中,看到了出海的必要性和潜在的机会。 中国的电商市场无疑是全球最大也最发达的之一。然而,随着市场的不断发展和竞争的日益加剧…...
制药行业新突破:CANOpen转PROFINET网关配置案例解析
在药品制造工业环境中,实现CanOpen转Profinet协议之间转换的网关配置是一个关键过程,确保了不同通信协议的设备能够互相协作。以开疆智能CanOpen转Profinet网关为例,以下是其配置流程:首先安装CanOpen转Profinet网关的配置软件&am…...
vue前端时间段选择控件
实现效果: 可选具体的某天的某时某分某秒 vue前端代码: <el-form-item label"日期"><el-date-pickerv-model"daterangerq"style"width: 240px"value-format"yyyy-MM-dd HH:mm:ss"type"datetimerange"range-separat…...
用wordpress建外贸独立站的是主流的外贸建站方式
WordPress因其易用性、灵活性和强大的功能支持,成为了外贸企业首选的网站建设平台。 从技术和功能角度来看,WordPress提供了丰富的主题和插件,这些都是构建专业外贸网站所必需的。例如,有专门为外贸网站设计的主题和插件…...
差异基因散点图绘制教程
差异基因散点图绘制教程 本期教程 小杜的生信笔记,自2021年11月开始做的知识分享,主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡事在社群同学,可免费获得自2021年11月份至今全部教程,教程配备事例数据和相…...
Windows安装多版本MySQL
5.7 - 配置 my.ini [client] port 3307[mysql] default-character-set utf8mb4[mysqld] port 3307 server_id 1 character-set-server utf8mb4basedir "E://MySQL/mysql5.7" datadir "E://MySQL/mysql5.7/data"# 将所有表名转换为小写字母 lower_c…...
Redis7降级到Redis6如何AOF备份恢复(错的)
Redis7降级到Redis6如何AOF备份恢复(错的) 前提:从始至终开启AOF 介绍的Docker安装的Redis,不是Docker也一样,差不多 一、data目录差异 redis版本7 - /data/appendonlydir - appendonly.aof.manifest - appendo…...
通过EXCEL控制PLC启停电机的一种方法
概述 本例将介绍用微软EXCEL电子表格控制西门子S7-1200 PLC实现电机启停的一种方法。 第1步: 添加PLC设备,选择西门子S7-1214C CPU,设置IP地址:192.168.18.18,子网掩码:255.255.255.0。 第2步:…...
【GPT4O 开启多模态新时代!】
系列文章目录 GPT-4o的出现,让 AI 真正进入了全能时代,而且 OpenAI 宣布所有人免费使用! 不论你是需要写文章、听声音还是看视频,GPT-4o都能满足你的需求 文章目录 系列文章目录什么是GPT-4o?一、GPT-40 的新功能二、…...
HTTP协议及Python实现
最近的项目需要频繁在前后端之间传输数据,本篇主要介绍HTTP协议以及数据传输方法。 1 HTTP协议 1.1 http协议简介 HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是万维网上数据交换的基础,定义了客户端和服务器之间进行通…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
