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

dynamic_cast和static_cast和const_cast

dynamic_cast 在 C++ 中的作用

dynamic_cast 是 C++ 运行时类型转换(RTTI, Run-Time Type Identification)的一部分,主要用于:

  • 安全的多态类型转换
  • 检查类型的有效性
  • 向下转换(Downcasting)
  • 跨类层次的指针或引用转换

它只能用于 带有虚函数的类,否则 dynamic_cast 将无法工作。


1. dynamic_cast 的作用

1.1 向下转换(Downcasting)

用于将 基类(Base Class)指针/引用 转换为 派生类(Derived Class)指针/引用,并在运行时 检查类型安全性

示例:

#include <iostream>
using namespace std;class Base {
public:virtual void show() { cout << "Base class\n"; } // 需要虚函数
};class Derived : public Base {
public:void show() override { cout << "Derived class\n"; }
};int main() {Base* basePtr = new Derived(); // 基类指针指向派生类对象// 使用 dynamic_cast 进行向下转换Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {derivedPtr->show(); // ✅ 成功转换并调用 Derived::show()} else {cout << "Conversion failed\n";}delete basePtr;return 0;
}

输出:

Derived class

dynamic_cast 成功转换,因为 basePtr 实际指向的是 Derived 对象。


1.2 失败情况

如果 basePtr 实际上指向的是 Base 类型的对象,而不是 Derived,那么转换会失败,返回 nullptr(对于指针)。

Base* basePtr = new Base();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {derivedPtr->show();
} else {cout << "Conversion failed\n"; // ✅ 这里转换失败
}

输出:

Conversion failed

2. dynamic_cast 适用于引用

dynamic_cast 也可以用于 引用转换,但如果转换失败,会抛出 std::bad_cast 异常。

#include <iostream>
#include <typeinfo>
using namespace std;class Base { public: virtual ~Base() {} };
class Derived : public Base {};int main() {Base baseObj;try {Derived& derivedRef = dynamic_cast<Derived&>(baseObj); // ❌ 失败,抛出异常} catch (const std::bad_cast& e) {cout << "Exception: " << e.what() << endl;}return 0;
}

输出:

Exception: std::bad_cast

✅ 由于 baseObj 不是 Derived 类型,dynamic_cast 失败并抛出 std::bad_cast 异常。


3. dynamic_caststatic_cast 的区别

比较项dynamic_caststatic_cast
转换类型仅限于 带虚函数的多态类任何相关类型
运行时检查有类型检查(RTTI)无类型检查
失败情况指针返回 nullptr,引用抛出 std::bad_cast可能导致 未定义行为
转换方向只能用于向下转换向上、向下转换均可
性能运行时开销较大(涉及 RTTI 查询)编译时转换,无额外开销

示例:static_cast vs dynamic_cast

Base* basePtr = new Base();// static_cast(不会进行检查,可能导致未定义行为)
Derived* derivedPtr1 = static_cast<Derived*>(basePtr); // ❌ 可能出现未定义行为
derivedPtr1->show(); // 可能崩溃// dynamic_cast(安全,但可能返回 nullptr)
Derived* derivedPtr2 = dynamic_cast<Derived*>(basePtr); // ✅ 失败时返回 nullptr
if (derivedPtr2) derivedPtr2->show();

总结

  • dynamic_cast 安全但慢,适合 不确定基类指针实际指向的对象类型 时。
  • static_cast 快但危险,仅适合 明确知道转换是安全的情况下

4. 什么时候使用 dynamic_cast

使用 dynamic_cast 的最佳场景

  1. 向下转换(基类指针/引用 → 派生类指针/引用)。
  2. 运行时类型检查(避免 static_cast 可能的未定义行为)。
  3. 接口类(如 Base* ptr 指向某个不确定类型的派生类,需要判断其类型)。

避免 dynamic_cast 的情况

  1. 不涉及多态(没有 virtual 函数,dynamic_cast 无法工作)。
  2. 已知类型安全的转换(可用 static_cast 代替)。
  3. 高性能场景dynamic_cast 有运行时开销)。

5. dynamic_cast 在实际应用中的示例

5.1 多态事件处理

class Event { public: virtual ~Event() {} };
class MouseEvent : public Event { public: void click() { cout << "Mouse clicked\n"; } };
class KeyboardEvent : public Event { public: void press() { cout << "Key pressed\n"; } };void handleEvent(Event* event) {if (MouseEvent* mouse = dynamic_cast<MouseEvent*>(event)) {mouse->click();} else if (KeyboardEvent* key = dynamic_cast<KeyboardEvent*>(event)) {key->press();} else {cout << "Unknown event\n";}
}int main() {MouseEvent mouse;KeyboardEvent keyboard;handleEvent(&mouse);    // ✅ 输出 "Mouse clicked"handleEvent(&keyboard); // ✅ 输出 "Key pressed"return 0;
}

dynamic_cast 允许在运行时确定事件的类型,并调用相应的处理逻辑。


const_cast 在 C++ 中的作用

const_cast 是 C++ 提供的 四种类型转换运算符static_castdynamic_castconst_castreinterpret_cast)之一,专门用于去掉或添加 const / volatile 限定符

它允许:

  • 移除 const 限定符(常见用途)
  • 移除 volatile 限定符
  • 添加 const(几乎没用)

1. const_cast 的基本用法

1.1 去掉 const 修饰符

通常,const_cast 用于将 const 指针转换为非 const 指针,从而允许修改 const 变量(⚠️ 仅适用于非常量对象)。

示例:

#include <iostream>
using namespace std;void modifyConstValue(const int* ptr) {int* modifiablePtr = const_cast<int*>(ptr); // 去掉 const 限定符*modifiablePtr = 42; // 现在可以修改它
}int main() {int x = 10;modifyConstValue(&x);cout << "x = " << x << endl; // ✅ 输出 x = 42return 0;
}

输出:

x = 42

const_cast<int*> 移除了 ptrconst 限定符,使得 modifiablePtr 可以修改 x


2. const_cast 使用的注意事项

2.1 const_cast 不能修改真正的 const 变量

如果你试图修改一个 真正的 const 变量,行为是 未定义的(UB, Undefined Behavior)

示例(错误):

const int y = 100;
int* ptr = const_cast<int*>(&y);
*ptr = 200; // ❌ 未定义行为
cout << "y = " << y << endl;

⚠️ 即使编译通过,运行结果可能是:

y = 100  // ❌ 修改失败(某些编译器可能优化 `y` 为常量)

y = 200  // ❌ 可能错误修改(取决于编译器)

为什么?

  • const int y = 100; 可能会被编译器优化到只读存储区,因此试图修改它可能导致 程序崩溃无效修改

正确的使用方式:
const_cast 只能用于去掉 const 修饰符的指针/引用,而不能用于真正的 const 变量


3. const_cast 用于函数参数

3.1 const_cast 解除 const 限定

有时,我们在 只接受非 const 参数的旧 C 库 中,需要传递 const 变量,这时 const_cast 可以解决问题。

#include <iostream>
using namespace std;void legacyFunction(char* str) { // 旧 C 库接口,必须接收非 conststr[0] = 'H'; // 修改字符串
}void wrapperFunction(const char* str) {legacyFunction(const_cast<char*>(str)); // 去掉 const
}int main() {char text[] = "hello";wrapperFunction(text);cout << text << endl; // ✅ 输出 "Hello"return 0;
}

const_cast<char*> 允许 legacyFunction() 修改字符串。


4. const_cast 用于成员函数

在 C++ 类中,const_cast 可用于 const 成员函数中修改成员变量

4.1 修改 mutable 变量

如果某个成员变量在 const 方法中需要修改,推荐使用 mutable,而不是 const_cast

class Example {
private:mutable int counter = 0;
public:void increaseCounter() const {counter++; // ✅ 因为 counter 是 mutable,可以在 const 方法中修改}
};

mutable 是更好的选择!

4.2 const_castconst 方法中修改成员变量

如果不能使用 mutable,可以用 const_cast 强行去掉 const

class Example {
private:int counter = 0;
public:void modify() const {const_cast<Example*>(this)->counter = 100; // 去掉 const 限定符}
};

⚠️ 注意:这会破坏 const 语义,最好避免!


5. const_cast 与其他类型转换的区别

转换方式用途
const_cast仅用于 去掉或添加 const/volatile
static_cast编译时转换,用于普通类型转换
dynamic_cast运行时类型转换,用于 多态类
reinterpret_cast低级别强制转换,用于不同类型的二进制转换

6. 什么时候应该使用 const_cast

适用场景

  1. 调用旧 C 库时,避免 const 兼容性问题(如 const char*char*)。
  2. const 成员函数中修改成员变量(但推荐 mutable)。
  3. 特定场景下移除 const 以提高灵活性(如优化某些代码)。

不推荐使用的情况

  1. 试图修改真正的 const 变量(未定义行为)。
  2. 滥用 const_cast 破坏 const 语义(影响代码可读性)。
  3. 可以使用 mutable 代替的情况

7. const_cast 适用的真实案例

案例:日志系统

log() 方法中,可能希望const 对象中增加日志计数

class Logger {
private:mutable int log_count = 0;
public:void log(const string& msg) const {cout << "Log: " << msg << endl;const_cast<Logger*>(this)->log_count++; // ✅ 修改 log_count}
};

✅ 这里使用 mutable 更合适,但 const_cast 也是可选方案。


8. 总结

const_cast 的作用

  • 去掉 const 限定符,使 const 指针/引用可以修改数据
  • 允许 const 方法修改成员变量(但推荐 mutable)。
  • 用于传递 const 数据给不兼容 const 的旧 C 代码

⚠️ const_cast 的注意事项

  • 不能修改真正的 const 变量,否则是 未定义行为(UB)
  • 滥用会破坏 const 语义,影响代码可读性。
  • 如果可能,使用 mutable 代替 const_cast

🚀 最佳实践

  1. 如果可能,避免 const_cast,使用 mutable 或者 static_cast
  2. 只有在调用 C 代码或 const 兼容性问题时使用 const_cast
  3. 确保 const_cast 仅用于非 const 变量,否则可能导致 UB(未定义行为)

何时使用?

  • ✅ 需要 安全的向下转换(从 Base*Derived*)。
  • ✅ 处理 运行时不确定的多态对象(如 GUI 事件、游戏对象)。
  • 已知类型的转换 应该使用 static_cast 以提高性能。

结论

  • dynamic_cast 适用于多态类型转换,尤其是 向下转换
  • 运行时类型检查(RTTI)确保转换安全,但性能较 static_cast 略低
  • 适用于事件处理、插件系统等场景,但不建议在高性能代码中滥用。

相关文章:

dynamic_cast和static_cast和const_cast

dynamic_cast 在 C 中的作用 dynamic_cast 是 C 运行时类型转换&#xff08;RTTI, Run-Time Type Identification&#xff09;的一部分&#xff0c;主要用于&#xff1a; 安全的多态类型转换检查类型的有效性向下转换&#xff08;Downcasting&#xff09;跨类层次的指针或引用…...

SQLMesh系列教程-2:SQLMesh入门项目实战

假设你已经了解SQLMesh是什么&#xff0c;以及其他应用场景。如果没有&#xff0c;我建议你先阅读《SQLMesh系列教程-1&#xff1a;数据工程师的高效利器-SQLMesh》。 在本文中&#xff0c;我们将完成一个小项目或教程&#xff0c;以帮助你开始使用SQLMesh。你可以选择一步一步…...

window 安装GitLab服务器笔记

视频&#xff1a; windows下内网本地部署gitlab 资源&#xff1a; Linux CeneOS7&#xff1a; CentOS7 镜像下载地址 VMware&#xff1a; 虚拟机17.6下载地址 安装vim编辑器 yum install vim -y系统环境升级&#xff08;我第一次没有使用。第二次成功使用了的&#xff09;…...

【逆向工程】破解unity的安卓apk包

先了解一下普通apk包的逆向方法&#xff08;无加密或加壳&#xff09; 开发环境&#xff1a; 操作系统&#xff1a;windows 解apk包 下载工具&#xff1a;apktool【Install Guide | Apktool】按照文档说的操作就行&#xff0c;先安装java运行时环境【我安装的是jre-8u441-wind…...

2021版小程序开发5——小程序项目开发实践(2)-完

2021版小程序开发5——小程序项目开发实践(2) 学习笔记 2025 使用uni-app开发一个电商项目继续&#xff1b; 过滤器的使用 filters: {toFixed(num){return Number(num).toFixed(2)} }<!-- 通过管道符 | 使用过滤器 --> <view> {{ item.price | toFixed }}</vi…...

Spring Boot牵手Redisson:分布式锁实战秘籍

一、引言 在当今的分布式系统架构中,随着业务规模的不断扩大和系统复杂度的日益增加,如何确保多个服务节点之间的数据一致性和操作的原子性成为了一个至关重要的问题。在单机环境下,我们可以轻松地使用线程锁或进程锁来控制对共享资源的访问,但在分布式系统中,由于各个服务…...

【HarmonyOS Next 自定义可拖拽image】

效果图&#xff1a; 代码&#xff1a; import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...

基于扑克牌分发效果制作时的问题总结

其基本效果如图 1. 在overlay模式下直接使用position来移动 实现代码 public class Card : MonoBehaviour {public RectTransform target;public Button cardButton;private bool isPack false;public List<RectTransform> cards new List<RectTransform>(…...

为多个GitHub账户配置SSH密钥

背景 当需要同时使用多个GitHub账户&#xff08;例如工作和个人账户&#xff09;时&#xff0c;默认的SSH配置可能导致冲突。本文介绍如何通过生成不同的SSH密钥对并配置SSH客户端来管理多个账户。 操作步骤 生成SSH密钥对 为每个GitHub账户生成独立的密钥对&#xff0c;并指…...

三步本地部署deepseekr1,支持macOs,ubuntu,Windows

一、ollama安装: ollama官网:Ollama Ollama 是一款支持在 Windows、macOS 和 Linux 上本地运行大型语言模型的工具。以下是针对不同操作系统的安装指南: 1、Windows 系统 下载安装包:访问 Ollama 官方下载页面,选择适用于 Windows 的安装包进行下载。 运行安装程序:下…...

STM32 HAL库 CANbus通讯(C语言)

#include "main.h" #include "stm32f1xx_hal.h"CAN_HandleTypeDef hcan; CAN_TxHeaderTypeDef TxHeader; CAN_RxHeaderTypeDef RxHeader; uint8_t TxData[8]; uint8_t RxData[8]; uint32_t TxMailbox;void CAN_Init(void) {// 使能CAN时钟__HAL_RCC_CAN1_C…...

Cotex-M系列介绍

一、芯片设计公司——ARM ARM公司&#xff1a;只做内核设计和IP授权&#xff0c;不参与芯片设计 二、Cortex内核分类及特征...

测试自动化落地方向

一、视觉回归自动化测试&#xff08;低成本高回报&#xff09; 痛点&#xff1a; UI 频繁迭代导致视觉问题难覆盖 方案&#xff1a; 引入Applitools或SikuliX做视觉比对&#xff08;无需维护元素定位&#xff09; 关键路径截图比对&#xff0c;自动检测 UI 错位/样式问题 亮点…...

如何通过优化网站结构提高SEO效果?

很多人以为&#xff0c;SEO就是写写关键词&#xff0c;发点外链&#xff0c;但其实&#xff0c;网站结构才是排名的地基&#xff01;你可以把网站想象成一栋房子&#xff0c;框架没搭好&#xff0c;装饰再漂亮也没用&#xff0c;迟早会塌。同样的道理&#xff0c;如果网站结构混…...

迅雷下载的原理和使用协议的分析

迅雷作为一款广泛使用的下载工具&#xff0c;其核心原理是通过整合多种下载协议和资源分发技术来提升下载速度。以下是对其原理及协议的详细分析&#xff1a; 一、迅雷下载的核心原理 多协议混合下载&#xff08;P2SP&#xff09; P2SP&#xff08;Peer-to-Server-Peer&#xf…...

RPA与深度学习结合

什么是RPA RPA即机器人流程自动化&#xff08;Robotic Process Automation&#xff09;&#xff0c;它是一种利用软件机器人模拟人类在计算机上的操作&#xff0c;按照预设的规则自动执行一系列重复性、规律性任务的技术。这些任务可以包括数据录入、文件处理、报表生成、系统…...

Linux内核模块参数与性能优化:__read_mostly属性的深度剖析

在Linux内核开发中,模块参数和性能优化是两个至关重要的主题。模块参数允许开发者和用户在加载内核模块时动态配置模块的行为,而性能优化则是确保内核高效运行的关键。本文将深入探讨Linux内核中的模块参数机制以及__read_mostly属性的使用,通过实际代码示例和详细解释,帮助…...

Elasticsearch:如何使用 Elastic 检测恶意浏览器扩展

作者&#xff1a;来着 Elastic Aaron Jewitt 当你的 CISO 询问你的任何工作站上是否安装过特定的浏览器扩展时&#xff0c;你多快能得到正确答案&#xff1f;恶意浏览器扩展是一个重大威胁&#xff0c;许多组织无法管理或检测。这篇博文探讨了 Elastic Infosec 团队如何使用 os…...

基于Java的远程视频会议系统(源码+系统+论文)

第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈&#xff0c;追求远距离的视音频的同步交互成为新的时尚。近些年来&#xff0c;依托计算机技术、通信技术和网络条件的发展&#xff0c;集音频、视频、图像、文字、数据为一体的多媒体信息&#xff…...

SAP-ABAP:FOR ALL ENTRIES IN用法详解带实例代码

在 SAP ABAP 中&#xff0c;FOR ALL ENTRIES IN 是 SELECT 语句中一个非常常用的功能&#xff0c;用于根据内表中的数据查询数据库表。它的主要作用是将内表中的数据作为查询条件&#xff0c;从数据库表中筛选出符合条件的数据。 1. 基本语法 SELECT <fields>FROM <d…...

构建jdk17包含maven的基础镜像

1、先拉取jdk17基础镜像 docker pull openjdk:17-jdk-alpine 2、使用jdk17基础镜像创建容器 docker run -it openjdk:17-jdk-alpine sh 或 docker run -it --name jdk17 openjdk:17-jdk-alpine sh 3、修改镜像源地址 cat /etc/apk/repositories https://mirrors.aliyun.com…...

【Android】版本和API对应关系表

目录 版本和API对应关系表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。要沉下心来&#xff0c;诗和远方的路费真的很贵&#xff01; 版本和API对应关系表 版本名版本号名称APIAndroid 1616.0W36Android 1515.0V35Android 1414.0U34Android 1…...

Spring Boot 整合 JPA 实现数据持久化

目录 前言 一、JPA 核心概念与实体映射 1. 什么是 JPA&#xff1f; 2. JPA 的主要组件 3. 实体映射 4. 常见的字段映射策略 二、Repository 接口与自定义查询 1. 什么是 Repository 接口&#xff1f; 2. 动态查询方法 3. 自定义查询 4. 分页与排序 三、实战案例&…...

KUKA 机器人仿真——Simpro4.1和OfficeLite8.6.2 连接实现虚拟示教器

一、准备软件 1、Simpro4.1&#xff0c;是一机一密钥&#xff0c;不好破解&#xff0c;我在某宝买的&#xff0c;省事了。 2、OfficeLite8.6.2&#xff0c;看我的博文的第三步虚拟机内安装OfficeLite8.6.2 KUKA示教器仿真软件OfficeLite8.6.2&#xff0c;EthernetKRL3.1.3通信…...

IntelliJ IDEA使用经验(十三):使用Git克隆github的开源项目

文章目录 问题背景办法1、设置git代理&#xff1b;2、再次克隆项目&#xff1b;3、再次按常规方式进行git克隆即可。 问题背景 由于github在国外&#xff0c;很多时候我们在使用idea克隆开源项目的时候&#xff0c;没办法检出&#xff0c;提示 连接重置。 办法 1、设置git代…...

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 先来说说计算机网…...

综合实验练习实验报告

一、需求分析 1.防火墙上配置DHCP服务&#xff0c;完成接口配置 2.用户建立以及认证策略建立 3.安全策略建立 二、详细配置 DHCP配置 [FW1]dhcp enable [FW1]int g1/0/1.1 [FW1-GigabitEthernet1/0/1.1]dhcp select interface [FW1]int g1/0/1.2 [FW1-GigabitEthernet…...

Ubuntu22.04 配置deepseek知识库

文章目录 安装 docker配置 dify配置 ollama创建大模型 安装 docker 更新系统&#xff1a;sudo apt update sudo apt upgrade -y安装必要的依赖&#xff1a;sudo apt install apt-transport-https ca-certificates curl software-properties-common -y添加 Docker 的官方 GPG 密…...

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…...

Mp4视频播放机无法播放视频-批量修改视频分辨率(帧宽、帧高)

背景 家人有一台夏新多功能 视频播放器(夏新多功能 视频播放器),用来播放广场舞。下载了一些广场舞视频, 只有部分视频可以播放,其他视频均无法播放,判断应该不是帧速率和数据速率的限制, 分析可能是播放器不支持帧高度大于720的视频。由于视频文件较多,需要借助视频编…...

jvm 线程监控调试

文章目录 前言一、使用JDK工具转储线程文件(如jstack)1. 找到Java进程的PID:2. 使用jstack生成线程转储文件:3.验证生成的线程转储文件:二、分析文件1.使用在线工具进行分析上传thread-dump文件,等待解析完成2.查看分析结果总结前言 提示:使用jdk自带工具转储线程监控文…...

超越 DeepSeek V3 -->【Qwen2.5-Max】

&#x1f525; 先说明&#xff0c;不是广子&#xff0c;不是广子&#xff01;&#xff01;&#xff01;单纯分享这个工具给大家&#xff0c;毕竟最近使用 DeepSeek 太容易崩了&#xff0c;每天深度思考一次之后就开始转圈圈用不了&#xff0c;然后就找到了这个工具使用 一、前言…...

301.华为交换机堆叠技术基础

华为交换机堆叠技术基础 一、概念及原理部分1.堆叠简介1.1 什么是堆叠1.2 可靠性网络架构1.3 华为堆叠设备1.4 其他厂商的堆叠2.堆叠的示意图3.堆叠的应用3.1 中小企业3.2 园区网4.堆叠的原理4.1基本的概念4.2 堆叠建立4.3 角色选举4.4 版本同步4.5 配置同步4.6 堆叠系统的登录…...

【开源AI】AI一页一页读PDF

【开源AI】AI一页一页读PDF 可以在这里看 : 让AI 处理 PDF 文件,提取其中的知识点,并生成总结。 只是无法修改,后续若有更新在csdn这里。 【OpenAI】 API 更新: JSON 结构化输出约束机制( JSON Schema) 的一次实战。知识库的JSON Schema形式 每一页都要总结,总结的知识…...

Spring AI 介绍

文章来源&#xff1a;AI 概念 (AI Concepts) _ Spring AI1.0.0-SNAPSHOT中文文档(官方文档中文翻译)|Spring 教程 —— CADN开发者文档中心 本节介绍 Spring AI 使用的核心概念。我们建议仔细阅读它&#xff0c;以了解 Spring AI 是如何实现的。 模型 AI 模型是旨在处理和生成…...

React - 事件绑定this

在 React 中&#xff0c;this 的绑定是一个常见问题&#xff0c;尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数&#xff0c;当被调用时&#xff0c;其 this 关键字被设置为提供的…...

【3.Git与Github的历史和区别】

目录 Git的历史和Github的区别本质和功能 Git的历史和Github的区别 Git是由Linux内核的创造者Linus Torvalds于2005年创建的。当时&#xff0c;Linux内核开源项目使用BitKeeper作为版本控制系统&#xff0c;但2005年BitKeeper的商业公司终止了与Linux社区的合作&#xff0c;收…...

【设计模式】【行为型模式】职责链模式(Chain of Responsibility)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f4eb; 欢迎V&#xff1a; flzjcsg2&#xff0c;我们共同讨论Java深渊的奥秘 &#x1f…...

【算法学习】二分查找开区间写法总结

根据灵神教学中的二分查找开区间写法进行如下总结&#xff1a; 我们需要注意的是&#xff0c;lowerBound 模板求解的是 > target 的最小下标 private int lowerBound(int[] nums, int target) {int left -1;int right nums.length; // 开区间 (left, right)while (left …...

信息科技伦理与道德3-2:智能决策

2.2 智能推荐 推荐算法介绍 推荐系统&#xff1a;猜你喜欢 https://blog.csdn.net/search_129_hr/article/details/120468187 推荐系统–矩阵分解 https://blog.csdn.net/search_129_hr/article/details/121598087 案例一&#xff1a;YouTube推荐算法向儿童推荐不适宜视频 …...

【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt

2025年已经到来&#xff0c;大家也都陆续回归到忙碌的工作中。在新的一年里&#xff0c;如何更高效地完成工作任务&#xff0c;提升工作效率&#xff0c;是很多人关心的问题。今天&#xff0c;就为大家分享一些实用性很强的GPT网站&#xff0c;帮助大家在工作中事半功倍。 Dee…...

webpack配置之---入口

entry 单入口 由于一般的单页面项目只有一个入口&#xff0c;也就是单入口&#xff0c;单入口的配置方式有以下三种方式&#xff0c;如果有遗漏的欢迎补充 1、字符串方式 以下这几行代码解释&#xff1a; entry&#xff1a;本项目的入口文件 output&#xff1a;本项目打包…...

Golang GORM系列:GORM CRUM操作实战

在数据库管理中&#xff0c;CRUD操作是应用程序的主干&#xff0c;支持数据的创建、检索、更新和删除。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性&#xff0c;使这些操作变得轻而易举。本文是掌握使用GORM进行CRUD操作的全面指南&#xff0c;提供了在Go应用程序中有效…...

[M模拟] lc380. O(1) 时间插入、删除和获取随机元素(模拟+数据结构+脑筋急转弯+数组快捷删除技巧+项目思考)

文章目录 1. 题目来源2. 题目解析 1. 题目来源 链接&#xff1a;380. O(1) 时间插入、删除和获取随机元素 题单&#xff1a; 待补充 2. 题目解析 其实这个题目抽象一下的话在项目中也能出现&#xff0c;可能日常项目中没有算法基础的话&#xff0c;就很容易直接去进行新内…...

30~32.ppt

目录 30.导游小姚-介绍首都北京❗ 题目​ 解析 31.小张-旅游产品推广文章 题目 解析 32.小李-水的知识❗ 题目​ 解析 30.导游小姚-介绍首都北京❗ 题目 解析 新建幻灯片-从大纲-重置-检查设计→主题对话框→浏览主题&#xff1a;考生文件夹&#xff08;注意&#x…...

一键查看电脑各硬件详细信息 轻松查看电脑硬件参数

今天为大家推荐两款非常实用的电脑硬件查看软件&#xff0c;它们能够一键快速查看电脑的各种配置信息&#xff0c;使用起来非常方便。 一键查看电脑各硬件详细信息 这款软件是绿色版的&#xff0c;无需安装&#xff0c;打开即可使用&#xff0c;文件大小仅为900多KB&#xff0…...

java如何创建自定义异常?

在Java中&#xff0c;创建自定义异常通常需要继承Exception类或其子类。以下是创建自定义异常的基本步骤&#xff1a; 定义异常类&#xff1a;创建一个新的类&#xff0c;继承自Exception或RuntimeException&#xff08;根据需要选择&#xff09;。 构造方法&#xff1a;提供一…...

2025/2/10 心得

第一题。J. C - Grand Garden (AI) 问题陈述 在一个花坛里&#xff0c;有 NN 朵花&#xff0c;编号为 1,2,\ldots,N1,2,…,N。最初&#xff0c;所有花的高度都是 00。你将得到一个高度序列 h{h\_1,h\_2,h\_3,\ldots\} 作为输入。你希望通过重复以下“浇水”操作来将所有花的编…...

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest)&#xff0c;可以按照以下步骤进行&#xff1a; 安装 Google Test&#xff1a;确保你已经安装了 Google Test。如果没有安装&#xff0c;可以通过 Visual Studio Installer 安装。在安装程序中&#xff0c;找到并选择 Googl…...

软开关和硬开关

硬开关&#xff1a; 电路结构相对简单&#xff0c;一般只包含基本的开关管、电源、负载等元件&#xff0c;没有专门的谐振电路来辅助开关过程。 开关管在导通或关断时&#xff0c;电压或电流的变化率非常快&#xff0c;形成急剧的开关过程。开通时&#xff0c;开关器件的电流…...