[C++面试] C++中各类括号的差异:[]、{}、<>、()
括号类型 | 典型场景 | 编译期/运行时 | 安全性考量 |
---|---|---|---|
() | 函数调用、运算优先级 | 两者 | 注意强制转换风险 |
[] | 数组访问、Lambda捕获 | 运行时主导 | 防止越界访问 |
{} | 统一初始化、聚合类型 | 编译期检查 | 阻止隐式窄化转换 |
<> | 模板实例化、元编程 | 编译期 | 注意模板展开爆炸问题 |
int x{5}; int x(5);有什么区别?
int x{5};
列表初始化。可以用于初始化各种类型的变量,并且在初始化时能避免隐式窄化转换。当使用 int x{5};
时,它会直接把 5
这个值赋给整型变量 x。
优先调用 initializer_list
构造函数:对于类类型,如果类有 std::initializer_list
构造函数,列表初始化会优先调用该构造函数;
{}
像“盒子”:编译器会严格检查“盒子”里的内容是否完全匹配类型,避免“塞入不合适的东西”(如浮点数转整型)
int x(5);
直接初始化方式。在定义变量 x
时,调用了合适的构造函数(对于内置类型 int
而言,就是简单地赋值),将 5
作为初始值传递给 x
。(对于类类型,如果类有 std::initializer_list
构造函数,列表初始化会优先调用该构造函数;直接初始化会根据参数类型调用其他合适的构造函数。)
允许隐式转换:例如 int x(5.0)
会隐式截断为 5
,编译器可能仅给出警告
适用于显式调用构造函数:常用于类对象的初始化(如 std::vector<int> vec(5, 1)
)
()
像“通道”:即使类型不完全匹配(如浮点数转整型),数据也会“流过去”并截断。
int x{5, 1};和
int x(5, 1);
错误的代码。因为 int
类型只能接受一个初始化值。
初始化方式 | 括号类型 | 参数含义 | 底层构造函数匹配 | 典型结果 |
---|---|---|---|---|
vector<int> v1(5, 1) | () | 数量 + 值 | vector(size_type, T) | 5 个 1 |
vector<int> v2{5, 1} | {} | 元素列表 | initializer_list | 2 个元素:5 和 1 |
vector<int> v3(5) | () | 元素数量 | vector(size_type) | 5 个 0 |
vector<int> v4{5} | {} | 单个元素 | initializer_list | 1 个元素:5 |
int v5(5) | () | 值 | 1 个元素:5 |
vector<int> v(5)
:圆括号表示元素数量,std::vector
是一个类模板,其构造函数vector(size_type count),接受参数来决定如何初始化容器。vector
类的构造函数被设计为:当参数是单一整型时,表示元素数量;当有两个参数(如 vector<int> v(5, 10)
)时,第一个参数是数量,第二个是初始值。
int v(5):
直接初始化方式
“圆括号构造,花括号装填;单数花括号是元素,单数圆括号是数量。”
圆括号 ()
的主要作用有哪些?
- 表达式优先级控制:改变运算顺序,如
(a + b) * c
- 类型转换:显式强制类型转换,如
(int)3.14
。建议用static_cast
替代。 - 条件/循环语句条件包裹:如
if (x > 0)
或while (i < 10)
- 函数返回类型声明(C++11后):如
auto func() -> int
。 - 函数调用与定义:如
func(10)
,或定义函数时的参数列表void func(int x)
方括号 []
在C++中的常见用途是什么?
- 数组定义与元素访问:如
int arr[5]
和arr[0] = 10
- 运算符重载:用于自定义类的下标访问,如
vector<int>::operator[]
。 - Lambda表达式捕获列表:如
[&]
表示按引用捕获所有变量
花括号 {}
的初始化规则是什么?与圆括号有何区别?
- 统一初始化(C++11):支持所有类型的初始化,如
int x{5}
、vector<int> v{1,2,3}
- 避免隐式窄化转换:
int num{3.14}
尝试把double
类型的3.14
初始化为int
类型,这属于窄化转换,使用{}
初始化时会被编译器阻止。
// int num{3.14}; int num = static_cast<int>(3.14);
- 初始化列表构造函数优先级:若类有
initializer_list
构造函数,{}
会优先调用它(如vector<int> v(5,1)
与v{5,1}
结果不同)
std::vector<int> v1(5, 1); // 5个1 → [1,1,1,1,1]
std::vector<int> v2{5, 1}; // 初始化列表 → [5,1]
尖括号 <>
在模板和泛型编程中的作用是什么?
- 模板参数声明:定义模板时指定类型或值参数,如
template <typename T>
- 模板实例化:如
vector<int>
表示存储整数的容器 - 类型约束(C++20概念):如
template <std::integral T>
约束T
为整数类型
template <typename T>
T add(T a, T b) { return a + b; } // 模板定义
auto result = add<int>(3, 5); // 显式实例化
尖括号 <>
的特殊用法
完全特化:用 template <>
声明针对特定类型的定制实现
template <>
class Stack<bool> { // 完全特化布尔类型的Stack// 位域存储优化等特殊实现
};
偏特化:保留部分模板参数泛型,特化其他参数
template <typename T>
class Stack<T*> { // 特化指针类型[8,16](@ref)// 针对指针的优化处理
};
通过 <>
实例化类型萃取工具
static_assert(std::is_same_v<int, remove_const<const int>::type>); // 移除const
模板元编程中,<>
用于在编译时进行计算和类型操作
#include <iostream>
template <int N>
struct Factorial {static const int value = N * Factorial<N - 1>::value;
};
template <>
struct Factorial<0> {static const int value = 1;
};
int main() {std::cout << Factorial<5>::value << std::endl;return 0;
}
模板参数推导
auto val = add<int>(3, 5); // 强制实例化为int版本
圆括号 ()
的特殊用法
折叠表达式(C++17):对变参模板参数包进行展开计算,生成(args1 + (args2 + ...))
(args op ...)
、(... op args)
、(args op ... op init)
、(init op ... op args)——常见4种
template <typename... Args>
auto sum(Args... args) { return (args + ...); // 右折叠求和
}// (args + ...) 是右折叠求和,会把参数包 args 里的所有参数相加。
// 若调用 sum(1, 2, 3),就会计算 1 + 2 + 3
SFINAE约束: 结合 decltype
和 enable_if
控制模板重载
template <typename T, typename = enable_if_t<is_integral_v<T>>>
// 约束T为整数类型,若传入非整数类型,该模板就会被忽略。void func(T val) { /*...*/ }
编译期条件判断:配合 if constexpr
实现编译时分支
template <typename T>
void process(T val) {if constexpr (is_pointer_v<T>) { // 编译期判断指针类型// 处理指针的逻辑}
}
重载函数调用运算符(),让类的对象像函数一样被调用
#include <iostream>
class Adder {
public:int operator()(int a, int b) {return a + b;}
};
int main() {Adder adder;int result = adder(3, 5);std::cout << result << std::endl;return 0;
}
花括号 {}
的特殊用法
统一初始化
std::vector<int> vec{1, 2, 3}; // 调用initializer_list构造函数
成员初始化列表:在构造函数中初始化模板类成员
template <typename T>
class Widget {T data;
public:Widget(T arg) : data{arg} {} // 支持移动语义[6,9](@ref)
};
避免Most Vexing Parse:解决函数声明歧义问题
vector<int> v()
声明函数而非对象
std::vector<int> v{}; // 正确:初始化空向量(而非声明函数)
聚合初始化
struct Point { int x,y; };
Point p{1,2}; // 直接初始化成员
方括号 []
的次要用途
Lambda捕获列表:在模板元编程中捕获上下文变量(较少见)
auto lambda = [&](auto x) { /* 按引用捕获外部变量 */ };[=](){} // 值捕获(副本)
[&](){} // 引用捕获(需注意悬垂引用)
[var](){} // 显式捕获特定变量
[]
在结合std::function
和std::bind
时,可用于自定义函数对象的捕获和调用。
#include <iostream>
#include <functional>
void printSum(int a, int b) {std::cout << a + b << std::endl;
}
int main() {int x = 5;auto func = std::bind(printSum, x, std::placeholders::_1);std::function<void(int)> f = [func](int y) {func(y);};f(3);return 0;
}
[[nodiscard]] int* alloc() { return new int[10]; } // 警告忽略返回值
复合括号的特殊场景
完美转发参数包:结合 ()
和 <>
展开参数包
template <typename... Args>
void emplace(Args&&... args) {new (ptr) T(std::forward<Args>(args)...); // 完美转发构造
}
模板参数依赖查找(ADL):函数调用括号触发ADL机制,函数调用中的括号可能触发参数依赖查找
namespace N { struct X{}; void swap(X&, X&); }
N::X a, b;
swap(a,b); // 优先查找N::swap而非std::swap
相关文章:
[C++面试] C++中各类括号的差异:[]、{}、<>、()
括号类型典型场景编译期/运行时安全性考量()函数调用、运算优先级两者注意强制转换风险[]数组访问、Lambda捕获运行时主导防止越界访问{}统一初始化、聚合类型编译期检查阻止隐式窄化转换<>模板实例化、元编程编译期注意模板展开爆炸问题 int x{5}; int x(5);有什么区别…...
Qt 入门 3 之对话框 QDialog(1)
Qt 入门 3 之对话框 QDialog 本文从以下几点分开讲述: - 对话框的基本原理介绍 - 两种不同类型的对话框 - 一个由多个窗口组成并且窗口间可以相互切换的程序 1.模态和非模态对话框 QDialog 类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者…...
Python设计模式:组合模式
1. 什么是组合模式 组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说,组合模式可以让客户端以相…...
第九天 - psutil系统监控库 - 资源监控仪表盘 - 练习:实时CPU/Memory监控
使用Python打造实时资源监控仪表盘(psutilFastAPI) 一、为什么要学习系统监控? 在软件开发中,系统资源监控是每个开发者都需要掌握的重要技能。无论是排查性能瓶颈、优化程序效率,还是确保服务稳定性,实时…...
Spring Boot内嵌服务器全解析:Tomcat vs Jetty vs Undertow 选型指南
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在Spring Boot应用中,内嵌服务器的选择直接影响应用的性能、资源占用和扩展性。尽管Tomcat作为默认选项被广泛使用,Jetty和Unde…...
【嵌入式学习6】多任务版TCP服务器
目录 如何实现: 客户端1.0版本: 服务端: 客户端2.0版本: thread.join() 是一个线程同步方法,用于主线程等待子线程完成。当你调用 thread.join() 时,主线程会阻塞,直到调用 join() 的子线程…...
抖音直播位置与IP属地不同?如何实现
抖音作为头部平台吸引了大量主播和观众。然而,许多用户发现一个令人困惑的现象:直播间显示的位置信息与账号IP属地不一致。本文将深入分析这一现象背后的原因,探讨可能带来的影响,并提供实用的解决方案。 一、抖音直播显示的位置与…...
Scala(六)
本节课学习了数组、列表、Set集合、Map集合、元组、集合中常用的函数等等。 数组包括可变数组、不可变数组,学习了如何定义和创建数组、可变数组和不可变数组之间的转换、多维数组、数组遍历 列表学习了如何添加元素、合并集合、如何访问元素、遍历列表 Set集合学…...
Android 11.0 framework系统首次开机添加锁屏壁纸的功能
1.前言 在11.0的系统rom定制化开发中,在某些时候需要默认设置锁屏壁纸功能,而系统中没有在 framework/base下没有单独的默认锁屏壁纸的图片替换,默认就是锁屏壁纸和主屏幕壁纸 都是同一张壁纸,所以就需要添加接口来实现设置默认锁屏壁纸的功能 2.framework系统首次开机添…...
Scala数组
数组 - 可变数组:以 ArrayBuffer 创建,可灵活增删改元素 ,如 ArrayBuffer(1, 2, 3) ,并通过 append 等方法操作。 - 不可变数组:由 Array 构建,创建后元素不可变,可借助 toBuffer 等方法转换为…...
Win11 24H2用户个性化设置OOBE跳过微软账户使用本地账户方法
目前Win11已经更新到24H2版本,经过小编测试,已经有两种方法失效了,分别如下。 1.shiftFnF10,oobe \bypassnro 2.微软账户注册界面,输入特定邮件地址和随机密码,例如nothankyou.com、exampleexample.com等…...
遍历集合list工具
文章目录 1.遍历集合list,返回第一个匹配的对象/不匹配返回null:2.集合list排序3.遍历list对象,返回匹配的集合4.从 dbRepeaters 列表中筛选出所有 repeaterId 在 repeaterIds 数组中的 Repeater 对象,并将这些对象收集到一个新的…...
基于 SmartX 原生容灾能力构建简单经济的容灾方案:5 大场景与 4 例实践合集
不少企业都基于虚拟化/超融合架构支持多种核心应用系统与数据库。这些场景不仅涉及多种类型的工作负载,在数据可靠性层面也需要不同级别的保护策略,一些用户还面临灾备演练、集中容灾等更多样的容灾需求,因此,构建全面可靠、易用高…...
说一下分布式组件时钟一致性的解决方案
为什么需要时钟一致性? 在分布式系统中,时钟一致性是确保各节点时间同步的关键问题。 时钟不同步可能导致日志混乱、事务顺序错误、数据不一致等问题 1. 物理时钟同步 基础方案:NTP(网络时间协议) 原理:…...
aws s3api 常用命令
AWS S3API 是 Amazon Web Services(AWS)提供的用于与简单存储服务(S3)进行交互的命令行工具,以下是一些常用命令: 桶操作 创建桶 aws s3api create-bucket --bucket <bucket-name> --region <r…...
006 ElementUI
https://element.eleme.cn/#/zh-CN ElementUI是组件库,网站快速成型工具 npm i element-ui2.12.0在 main.js 中写入以下内容: import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(ElementUI);...
el-select组件与el-tree组件结合实现下拉选择树型结构框
下拉选择树型结构框 实现效果图组件完整代码 实现效果图 组件完整代码 <template><div class"tree-con"><el-selectv-model"value"placeholder"请选择"class"bs-select"ref"select"><el-optionv-for&…...
windows系统更新nvidia 驱动, 并安装pytorch
windows系统更新nvidia 驱动, 并安装pytorch 1.更新前nvidia-smi 显示版本比较久 2.方法一:通过NVIDIA GeForce Experience自动更新 NVIDIA GeForce Experience是NVIDIA官方提供的一款软件,它不仅可以帮助用户优化游戏设置,还能…...
如何深刻理解Reactor和Proactor
前言: 网络框架的设计离不开 I/O 线程模型,线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架,在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主),这是服务端应对高并发的性能利器。 …...
如何使用WRF-Hydro GIS工具,生成运行WRF-Hydro模型的Domain文件,包括流域、地形、河网、湖泊等
WRF-Hydro模型作为一个集成了大气和水文过程的模型,具有一些挑战性的难点,包括: 复杂的耦合过程:WRF-Hydro模型需要同时考虑大气和水文过程的相互作用,包括降水、蒸发、径流等一系列过程的耦合,这使得模型的…...
adb devices报错 ADB server didn‘t ACK
ubuntu下连接手机首次使用adb devices 报错ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…...
机器学习——决策树
1.什么要学习决策树? 处处都是选择,并且到处都是岔路口。比如你发现某只股票几天时间内涨了很多,如果是你,你会买进吗?如果买进了,你就得承担后果,要么会大赚一笔,要么会血本无归。总之,用算法替代主观判断,避免情绪化投资决策。 …...
zk源码—2.通信协议和客户端原理二
大纲 1.ZooKeeper如何进行序列化 2.深入分析Jute的底层实现原理 3.ZooKeeper的网络通信协议详解 4.客户端的核心组件和初始化过程 5.客户端核心组件HostProvider 6.客户端核心组件ClientCnxn 7.客户端工作原理之会话创建过程 6.客户端核心组件ClientCnxn (1)客户端核心…...
Python设计模式:构建模式
1. 什么是构建模式 构建模式(Builder Pattern)是一种创建型设计模式,它允许使用多个简单的对象一步步构建一个复杂的对象。构建模式通过将构建过程与表示分离,使得同样的构建过程可以创建不同的表示。换句话说,构建模…...
C++类间的 “接力棒“ 传递:继承(下)
文章目录 5. 继承与友元6.继承与静态成员7.菱形继承8.继承和组合希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇接着补充继承方面的内容,同时本篇的菱形继承尤为重要 5. 继承与友元 class Student; class Person { public:fri…...
C++11QT复习 (十六)
文章目录 Day11 移动语义回顾一、移动语义基础概念二、自定义 String 类的移动语义实现输出运算符重载: 三、测试函数:验证移动与拷贝行为四、左值与右值的补充说明右值引用作为函数返回值 五、知识总结如何区分左值与右值? 六、附加说明&…...
Redis客户端命令到服务器底层对象机制的完整流程?什么是Redis对象机制?为什么要有Redis对象机制?
Redis客户端命令到服务器底层对象机制的完整流程 客户端 → RESP协议封装 → TCP传输 → 服务器事件循环 → 协议解析 → 命令表查找 → 对象机制 → 动态编码 → 数据结构操作 → 响应编码 → 网络回传 Redis客户端命令到服务器底层对象机制的完整流程可分为协议封装、命令解…...
鸿蒙NEXT开发节流、防抖工具类(ArkTs)
import { CacheUtil } from ./CacheUtil; import { DateUtil } from ./DateUtil;/*** 节流、防抖工具类(用于点击事件,防止按钮被重复点击)** author 鸿蒙布道师* since 2025/04/07*/ export class ClickUtil {private static throttleTimeou…...
Qt程序 Windows打包
目的 运行Qt的程序,遇上如下问题: 显然是少很多Qt库,那就把Qt库放到这里,Qt提供这一个命令windeployqt.exe. windeployqt windeployqt是Qt框架提供的一个工具,主要用于自动打包Windows平台上的Qt应用程序及其依赖项…...
2025-04-07(DS复习):Databricks DLT 详解
Databricks Delta Live Tables (DLT) 详解 Delta Live Tables (DLT) 是 Databricks 提供的一个智能框架,用于构建可靠、可扩展的数据处理管道。它简化了ETL(提取、转换、加载)和ELT(提取、加载、转换)流程的开发和管理,特别适合在数据湖house架构中实现…...
音视频入门基础:RTCP专题(3)——RTCP协议简介(中)
本文接着《音视频入门基础:RTCP专题(2)——RTCP协议简介(上)》,继续对RTCP协议进行简介。本文的一级标题从“九”开始。 九、Sender and Receiver Reports 本段内容对应《RFC 3550》的第6.4节。根据《RFC …...
嵌入式工程师多线程编程(二)生产者-消费者模式
生产者-消费者模式详解:多线程编程的核心范式 生产者-消费者模式(Producer-Consumer Pattern)是多线程编程中最经典的设计模式之一,它通过解耦生产者和消费者的工作流程,实现了线程间的高效协作与资源管理。本文将深入剖析这一模式的原理、实…...
秒杀系统的性能优化
秒杀任务总体QPS预期是每秒几十万,对tomcat、redis、JVM参数进行优化。 tomcat线程数 4核8G的机器,一般就是开200-300个工作线程,这是个经验值。每秒一个线程处理3-5个请求,200多个线程的QPS可以达到1000左右。线程不能太多&…...
MySQL学习笔记集--索引
索引 索引是数据库中用于提高查询效率的一种数据结构。 它类似于书籍的目录,通过索引可以快速定位到表中的特定行,而无需扫描整个表。 索引的类型 主键索引(Primary Key Index) 自动创建,用于唯一标识表中的每一行。…...
深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画
在前端开发中,CSS 动画是提升用户体验的重要手段,但很多开发者在使用动画时并不了解浏览器背后的渲染机制,导致动画卡顿甚至影响整体性能。本文将带你深入理解 CSS 中的两大核心概念 —— 重排(Reflow) 与 重绘&#x…...
Elasticsearch 从入门到实战:文档聚合操作及总结
四、文档操作:数据的增删改查 4.1 添加文档 文档(Document)是索引中的最小数据单元,使用 POST 或 PUT 添加: json POST /products/_doc/1 { "name": "华为Mate50 Pro", "price": 6…...
前缀和和差分笔记
前缀和和差分笔记 一维前缀和 示意图如下: 代码: **核心公式:sum[i]sum[i-1]a[i];(计算前缀和的)**#include<bits/stdc.h> using namespace std; const int N10000; #define ll long long int a[N],sum[N]; i…...
SSRF漏洞利用的小点总结和实战演练
含义理解: SSRF(Server-Side Request Forgery,服务器请求伪造)是一种由攻击者构造请求,由服务端发起请求的安全漏洞,一般情况下,SSRF攻击的目标是外网无法访问的内网系统。 攻击者通过篡改URL…...
IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化
全球领先的嵌入式系统开发软件解决方案供应商IAR正式发布全新云就绪平台,为嵌入式开发团队提供企业级的可扩展性、安全性和自动化能力。该平台于在德国纽伦堡举办的embedded world 2025展会上正式亮相,标志着将现代DevSecOps工作流集成到嵌入式软件开发中…...
瓦片数据合并方法
影像数据 假如有两份影像数据 1.全球底层影像0-5级别如下: 2.局部高清影像数据级别9-14如下: 合并方法 将9-14文件夹复制到全球底层0-5的目录下 如下: 然后合并xml文件 使得Tileset设置到最高级(包含所有级别)&…...
RISC-V AIA学习---IPI 处理器间中断
对于有多个hart的机器,必须为每个 hart 提供一个由具体实现定义的内存地址。向这个地址写入数据,就能向该 hart 发送一个机器级软件中断(主代码为 3)。换句话说,机器级的 IPI 可以通过这种方式,以机器级软件…...
Automattic 裁员16%,Matt Mullenweg称此举旨在提升盈利能力并增强投资实力
2025年4月3日,Automattic——这家以 WordPress.com、Tumblr 和 WooCommerce 等产品闻名的公司,宣布裁减其全球员工队伍的16%。这一决定是在周三通过公司博客文章和 Slack 内部消息向员工透露的。根据裁员前 Automattic 官网显示的员工人数(1,…...
图解AUTOSAR_SWS_FlexRayInterface
AUTOSAR FlexRay Interface 模块分析 本文档基于AUTOSAR SWS FlexRayInterface规范,对FlexRay Interface模块进行详细分析。 1. FlexRay Interface 模块架构 1.1 模块架构概览 1.2 架构说明 FlexRay Interface模块是AUTOSAR中的ECU抽象层组件,为上层模块提供统一的抽象接…...
AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析
我们之前做了做了几期的AIGIS的分享。我们今天要再次做一个分享。 AI赋能ArcGIS Pro——水系网络智能提取全解析 DeepSeek结合ArcGIS Pro制作一个批量建库的脚本工具(代码一字未改,直接运行) 看老外如何玩DeepSeek!15分钟快速创…...
STM32江科大----IIC
声明:本人跟随b站江科大学习,本文章是观看完视频后的一些个人总结和经验分享,也同时为了方便日后的复习,如果有错误请各位大佬指出,如果对你有帮助可以点个赞小小鼓励一下,本文章建议配合原视频使用❤️ 如…...
RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)
在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...
【leetcode hot 100 763】划分字母区间
解法一:用map记录<字母,字母出现的次数>,循环取出value-1,每次判断已经取出的字母(Set记录)是否还在后面存在(value>1),若存在继续循环,若不存在开启…...
PCB工艺:现代电子产品的核心制造技术
引言 PCB(Printed Circuit Board,印刷电路板)是电子设备的核心组成部分,几乎所有现代电子产品,从智能手机到航天设备,都依赖于PCB实现电路连接。PCB制造工艺的进步直接影响电子产品的性能、可靠性和成本。…...
【UE5 C++课程系列笔记】34——结构体与Json的相互转化
目录 准备工作 一、结构体转Json 二、Json转结构体 三、复杂结构体与Json的转换 主要通过借助FJsonObjectConverter类实现结构体和 JSON 之间的相互转换。 准备工作 首先新建一个结构体如下 添加两个方法分别用于将Struct转为Json、Json转为Struct 一、结构体转Json FStri…...
2025最新系统 Git 教程(二)
第2章 Git基础 2.1 Git 基础 - 获取 Git 仓库 如果你只想通过阅读一章来学习 Git,那么本章将是你的不二选择。 本章涵盖了你在使用 Git 完成各种工作时将会用到的各种基本命令。 在学习完本章之后,你应该能够配置并初始化一个仓库(reposito…...