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

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录

一、using声明基础

1.1 基本语法形式

1.2 典型应用场景

1.3 作用域规则

二、关键注意事项

2.1 命名冲突处理

2.2 头文件使用规范

2.3 与typedef的对比

三、面向对象中的应用

3.1. 解除派生类名称隐藏(核心应用)

3.2. 构造函数继承(C++11重要特性)

3.3. 访问权限调控

3.4. 类型别名模板(元编程核心)

3.5. 虚函数重写控制(C++11/14)

3.6. 混入模式(Mixin)实现

四、高级应用技巧

4.1 模板元编程

4.2 变参模板应用

五、性能与最佳实践

5.1 编译效率影响

5.2 代码规范建议

5.3. 最佳实践指南

六、C++标准演进

七、参考资料


在 C++ 的编程世界里,using声明是一项极为实用的特性,它为代码的编写和组织带来了诸多便利。无论是初涉 C++ 的新手,还是经验丰富的开发者,深入理解using声明都能显著提升编程效率与代码质量。本文将从基础概念出发,逐步深入到实际应用场景,全面剖析using声明的奥秘。

一、using声明基础

1.1 基本语法形式

using声明的标准语法为:

using 限定名称;

其中限定名称可以是:

  • 命名空间成员(如std::cout

  • 类成员(用于继承体系)

1.2 典型应用场景

示例1:类型别名

场景描述:在代码中频繁使用某个复杂类型时,可以通过using声明为其创建一个简短的别名,使代码更加简洁和易读。这类似于C++98中的typedef,但语法更简单和直观。

示例

#include <map>
#include <string>// 使用using声明创建类型别名
using StringToIntMap = std::map<std::string, int>;int main() {StringToIntMap myMap;myMap["apple"] = 1;myMap["banana"] = 2;return 0;
}

示例2:命名空间管理

场景描述:当需要使用某个命名空间中的多个名字时,可以通过using声明将这些名字引入到当前作用域,避免每次都使用完整的命名空间路径。

示例

#include <iostream>namespace myns {void func1() { std::cout << "func1" << std::endl; }void func2() { std::cout << "func2" << std::endl; }
}int main() {using myns::func1;using myns::func2;func1(); // 直接调用,无需前缀func2();return 0;
}

示例3: 解决名字冲突

场景描述:当不同命名空间中存在相同名字的函数或类型时,可以通过using声明引入特定的名字,以避免冲突。

示例

#include <iostream>namespace ns1 {void print() { std::cout << "ns1::print" << std::endl; }
}namespace ns2 {void print() { std::cout << "ns2::print" << std::endl; }
}int main() {using ns1::print; // 引入ns1中的printprint(); // 调用ns1::print// 如果需要调用ns2::print,可以直接使用命名空间前缀ns2::print();return 0;
}

示例4: 类中成员访问调整

场景描述:在派生类中,如果基类中的某个成员被隐藏或覆盖,可以通过using声明将其重新引入到派生类的作用域中,以调整其可访问性。

示例

#include <iostream>class Base {
public:void func() { std::cout << "Base::func" << std::endl; }
};class Derived : public Base {
public:using Base::func; // 明确引入基类的funcvoid func(int) { std::cout << "Derived::func(int)" << std::endl; }
};int main() {Derived d;d.func(); // 调用Base::funcd.func(1); // 调用Derived::func(int)return 0;
}

示例5: 模板编程中的类型别名

场景描述:在模板编程中,using声明可以用于创建模板类型别名,以简化模板实例化的使用。

示例

#include <vector>template <typename T>
using Vec = std::vector<T>;int main() {Vec<int> myVec; // 等价于 std::vector<int> myVec;myVec.push_back(1);myVec.push_back(2);return 0;
}

1.3 作用域规则

  • 具有块作用域:只在声明的作用域内有效

  • 遵循常规的标识符查找规则

  • 可能引发名称隐藏(name hiding)

作用域对比表:

声明方式作用范围生存周期
using局部声明当前代码块块结束前有效
using全局声明整个文件文件结束前有效
using namespace当前作用域作用域结束前

二、关键注意事项

2.1 命名冲突处理

当出现名称冲突时,编译器会按以下优先级处理:

  • 局部变量

  • 类成员

  • using声明引入的名称

  • 全局变量

冲突解决示例:

int count = 10; // 全局变量namespace N {int count = 20;
}void test() {using N::count;int count = 30; // 错误!重定义std::cout << count; // 优先使用局部变量
}

2.2 头文件使用规范

在头文件中应严格避免以下形式:

// 危险写法!
using namespace std;
using std::vector;

推荐做法:

// 安全写法
#ifndef MYHEADER_H
#define MYHEADER_H#include <vector> // 仅包含必要头文件// 不使用任何using声明#endif

2.3 与typedef的对比

C++11特性对比表:

特性typedefusing别名
模板支持不支持支持
可读性类型在后类型在前
函数指针需要嵌套定义直接声明
类型组合复杂直观

示例对比:

// typedef写法
typedef void (*OldFunc)(int, double);// using写法
using NewFunc = void (*)(int, double);

三、面向对象中的应用

3.1. 解除派生类名称隐藏(核心应用)

问题场景:派生类覆盖基类函数导致基类重载版本不可见
解决方案:使用using显式引入基类成员

#include <iostream>class NetworkBase {
public:void send(int data) {std::cout << "Sending int: " << data << '\n';}void send(const std::string& msg) {std::cout << "Sending string: " << msg << '\n';}
};class SecureChannel : public NetworkBase {
public:using NetworkBase::send; // 关键声明// 新增派生类方法void send(const char* encrypted) {std::cout << "Sending encrypted: " << encrypted << '\n';}
};int main() {SecureChannel ch;ch.send(100);            // 调用基类send(int)ch.send("Hello");        // 调用派生类send(const char*)ch.send(std::string("Secret")); // 调用基类send(string)
}

技术原理

  • 通过using将基类所有send重载版本引入派生类作用域

  • 形成包含基类和派生类版本的重载集

  • 重载决议时根据参数类型自动选择最佳匹配

3.2. 构造函数继承(C++11重要特性)

应用场景:复用基类构造函数逻辑
传统痛点:需手动编写转发构造函数 

class Vehicle {
public:explicit Vehicle(int id) : id_(id) {}Vehicle(std::string name, int year) : name_(name), year_(year) {}private:int id_;std::string name_;int year_;
};class Car : public Vehicle {
public:using Vehicle::Vehicle; // 继承基类构造函数// 扩展新构造函数Car(int id, std::string color) : Vehicle(id), color_(std::move(color)) {}private:std::string color_;
};// 使用示例
Car c1(1001);               // 调用Vehicle(int)
Car c2("Model X", 2023);    // 调用Vehicle(string, int)
Car c3(1002, "Red");        // 调用派生类构造函数

关键机制

  • 继承的构造函数与基类参数列表完全一致

  • 不会初始化派生类新增成员(需额外处理)

  • 可通过成员初始化列表补充初始化逻辑

3.3. 访问权限调控

应用场景:修改基类成员在派生类中的访问级别
设计模式应用:实现接口隔离

class DatabaseInterface {
protected:virtual void raw_query(const std::string&) = 0;
};class MySQLClient : public DatabaseInterface {
public:// 提升访问权限:protected -> publicusing DatabaseInterface::raw_query; void execute(const std::string& sql) {raw_query(sql);// 添加额外处理...}
};// 使用示例
MySQLClient db;
db.raw_query("SELECT * FROM users");  // 现在可公开访问

设计价值

  • 灵活调整继承成员的可见性

  • 支持接口的渐进式暴露

  • 比重新封装方法更高效

3.4. 类型别名模板(元编程核心)

应用场景:创建可读性强的复杂类型别名
对比传统typedef

template<typename T>
class Matrix {
public:// 内部类型别名using Vector = std::vector<T>;using Matrix2D = std::vector<Vector>;// 使用别名定义成员Matrix2D data_;using iterator = typename Matrix2D::iterator;
};// 外部使用
Matrix<double>::Vector vec(10, 0.0);
Matrix<double>::Matrix2D mat(5, vec);

优势分析

  • 提高模板代码可读性

  • 支持嵌套模板类型简化

  • 兼容类型推导(auto等)

3.5. 虚函数重写控制(C++11/14)

特殊场景:阻止特定虚函数的进一步重写

class Base {
public:virtual void critical_operation() { // 关键实现...}
};class Derived : public Base {
public:// 标记为final禁止后续重写using Base::critical_operation final; 
};class FurtherDerived : public Derived {
public:void critical_operation() override; // 编译错误!
};

设计价值

  • 精确控制继承链中的方法重写

  • 增强接口设计的严谨性

  • 比在函数声明加final更直观

3.6. 混入模式(Mixin)实现

高级技巧:组合多个基类功能

template<typename... Mixins>
class Robot : public Mixins... {
public:using Mixins::operation...; // C++17折叠表达式Robot() = default;
};struct ArmController {void operation() { std::cout << "Moving arm\n"; }
};struct VisionSystem {void operation() { std::cout << "Processing image\n"; }
};// 使用示例
using SmartRobot = Robot<ArmController, VisionSystem>;
SmartRobot bot;
bot.ArmController::operation();  // 传统方式
bot.operation(); // 通过using声明直接调用(需解决冲突)

 注意事项

  • 需要配合名称限定解决冲突

  • 要求混入类方法具有不同签名

  • C++17起支持参数包展开

四、高级应用技巧

4.1 模板元编程

在模板编程中,using声明可以创建类型别名模板: 

template<typename T>
using Pointer = T*; // 类型别名模板Pointer<int> p = new int(5); // 等价于int*

4.2 变参模板应用

结合C++17的折叠表达式:

template<typename... Ts>
using CommonType = std::common_type_t<Ts...>;template<typename... Ts>
auto sum(Ts... args) {return (args + ...);
}

五、性能与最佳实践

5.1 编译效率影响

测试数据表明:

  • 单个using声明增加约0.01%的编译时间

  • using namespace std可能增加5-10%的编译时间

5.2 代码规范建议

  • 优先使用限定名称(如std::vector

  • 在超过3次使用的场景中使用局部using声明

  • 类内部优先使用类型别名

  • 避免在超过50行的作用域内使用using声明

5.3. 最佳实践指南

场景推荐方案风险控制
名称隐藏问题在派生类public段using声明检查重载决议顺序
构造函数复用结合成员初始化列表使用确保派生成员正确初始化
接口权限调整在目标访问段声明using避免破坏封装性
类型系统扩展类内定义using别名注意模板实例化时机
设计模式实现配合static_assert验证确保类型约束

性能提示

  • using声明在编译期处理,零运行时开销

  • 过度使用可能增加符号表大小(约2-5%编译体积)

  • 在虚函数中使用时不影响动态绑定机制

通过合理运用这些面向对象场景下的using声明技巧,开发者可以显著提升代码的:

  • 可扩展性 - 更灵活的继承体系设计

  • 可维护性 - 清晰的类型系统和接口定义

  • 安全性 - 精确控制成员可见性和重写权限

  • 表达力 - 更直观的API设计

六、C++标准演进

版本特性对比:

标准版本using声明增强
C++98基础命名空间和类成员访问
C++11继承构造函数、类型别名
C++17支持using声明嵌套命名空间定义
C++20允许using声明作为模板参数

正确使用using声明可以使代码更简洁、更具可维护性。但需要开发者深入理解其作用机制,在便利性与代码安全性之间找到平衡点。建议在项目中建立统一的using声明使用规范,特别是在大型项目和多团队协作环境中,合理的using声明策略能显著提升代码质量。


七、参考资料

  • 《C++ Primer(第 5 版)》这本书是 C++ 领域的经典之作,对 C++ 的基础语法和高级特性都有深入讲解。
  • 《Effective C++(第 3 版)》书中包含了很多 C++ 编程的实用建议和最佳实践。
  • 《C++ Templates: The Complete Guide(第 2 版)》该书聚焦于 C++ 模板编程,而using声明在模板编程中有着重要应用,如定义模板类型别名等。
  • C++ 官方标准文档:C++ 标准文档是最权威的参考资料,可以查阅最新的 C++ 标准(如 C++11、C++14、C++17、C++20 等)文档。例如,ISO/IEC 14882:2020 是 C++20 标准的文档,可从相关渠道获取其详细内容。
  • cppreference.com:这是一个非常全面的 C++ 在线参考网站,提供了详细的 C++ 语言和标准库文档。
  • LearnCpp.com:该网站提供了系统的 C++ 教程,配有丰富的示例代码和清晰的解释,适合初学者学习和理解相关知识。

相关文章:

【C++标准库类型】深入理解C++中的using声明:从基础到实践

目录 一、using声明基础 1.1 基本语法形式 1.2 典型应用场景 1.3 作用域规则 二、关键注意事项 2.1 命名冲突处理 2.2 头文件使用规范 2.3 与typedef的对比 三、面向对象中的应用 3.1. 解除派生类名称隐藏&#xff08;核心应用&#xff09; 3.2. 构造函数继承&#…...

蓝桥杯2024年第十五届省赛真题-回文数组

题目描述 小蓝在无聊时随机生成了一个长度为 n 的整数数组&#xff0c;数组中的第 i 个数为ai&#xff0c;他觉得随机生成的数组不太美观&#xff0c;想把它变成回文数组&#xff0c;也是就对于任意i ∈ [1, n] 满足 ai an−i1 。小蓝一次操作可以指定相邻的两个数&#xff0c…...

多数元素——面试经典150题(力扣)

题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#xff1a;3 …...

QT中委托QStyledItemDelegate的使用

目录 一、子类化委托 二、委托方法实现 1)createEditor 2)setEditorData 3)setModelData 4)updateEditorGeometry 三、委托使用 四、总结 Qt的数据容器控件采用模型/视图(model/view)架构设计。模型用于存放控件的数据,视图则用于显示编辑数据,而委托则是…...

android 调用wps打开文档并感知保存事件

需求场景 在项目开发中会碰到需要调用WPS打开Word,Excel,Ppt等Office系列文档的情况&#xff0c;网上目前少有正式介绍如何调用相关API打开文档&#xff0c;并实现文档编辑后回传给三方应用&#xff0c;本人在逛WPS社区时发现 解锁WPS二次开发新世界&#xff1a;Android开发用…...

前端 Webpack 面试题

1、什么是 Webpack?它有什么作用? Webpack 是一个前端资源打包工具,用于将 JavaScript、CSS、图片等项目资源进行模块化管理和打包。它能够将复杂的项目结构转化为浏览器友好的代码,提高前端项目的开发效率和性能。 模块打包:Webpack 将项目中的各个模块及依赖打包成一个…...

05延迟任务精准发布文章(redis实现延迟任务、分布式锁)

上架不代表发布(需要发布app端才会显示文章&#xff09; 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间 延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在…...

十六、从零搭建一个 Vue 3 后台管理系统:完整实战教程

Vue 3 作为当下最为流行的前端框架之一&#xff0c;凭借其简洁的 API 以及强大的性能&#xff0c;已然成为构建后台管理系统的首选工具。本文将一步一步地引导你从零开始搭建一个 Vue 3 后台管理系统&#xff0c;内容涵盖路由、权限管理、状态管理等核心功能&#xff0c;并且会…...

never_give_up

一个很有意思的题&#xff1a; never_give_up - Bugku CTF平台 注意到注释里面有1p.html&#xff0c;我们直接在源代码界面看&#xff0c;这样就不会跳转到它那个链接的&#xff1a; 然后解码可得&#xff1a; ";if(!$_GET[id]) {header(Location: hello.php?id1);exi…...

DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载

思维速览&#xff1a; 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表&#xff0c;帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看&#xff1a;deepseek保姆级入门教程&#xff08;网页端使用 本地客户端部署 使用技巧&#xff09; DeepSeek官网…...

「基于大模型的智能客服系统」语义理解、上下文记忆与反馈机制设计

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

【后端】【django】导出 API 文档的几种方法

在 Django 项目里&#xff0c;导出 API 文档是很常见的需求&#xff0c;一般可以借助第三方库来实现。 使用 drf-yasg 导出 Swagger/OpenAPI 格式文档 drf-yasg 是一个用于 Django REST framework 的工具&#xff0c;能够自动生成 Swagger 和 OpenAPI 格式的 API 文档。 步骤…...

【HarmonyOS Next之旅】DevEco Studio使用指南(二)

目录 1 -> 工程模板介绍 2 -> 创建一个新的工程 2.1 -> 创建和配置新工程 2.1.1 -> 创建HarmonyOS工程 2.2.2 -> 创建OpenHarmony工程 1 -> 工程模板介绍 DevEco Studio支持多种品类的应用/元服务开发&#xff0c;预置丰富的工程模板&#xff0c;可以根…...

鸿蒙Next开发与实战经验总结

文章目录 1. 鸿蒙Next概述与开发环境搭建1.1 鸿蒙Next的核心特性1.2 开发环境搭建与工具链安装步骤工具链 1.3 第一个鸿蒙Next应用代码示例流程图 2. 鸿蒙Next应用架构与设计模式2.1 应用架构解析2.2 常用设计模式2.3 组件化开发实践 3. UI开发与布局系统3.1 基础UI组件3.2 布局…...

uniapp实现 uview1 u-button的水波纹效果

说明&#xff1a; 由于uview2已经移除水波纹效果&#xff0c;这边又觉得那个效果好看&#xff0c;所以开发这个功能(原谅我不会录动图) 效果&#xff1a; 具体代码&#xff1a; <view class"ripple-container" touchstart"handleTouchStart" touchend&…...

Linux练级宝典->任务管理和守护进程

任务管理 进程组概念 每个进程除了进程ID以外&#xff0c;还有一个进程组&#xff0c;进程组就是一个或多个进程的集合 同一个进程组&#xff0c;代表着他们是共同作业的&#xff0c;可以接收同一个终端的各种信号&#xff0c;进程组也有其唯一的进程组号。还有一个组长进程&a…...

金融行业替换传统的FTP传输系统的必要性

在如今这个数字化飞速发展的时代&#xff0c;金融行业对于信息安全性和数据传输效率的要求简直高得离谱。可是呢&#xff0c;你可能想不到&#xff0c;很多金融机构竟然还在用传统的FTP&#xff08;文件传输协议&#xff09;来处理日常的数据交换。 FTP在过去几十年里确实是网络…...

C# backgroundworker类(后台线程)

概念 在C#程序中&#xff0c;经常会有一些耗时较长的CPU密集型运算&#xff0c;如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程&#xff0c;启动一个后台线程&#xff0c;把运算操作放在这个后台线程中完成。但是原生接口的线程…...

OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引子 在信息爆炸的时代,从大量 PDF 文档中快速准确地检索信息…...

SqlServer数据库报错紧急或可疑无法访问的修复过程,亲测有效。

当 SQL Server 数据库被标记为 SUSPECT 状态时&#xff0c;表示数据库可能由于事务日志损坏、数据文件丢失或其他严重问题而无法正常启动。以下是一个详细的恢复步骤&#xff0c;基于搜索结果中的信息和常见的最佳实践&#xff1a; 恢复步骤 1. 确认数据库状态 将database-n…...

12.31[net]review

复用&#xff08;Multiplexing&#xff09;的概念 定义&#xff1a;在传输层&#xff0c;复用是指多个应用进程可以使用同一个传输层协议&#xff08;如 TCP 或 UDP&#xff09;来发送数据。从应用层的角度看&#xff0c;不同的应用进程&#xff08;如网页浏览器、邮件客户端等…...

Redis超高并发分key实现

Redis扛并发的能力是非常强的&#xff0c;所以高并发场景下经常会使用Redis&#xff0c;但是Redis单分片的写入瓶颈在2w左右&#xff0c;读瓶颈在10w左右&#xff0c;如果在超高并发下即使是集群部署Redis&#xff0c;单分片的Redis也是有可能扛不住的&#xff0c;如下图所示&a…...

Houdini学习笔记

1. Houdini中一次只能显示一个物体 如果要都显示 需要 merge 节点 粉色的是 以参考显示 2.对任意一个节点按F1 可以弹出houdini官方文档 3. 恢复视角 Space H,居中 Space G 居中选中物体...

Ubuntu 22.04使用pigz多线程快速解压/压缩文件

最近搞项目&#xff0c;资料太大&#xff0c;解压时间太久&#xff0c;于是想办法解决。 开贴记录。 1.安装pigz sudo apt install pigz 2.解压资料 解压命令为 tar --use-compress-programpigz -xvpf ***.tar.gz 将最后的部分***.tar.gz换成你自己的文件即可 例如 ti…...

子数组问题——动态规划

个人主页&#xff1a;敲上瘾-CSDN博客 动态规划 基础dp&#xff1a;基础dp——动态规划-CSDN博客多状态dp&#xff1a;多状态dp——动态规划-CSDN博客 目录 一、解题技巧 二、最大子数组和 三、乘积最大子数组 四、最长湍流子数组 五、单词拆分 一、解题技巧 区分子数组&…...

汉桑科技IPO:潜藏两大风险 公众投资者权益或受损

冰山之所以危险&#xff0c;是因为只有八分之一在水面上。 ——语出小说家海明威。 引 言 野村证券提供的一份报告显示&#xff0c;2025年前两个月&#xff0c;我国出口同比增长仅有2.3%&#xff0c;与去年四季度9.9%的增长显著下滑。与此同时&#xff0c;从2月1日开始&a…...

【3DGS】SuperSplat本地运行+修改监听端口+导入ply模型+修剪模型+在线渲染3DGS网站推荐

SuperSplat官网代码&#xff1a;https://github.com/playcanvas/supersplat 本地安装和运行 Clone the repository: git clone https://github.com/playcanvas/supersplat.git cd supersplat Install dependencies: npm install Build SuperSplat and start a local web ser…...

整数与字节序列相互转换

以下函数是用于二进制编解码的核心工具函数&#xff0c;实现 32/64 位整数与字节流之间的高效转换。 操作逻辑&#xff1a;将整数的每个字节依次写入缓冲区&#xff0c;从最低有效字节到最高有效字节内存布局&#xff1a;假设 value0x12345678&#xff0c;地址由低到高依次是0…...

嵌入式软件测试的东方智慧:WinAMS工具的技术哲学与实践启示——一名汽车电子工程师的七年工具演进观察

引言&#xff1a;在丰田精益生产线上诞生的测试哲学 2017年参与某日系车企的ECU&#xff08;电子控制单元&#xff09;联合开发时&#xff0c;我第一次在名古屋工厂见到产线旁部署的WinAMS测试站。不同于欧美工具强调的“全流程覆盖”&#xff0c;这个诞生于日本制造业精益文化…...

卫星遥感赋能气象服务:精准预测,智享生活

卫星遥感技术作为现代气象服务的“千里眼”和“顺风耳”&#xff0c;正以前所未有的精度和效率&#xff0c;革新着我们对天气的观测、预报与应对方式。今天&#xff0c;就让我们一同探索卫星遥感在气象服务中的奇妙应用。 星图云开放平台&#xff1a;专业气象的智慧之选 高精度…...

多个nodejs版本切换使用教程

想要多个nodejs版本来回切换TOC 先卸载本地已安装的nodejs下载安装nvm ,下载地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases打开链接后 &#xff0c;选择 nvm-setup.exe 安装&#xff0c;安装路径避免空格和中文&#xff08;如 D:\nvm&#xff09; 选择…...

Vue.js 3 的设计思路:从声明式UI到高效渲染机制

目录 一、声明式UI与虚拟DOM的灵活性 二、渲染器&#xff1a;虚拟DOM到真实DOM的桥梁 三、组件的本质与实现 四、编译与运行时的协同优化 五、性能与可维护性的权衡 总结 Vue.js 3 作为新一代前端框架&#xff0c;其设计理念在声明式UI描述、虚拟DOM优化、组件化架构…...

Python控制语句 ——break和continue

1.以下关于Python循环结构的描述中,错误的是() 。 A、break用来结束当前当次语句,但不跳出当前的循环体。 B、遍历循环中的遍历结构可以是字符串、文件、组合数据类型和range函数等。 C、Python通过for,while等保留字构建循环结构。 D、continue只结束本次循环。 答案:A。在…...

Linux websocket服务器、配网方法、QT客户端程序

一、linux websocket服务器 参考下面的代码编译和运行 websocket_for_linux: c语言实验websocket通信&#xff0c;含服务端和客户端示例代码 二、网络配置 Linux本地开启server和client&#xff0c;可正常通信。 换局域网另外一台PC后无法测试通过。 解决办法&#xff1a;…...

Python网络爬虫之requests库的使用方法

requests库是Python中用于发送HTTP请求的一个重要库,在实际应用中,它被广泛用于爬取网页数据、调用API接口等。本节将详细讲解requests库的使用流程,包括发送HTTP请求、携带请求参数、处理服务器响应以及错误处理,帮助读者掌握requests库的基本使用方法。 1. 使用requests库…...

一、初识Docker【安装基础案例】

开始学习docker容器技术&#xff0c;本文介绍如何安装docker、基本概念和一个简单的容器案例。 1. 安装docker 1.1 yum源方式安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils# Step 2: 添加软件源信息 yum-config-manager --add-repo <https://mir…...

stm32 f4 flash 调用时卡死

【HAL库】STM32F407----内部Flash的读写_stm32f407 flash-CSDN博客 参照此博客&#xff0c;如果调用flash 卡死的原因是谢日adress不准确&#xff0c;得到0x08010000 成功运行...

uv pip install -r requirements.txt-报错,python版本过低

升级Python版本&#xff08;推荐&#xff09; browser-use0.1.40 需要 Python ≥3.11&#xff0c;但你的环境是 Python 3.10.12。升级Python版本是最直接的解决方案&#xff1a; 安装Python 3.11&#xff1a; 使用 pyenv&#xff08;Linux/macOS&#xff09;&#xff1a;pyenv…...

c++ 中的float和double 的区别 开发过程中使用哪个更好

在 C 中&#xff0c;float 和 double 都是用于表示浮点数的数据类型&#xff0c;但它们在精度、存储空间和性能方面有所不同。 1. float 和 double 的主要区别 特性floatdouble占用内存4 字节&#xff08;32 位&#xff09;8 字节&#xff08;64 位&#xff09;精度约 6-7 位有…...

工厂模式加策略模式 -- 具体实现

这里写目录标题 定义接口定义抽象类定义主处理器分支处理器定义工厂demo 定义接口 public interface EntityHandler extends InitializingBean {MatchContentDTO match(MatchEntityDTO matchEntityDTO);String supportEntityType(); }定义抽象类 public abstract class Abstr…...

Redis7——进阶篇(五)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

什么是全栈?

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 &#x1f4c3;文章前言 &#x1f537;文章均为学习工…...

vue3实现虚拟滚动Vue-Virtual-Scroller

前端优化不可不避的一谈之虚拟滚动&#xff1a;众所周知&#xff0c;滚动是直挺挺的往dom树加东西&#xff0c;如果滚太多滚到万级&#xff0c;渲染过多就会卡顿&#xff0c;而vue-virtual-scroll的灵活懒渲染就能解决这个问题 1&#xff0c;下载与配置 npm install --save v…...

Flutter Dart 运算符全面解析

引言 在 Dart 语言中&#xff0c;运算符是用于执行各种操作的特殊符号。这些操作可以是算术运算、逻辑运算、比较运算等。了解并熟练运用这些运算符是进行 Flutter 开发的基础。本文将详细介绍 Dart 中常见的运算符&#xff0c;并结合代码示例进行说明。 1. 算术运算符 算术…...

XXE-labs靶场通关攻略

1.把相关压缩包放到www根目录下 2.解压&#xff0c;并且把php_xxe放在www目录下 3.进行访问发现是登陆页面 4.随便试试账号密码进行抓包 5.发送到重放器&#xff0c;发现username是回显点 6.可以利用xxe漏洞 <?xml version"1.0"?> //xml声明不重要&#x…...

Redis 主从复制详解:实现高可用与数据备份

目录 引言 1. 什么是 Redis 主从复制&#xff1f; 1.1 定义 1.2 核心概念 2. Redis 主从复制的工作原理 2.1 复制流程 2.2 复制流程图 3. Redis 主从复制的配置方法 3.1 通过配置文件配置 主节点配置 从节点配置 3.2 通过命令行配置 设置从节点 取消从节点 4. Re…...

文件解析漏洞靶场通关合集

一、IIS解析漏洞 &#xff08;一&#xff09;iis6的目录解析漏洞(.asp目录中的所有文件都会被当做asp文件执行) 第一步&#xff1a;在网站根目录下创建了一个x.asp文件夹&#xff0c;并在文件夹中创建一个名为1.txt的文本文档 第二步&#xff1a;文本文档中输入<% now()%&…...

vue的 props 与 $emit 以及 provide 与 inject 的 组件之间的传值对比

好的&#xff0c;下面是 props 与 $emit 以及 provide 与 inject 的对比&#xff1a; 1. props 与 $emit props&#xff1a;父组件通过 props 向子组件传递数据&#xff0c;子组件接收后不可修改。子组件只能读取 props 传递给它的数据。如果需要修改或更新父组件的状态&#…...

数据结构——环形数组

环形数组 start 指向第一个有效元素的索引&#xff0c;end 指向最后一个有效元素的下一个位置索引。 注意&#xff1a; start是闭区间&#xff0c;先左移后赋值&#xff0c;先赋值(null)后右移&#xff1b;end是开区间&#xff0c;先赋值再右移&#xff0c;先左移再赋值(null…...

k8s面试题总结(十五)

1.如何使用Kubernetes进行多环境部署&#xff08;如开发&#xff0c;测试和生产环境&#xff09;&#xff1f; 使用命名空间&#xff08;namespaces&#xff09;&#xff1a; 命名空间是用于逻辑隔离和资源分组的一种方式&#xff0c;可以为每个环境创建单独的命名空间。 2.使…...