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

C++笔记-模板进阶和继承(上)

一.模板进阶

1.1非模板类型参数

那之前学过的stack举例,在这之前我们如果要用N,就要用宏来定义,但是宏毕竟有局限性:

如果我要用到两个stack,一个要求10个空间,另一个要求100空间呢?

这时候有人可能会说把N定义为100不就行了。

确实,这样能解决当前的问题,但是会不会造成浪费?第一个stack是不是就浪费了90个空间。

所以为了解决这种问题,就引入了非模板类型参数:

这样就可以完美解决这个问题,需要多少空间我就开多少空间,就避免了浪费的问题。

当然,也是可以给缺省值的。

那么哪里会用到这种用法呢?

在C++11中引入的容器array就需要用到这种方式,那么这个容器是干什么的呢?

这东西和我们平常用的静态数组差不多,底层也是一个数组。

就连两个数组的大小也是一样的,基本没什么区别。

但是array是不允许你对数组进行修改,包括我们之前学的头部,尾部和中间的插入和删除,只能访问其中的数据,并且array并不会对数组中的数据进行初始化:

通过调试可以看出数组中的数据对视随机值。

这个容器呢用的不多,原因相信大家都知道:我有更好用的vector为什么不用呢?

那么array具体和我们日常用的静态数字有什么区别呢?

体现在越界的读和写方面:

在上面的代码中,很明显我们越界访问了,但是静态数组的越界读是不检查的,所以程序并不会报错。

而静态数组的写是抽查,可能越界几个会检查出来,后面就不一定检查出来。

而array的读和写都会检查,一旦出现越界访问,就会因为断言而报错。

最后目前非模板类型参数一般只支持整型,最新的编译器会支持double等类型,像自定义类型都是不支持的。

1.2特化

1.2.1概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能胡得到一些错误的结果,需要特殊处理,比如:是西安一个串门用来比较的函数模板:

1.2.2函数模板特化

那我们之前写过的Date类举例,此时我们传过去来比较两个日期的大小事没有问题的。

此时结果就出现错误,因为我们是用地址进行比较的,用地址去比较不是我们想要的,那么此时就需要用到特化:

这就是特化的基本应用,下面是特化的基本格式:

1.必须先有一个基础的函数模板

2.关键字template后面接一对空的尖括号<>

3.函数名后跟一对尖括号,尖括号中指定需要特化的类型

4.函数形参表:必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误

看到这些规则是不是感觉特化很麻烦,还有更坑的地方:

是不是感觉很奇怪,明明参数都是照着上面写的,却还是报错了。

其实这里出错的原因是:上面的const修饰的是x和y,而下面的const修饰的是*x和*y,导致类型不同报错。

只有写成这样才是正确的,如果使用特化这里很容易出问题,而且问题还不好发现。

并且特化的这个功能完全可以自己在写一个函数,构成函数重载,也不用遵循那么多规则:

这样写更为简洁,也更好理解,所以特化在实际应用中用的并不多。

1.2.3类模板特化

1.全特化

这就是全特化的类模板,也就是将所有的参数进行特化,只有传固定类型的参数才能进入到特化后的类模板。

从输出结果也可以看出传不同参数调用的是不同的类模板。

2.偏特化/半特化

偏特化又叫半特化,顾名思义就是只特化部分类型,如上面这个所示:只要第二个参数类型是char就能进入到这个类里面。

而偏特化还有一种玩法:

这种玩法的意思就是我不限制你传的参数的类型,但是我要求你传过来是的当前类型的指针才能进入。

这种玩法也可以解决一种问题:
就比如上篇我们所讲的priority_queue,如果像这样我有的传Date*,有的传int*,那比较的都是地址,这种比较是没有意义的。

但是如果又不想写那么多仿函数的情况下就可以用这种玩法解决问题。

1.3模板分离编译

比如我们要写一个函数模板来打印出容器内的数据,正常来讲就是这样写的,而所谓的模板分离编译就如下方所示:

这就是模板的分离编译,声明在头文件,定义在c++文件,那么为什么把这个单独拿出来讲呢?

因为这样写是不对的,会出现链接错误:

这就是链接错误,这玩意儿报错你是看不懂的,那么为什么会报链接错误呢?

这里因为涉及到编译链接的知识,如果要细讲的话会扯出一大堆知识,所以这里我就简单来讲,毕竟这个知识点没那么重要,作为了解的知识即可。

根本原因就是没有实例化,编译阶段调用时知道实例化的是什么,但是只限于声明,此时定义并不知道实例化的是什么,就无法生成相应函数的指令,所以我们在调用时链接阶段发现定义没有实例化,就会报链接错误。

所以在写模板时尽量都把定义和声明写在同一个文件中,这样编译阶段声明和定义都知道实例化的是什么,就可以生成对应函数的指令。

那么如果非要声明和定义分离呢?

也是有解决方法的:

就是在定义的地方直接指明我要实例化的是什么,这样就可以解决问题,具体格式就如上图所示。

但是为什么不用这种方式呢?

设想如果我们要用的很多容器,并且一个容器中的数据还有不同类型,那是不是我们调用一个就要写一个这样的代码,那不是很麻烦吗?

所以在实际应用中,不要对模板进行分离编译。

再讲一个知识点:大家看到我在上面调用容器的迭代器之前写了typename关键字,这种方式是在告诉编译器我这里是类型,否则编译器不知道Container是什么,就会报错。

适用的场景就是模板在调用内嵌类型时要在类型前加上typename,就比如容器。

最后对模板进行一个总结

优点:

1.模板复用了代码,节省资源,更快的迭代开发,c++标准模板库(STL)因此而产生

2.增强了代码的灵活性

缺点:
1.模板会导致代码膨胀问题,也会导致编译时间变长

2.出现模板编译错误时,错误信息非常凌乱,不易定义错误(就如上面分离编译时报的错误)

二.继承

我们知道c++面向对象的三大特性:封装,继承和多态,接下来就要讲解第二大特性继承的相关知识。

2.1继承的定义

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的函数层次的复用,继承是类设计层次的复用。

继承理解起来也很简单,就比如说有人努力学习,最会父母告诉他自己家是亿万富翁,让他不用努力了,回家继承家业。

在c++中的继承和这个概念差不多,就是一个类继承了另一个类的内容。

那为什么要有继承这个东西呢?
就比如学校有学生,老师,保安和食堂阿姨,学校要统计他们的信息,除了一样要统计的姓名和年龄等,但是不同的身份也会有区别与其他人的信息,比如学生的学号,老师的职称等,这些东西我们如果都写在一个里面内容就太多了,这时就可以用到继承:

这就是继承的基本格式,要在类名后加:,再加上是什么类型的继承,最后加上要继承的类。

上面的school称为父类或者基类,下面的student和teacher称为子类或者派生类。

继承之后就可以调用父类的内容,至于能调用那些内容,就和下面的知识有关。

2.2继承基类成员访问方式的变化

1.基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面都不能去访问它。
2.基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。
3.实际上面的表格我们进行一下总结会发现,基类的私有成员在派生类都是不可见。基类的其他成员在派生类的访问方式==Min(成员在基类的访问限定符,继承方式),public>protected > private。
4.使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最好显示的写出继承方式。
5.在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用
protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

父类的各种类型成员和子类继承的方式合在一起总共有9种方式。

之前我们虽然提到了protected,但是从来没有用过,而在继承这里就要用,并用于区分。

先讲第一条:关于父类的private成员,不管你是什么继承方式都是子类和类外无法访问的,这就像每个人都有自己的隐私,你的父母也有自己的隐私,隐私当然是不能被其他人看的。

但是也不是说一定没法用,不能直接使用,那就间接使用就行:

可以在父类public中定义一个函数来返回private中的变量,在访问这个函数即可实现间接访问。

第二条就涉及到我们未讲的protected,和private不同的是,protected的成员在子类是可以访问的,但在类外不能访问。

 第三条的意思是取继承方式和父类成员权限的较小值,这里权限只是一种说法,后面就是权限的大小关系,取其中的较小值后父类的成员或者函数就变成子类中的相应权限的成员和函数。

第四条:

class如果不写具体的继承方式,就默认是private继承,相应的struct就是public继承。

第五条为什么protected和private很少用呢?

因为继承不就是让你用吗,不让用我继承你干嘛,话糙理不糙,大概就是这么个道理。所以我们呢一般使用public继承,这样继承之后在子类中的权限和父类就能保持一致,不会出现权限的变化。

2.3继承类模板

模板当然也是可以继承的,这里就以继承vector为例。如果要使用继承类模板,就要在要使用的函数前加上类域,否则就会报下面的错误:

找不到标识符其实也是没有实例化的结果,当stack<int>实例化时,vector<int>也实例化了,但是模板是按需实例化,push_back等函数并没有实例化,所以就会报这种错误。

这个也当一个了解的知识即可,想必大家也都能看出来使用起来是没有我们之前的用法方便的,所以用的也很少。

2.4基类和派生类之间的转换

1.public继承的派生类对象可以赋值给基类的指针/基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中基类那部分切出来,基类指针或引用指向的是派生类中切出来的基类那部分。

2.基类对象不能赋值给派生类对象。

形象一点如上图所示,父类取得只是父类中含有的那一部分,也就相当于把子类给切割了,注意是public继承,如果是其他继承方式,就会报错:

当然也正如第二条所说,父类对象是不能赋值给子类的,因为子类有的父类没有,不但没法切割还少东西。

就会报这种错误,并且强转也不行:

基类和派生类之间的转换涉及到我们之前学的隐式类型转换,正常来讲,不同类型的成员在赋值时会产生临时对象,这也是产生临时对象的三种情况之一,但是在积累和派生类之间进行转换时是不会产生临时对象的。

这也就是为什么上面引用没有加const也能通过的原因。

2.5继承中的作用域

隐藏规则:

1.在继承体系中基类和派生类都有独立的作用域。
2.派生类和基类中有同名成员,派生类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏。
(在派生类成员函数中,可以使用基类::基类成员显示访问)
3.需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
4.注意在实际中在继承体系里面最好不要定义同名的成员。

第一条大家都耳熟能详,不同的类代表不同的作用域,也就能存在同名成员和同名函数。

第二条我用下面的例子来说明:

在上面的例子中,父类和子类中都有num1成员变量,但我们通过结果可知,输出的并不是父类中的num1,而是子类中的num1,此时就是子类把父类的同名成员给隐藏了。

而我们如果想要访问父类的num1,就要指定类域:

指定类域后,就可以访问相应的成员变量。

而第三点呢,我们先来看一道题:

1.A和B类中的func函数构成什么关系?

A.重载   B.隐藏   C.没关系

大家可以思考一下这个问题的答案。

答案选择B,可能有人会觉得这不就是函数重载吗,函数名相同,参数不同。

如果是同一作用域,确实如此,但是这是在不同的作用域,正如第三条所说,在继承中,同名函数只要名字相同就会隐藏。

我们再看一题:

2.此时如果取消注释代码会出现什么问题?

A.编译错误   B.运行错误   C.正常运行

大家可以思考一下这个问题的答案。

答案选择A,这里因为子类的func对父类的func进行隐藏,所以父类的不需要传参的func就不能使用,所以程序就会报错:

而想要访问的方法和上面一样,指定类域即可:

此时代码就没有问题了。

最后就如第四条所说,最好不要定义同名成员和函数,即使真的定义了,也要遵守对应的规则进行访问。

以上就是模板进阶和继承(上)的内容。

相关文章:

C++笔记-模板进阶和继承(上)

一.模板进阶 1.1非模板类型参数 那之前学过的stack举例&#xff0c;在这之前我们如果要用N&#xff0c;就要用宏来定义&#xff0c;但是宏毕竟有局限性&#xff1a; 如果我要用到两个stack&#xff0c;一个要求10个空间&#xff0c;另一个要求100空间呢&#xff1f; 这时候…...

云计算赋能质检LIMS的价值 质检LIMS系统在云计算企业的创新应用

在云计算技术高速发展的背景下&#xff0c;实验室信息化管理正经历深刻变革。质检LIMS&#xff08;实验室信息管理系统&#xff09;作为实验室数字化转型的核心工具&#xff0c;通过与云计算深度融合&#xff0c;为企业提供了高弹性、高安全性的解决方案。本文将探讨质检LIMS在…...

2025系统架构师---数据抽象(Data Abstraction)‌与‌面向对象架构风格

引言 在软件系统复杂度与规模不断攀升的今天&#xff0c;如何设计出可扩展、易维护且能快速响应需求变化的架构&#xff0c;是每一位系统架构师面临的挑战。‌数据抽象&#xff08;Data Abstraction&#xff09;‌与‌面向对象架构风格&#xff08;Object-Oriented Architectu…...

[python] 基于WatchDog库实现文件系统监控

Watchdog库是Python中一个用于监控文件系统变化的第三方库。它能够实时监测文件或目录的创建、修改、删除等操作&#xff0c;并在这些事件发生时触发相应的处理逻辑&#xff0c;因此也被称为文件看门狗。 Watchdog库的官方仓库见&#xff1a;watchdog&#xff0c;Watchdog库的官…...

缺省处理、容错处理

布尔判定 假&#xff1a;false 0 null undefined NaN 可选符.?和&#xff1f;&#xff1f; let obj {name: jim,data: {money: 0,age: 18,fn(a){return a}} }1、如果左侧的值为null或者undefined&#xff0c;则使用右侧值。需要使用"??" obj?.data?.a…...

Taro on Harmony :助力业务高效开发纯血鸿蒙应用

背景 纯血鸿蒙逐渐成为全球第三大操作系统&#xff0c;业界也掀起了适配鸿蒙原生的浪潮&#xff0c;用户迁移趋势明显&#xff0c;京东作为国民应用&#xff0c;为鸿蒙用户提供完整的购物体验至关重要。 &#xfeff; &#xfeff;&#xfeff; 去年 9 月&#xff0c;京东 AP…...

Java基础——排序算法

排序算法不管是考试、面试、还是日常开发中都是一个特别高频的点。下面对八种排序算法做简单的介绍。 1. 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a;相邻元素比较&#xff0c;每一轮将最大元素“冒泡”到末尾。 示例数组&#xff1a;[5, 3, 8, 1, 2] pub…...

【操作系统原理07】输入/输出系统

文章目录 零.大纲一.I/O设备的概念和分类0.大纲1.什么是I/O设备2.I/O分类 二.I/O控制器0.大纲1.I/O设备的电子部件&#xff08;I/O控制器&#xff09;2.IO控制器组成3.内存映像I/O VS 寄存器独立编址 三.I/O控制方式0.大纲与总结1.程序直接控制方式&#xff08;1&#xff09; 操…...

IM云端搜索全面升级,独家能力拓展更多“社交连接”玩法

在这个数字时代&#xff0c;网络让信息传递前所未有的便捷&#xff0c;但同时&#xff0c;海量数据堆积也让内容检索变得像大海捞针。尤其是在我们日常工作生活中最常用的即时通信软件中&#xff0c;信息的快速查找和精准定位正变得越来越重要。 但传统的本地搜索功能受限于设…...

汽车产业链主表及类别表设计

&#xff08;提前设计&#xff0c;备用&#xff09; 一、汽车产业链类别表&#xff08;industry_chain_category&#xff09; 设计要点 1、核心字段&#xff1a;定义产业链分类&#xff08;如零部件、整车制造、销售服务等&#xff09; 2、主键约束&#xff1a;自增ID作为唯一标…...

有效的字母异位词

recorded&#xff1a;用于统计或抵消字符出现次数。 class Solution { public:bool isAnagram(string s, string t) {int record[26]{0};for(int i0;i<s.size();i){record[s[i]-a];}for(int i0;i<t.size();i){record[t[i]-a]--;}for(int i0;i<26;i){if(record[i]!0){…...

汽车网络安全 -- 理解暴露面、攻击面和攻击向量

1.暴露面是攻击面的子集 举个例子&#xff0c;房子都有门、窗户&#xff0c;这些窗户、门不管是否打开&#xff0c;都可能被小偷利用进入到房内&#xff0c;因此这些门窗可能是潜在的漏洞&#xff0c;所以称之为攻击面(Attack Surface)。 小偷经过长期观察&#xff0c;发现家…...

C++异步利器:全面理解 std::packaged_task

在现代 C&#xff08;C11及以后&#xff09;中&#xff0c;并发与异步编程是不可回避的重要技能。我们常常希望把某些计算任务扔给后台线程去处理&#xff0c;同时又能优雅地获取任务结果。 这时候&#xff0c;std::packaged_task 就是一个非常强大的工具。 本文将带你深入理解…...

Animate 中HTMLCanvas 画布下的鼠标事件列表(DOM 鼠标)

在 JavaScript 和 ‌Adobe Animate&#xff08;CreateJS&#xff09;‌ 中&#xff0c;常用的鼠标交互事件可分为两大类&#xff1a;‌基础 DOM 事件‌ 和 ‌CreateJS 扩展事件‌12。以下是完整分类&#xff1a; 一、基础 DOM 鼠标事件 事件名触发场景冒泡特性click鼠标左键单…...

RagFlow文档切块提升

1.RagFlow切块介绍 2.复现优化 2.1 General 通用分块 def parser_text(self, txt, blockSize512, overlapSize0, delimiter"\n!?;。&#xff1b;&#xff01;&#xff1f;"):文本分割sentences self.split_text_by_period_qh(txt, delimiter, blockSizeblockSize)…...

音频转base64

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>音频转Base64</title><style>.containe…...

蓝桥杯 11. 打印大X

打印大X 原题目链接 题目描述 小明希望用星号拼凑&#xff0c;打印出一个大 X&#xff0c;他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格&#xff0c;所有的空白位置都以句点符 . 来代替。 输入描述 输入两个整数 m 和 n&#xff0c;表示笔画的宽度和 X 的高…...

页面需要重加载才能显示的问题修改

1.问题描述&#xff1a;跳转页面后&#xff0c;只有点击重新加载后才会显示内容 经过测试后&#xff1a; / 跳转详情 const goToDetail (bookId) > { router.push({ path: /classic-detail, query: { book_id: bookId } }) } 执行完以上代码后&#xff0c;页面从classics…...

On the Biology of a Large Language Model——Claude团队的模型理解文章【论文阅读笔记】其二——数学计算部分

这篇内容的源博文是 On the Biology of a Large Language Model 这是Anthropic&#xff0c;也就是Claude的团队的一遍技术博客。他的主要内容是用一种改良版的稀疏编码器来解释LLM在inference过程中内部语义特征的激活模式。因为原文太长&#xff0c;我把原文分成了几份来写阅读…...

Python语言基础知识详解:标识符与变量

Python语言基础知识详解&#xff1a;标识符与变量 一、标识符&#xff08;Identifiers&#xff09; 定义 标识符是用于命名变量、函数、类、模块或其他对象的名称。它是代码中对实体的唯一标识。 1. 标识符的命名规则 Python的标识符需遵循以下规则&#xff1a; 允许的字符 由…...

google chrome 中 fcitx5 候选框不跟随光标

我的电脑&#xff1a;ubuntu22.04&#xff0c;窗口系统&#xff1a;wayland 2025/4/26 号更新的谷歌浏览器 今天打开浏览器发现输入法的候选框固定在左上角不动了&#xff0c;一番折腾&#xff0c;发现解决办法如下&#xff1a; 在搜索框中输入 about:flags搜索 wayland&#…...

深入浅出提示词工程(结合 DeepSeek)

提示词工程 Prompt 即提示、指令&#xff0c;所以提示工程也叫「指令工程」 用户输入的问题称为 Prompt&#xff0c;本文主要探讨 System Prompt&#xff08;我将其翻译成「系统预设」&#xff09; 使用 Prompt 的目的 直接提问 如「我该学 Vue 还是 React&#xff1f;」&…...

OpenVLA:大语言模型用于机器人操控的经典开源作品

TL;DR 2024 年斯坦福大学提出的 OpenVLA&#xff0c;基于大语言模型实现机器人操控&#xff0c;代码完全开源。 Paper Notes Name&#xff1a;OpenVLA: An Open-Source Vision-Language-Action ModelURL&#xff1a;https://openvla.github.io/作者&#xff1a;斯坦福&#…...

数值分析、数值代数之追赶法

数值分析、数值代数之追赶法 MATLAB 中&#xff0c;diag 函数用法追赶法推导过程代码运行过程 MATLAB 中&#xff0c;diag 函数用法 在 MATLAB 中&#xff0c;diag 函数用于处理矩阵的对角线元素或创建对角矩阵。以下是其常见的用法&#xff1a; 1.提取矩阵的对角线元素 2.创…...

深入浅出JVM - Java架构师面试实战

深入浅出JVM - Java架构师面试实战 本文通过模拟一位拥有十年Java研发经验的资深架构师马架构与面试官之间的对话&#xff0c;深入探讨了JVM的核心知识点。涵盖内存结构、垃圾回收算法、垃圾回收器、内存调优工具及参数配置等关键领域。 第一轮提问 面试官&#xff1a; 马架…...

Qt网络数据解析方法总结

在Qt中解析网络数据通常涉及接收原始字节流&#xff0c;并将其转换为有意义的应用层数据。以下是详细步骤和示例&#xff1a; 1. 网络数据接收 使用QTcpSocket或QUdpSocket接收数据&#xff0c;通过readyRead()信号触发读取&#xff1a; // 创建TCP Socket并连接信号 QTcpSo…...

[AHOI2001] 质数和分解

import java.util.*;public class Main {static int[] ss new int[201];public static void main(String[] args) {Scanner sc new Scanner(System.in);while (sc.hasNextInt()) { int n sc.nextInt();int num 0; // 记录质数个数int[] dp new int[201];dp[0] 1;for (in…...

说一下Drop与delete区别

在数据库操作里&#xff0c;DROP与DELETE是两个重要且功能不同的命令&#xff0c;以下为你详细介绍二者的区别&#xff1a; 功能层面 DROP&#xff1a;此命令用于删除数据库、表、视图、索引等数据库对象。一旦执行&#xff0c;数据库对象就会被彻底删除&#xff0c;其定义和…...

基于云原生架构的后端微服务治理实战指南

一、引言&#xff1a;为什么在云原生时代更需要微服务治理&#xff1f; 在单体应用时代&#xff0c;开发和部署虽然简单&#xff0c;但随着系统规模的扩大&#xff0c;单体架构的维护成本急剧上升&#xff0c;部署频率受限&#xff0c;模块之间相互影响&#xff0c;最终导致系…...

后端响应巨量数据,如何优化性能?

WebSocket流式传输 fetch虚拟滚动 &#xff08;渲染性能提升&#xff0c;一次性记载固定条数&#xff09;分片滚动 fetch流式传输 async function streamData(url) {unction streamOutput(msg) {// 发送 POST 请求fetch(url, {method:"POST",body:JSON.stringify({ …...

《代码整洁之道》第4章 注释 - 笔记

注释的恰当用法是弥补代码表达意图时遭遇的失败&#xff0c;良好的代码&#xff0c;让读者看代码就能明白含义。 代码在变动&#xff0c;在演化。注释并不总是随之变动。不准确的注释比没有注释要坏的多。注释算的上是一种没办法去除的恶。 注释不能美化代码 与其花时间编写…...

闭包与装饰器(python)

此 Python 代码借助闭包构建了计算对数的函数。闭包指的是一个函数与其所引用的外部变量共同构成的一个整体。借助闭包&#xff0c;我们能够创建具有特定行为的函数&#xff0c;并且这些函数可以记住其创建时的环境。 代码详细分析 导入模块 python import math 导入 math …...

学成在线网页

技术&#xff1a;h5css&#xff0c;静态页面 主页&#xff1a; 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…...

AI测试工具Testim——告别自动化测试维护难题

随着人工智能技术的快速发展&#xff0c;AI测试工具正在成为提升软件研发效能的关键。每款AI的特性各有差异&#xff0c;今天&#xff0c;我们就给大家介绍一款专注于Web和移动应用的端到端的AI测试工具--Testim。 Testim的简介 官网地址&#xff1a;https://www.testim.io/ 简…...

【C++详解】C++入门(二)引用、内联函数、nullptr宏

文章目录 一、引用引用的概念和定义引用的功能引用的特性const引用const用法回顾权限的放大缩小const引用的功能 指针和引用的关系 二、内联函数三、nullptr补充结构体指针变量类型重定义 一、引用 引用的概念和定义 C祖师爷为了优化在部分场景中使用指针会出现的效率较低和比…...

8、HTTPD服务--CGI机制

目录 1、测试PHP页面 2、安装php软件 一、CGI机制介绍 1、测试PHP页面 [rootlocalhost ~]# cat /mp3/test1.php AAAAAAAAAAAAA <?phpphpinfo(); ?> 2、安装php软件 # yum install -y php # systemctl restart httpd php实际上是作为httpd的功能模块存在的 [r…...

层级时间轮的 Golang 实现原理与实践

一、引言 在高并发服务中&#xff0c;延时任务的管理是一个常见且重要的需求。比如 HTTP 请求超时、心跳检测、订单超时未支付提醒等场景&#xff0c;传统的 Timer 或 Heap 实现会带来 O(log n) 的复杂度&#xff0c;难以支撑百万级别的定时任务。 论文《Hashed and Hierarch…...

人类社会的第四阶段

本书的主旨是探讨一场新的权力革命&#xff0c;它将以20世纪民族国家的毁灭为代价&#xff0c; 解放出个体。创新&#xff0c;以前所未有的方式改变了暴力的逻辑&#xff0c;并且正在革新未来的 边界。如果我们的推论是正确的&#xff0c;你们正站在一场有史以来最宏大的革命的…...

Golang | Builder模式

Builder模式是一种创建型设计模式&#xff0c;用于分步骤构建复杂对象&#xff0c;尤其适用于构造过程复杂或需要多个配置选项的场景。将对象的构造过程与其表示分离&#xff0c;通过分步骤和链式调用的方式灵活创建对象&#xff0c;避免构造函数的参数爆炸&#xff0c;提升代码…...

C#本地使用离线ocr库识别图片中文本,工具包PaddleOCRSharp

C#本地使用离线ocr库识别图片文本&#xff0c;工具包PaddleOCRSharp PaddleOCRSharp介绍 项目地址&#xff1a;https://github.com/raoyutian/PaddleOCRSharp PaddleOCRSharp 是一个.NET版本OCR可离线使用类库。项目核心组件PaddleOCR.dll目前已经支持C\C、.NET、Python、Go…...

Flutter 在 Dart 3.8 开始支持 Null-Aware Elements 语法,自动识别集合里的空元素

近日&#xff0c;在 Dart 3.8 的 changelog 里正式提交了 Null-Aware Elements 语法&#xff0c;该语法糖可以用于在 List、Set、Map 等集合中处理可能为 null 的元素或键值对&#xff0c;简化显式检查 null 的场景&#xff1a; /之前 var listWithoutNullAwareElements [if …...

3、Linux操作系统下,linux的技术手册使用(man)

linux系统内置技术手册&#xff0c;方便开发人员查阅Linux相关指令&#xff0c;提升开发效率 man即是manual的前三个字母&#xff0c;有时候遇事不决&#xff0c;问个人&#xff08;man&#xff09; 其在线网址为&#xff1a;man 还有man网站的作者写的书&#xff0c;可以下…...

Python 自动化办公:Excel 数据处理的“秘密武器”

引言 在日常的 IT 办公场景里&#xff0c;Excel 是数据处理与分析的 “常胜将军”。无论是财务人员整理账目、销售团队统计业绩&#xff0c;还是运营人员分析用户数据&#xff0c;Excel 都发挥着关键作用。但面对海量数据&#xff0c;手动操作 Excel 不仅效率低下&#xff0c;还…...

通过数据增强打造抗噪音多模态大模型

下载前面 想象一下,你正在一个嘈杂的咖啡馆里,想让身边的AI助手帮你预定一张电影票。或者,你在熙熙攘攘的街道上,需要语音导航带你找到目的地。在这些真实的场景中,语音交互面临着一个巨大的挑战——噪音。 背景噪音、他人说话声、设备本身的电流声……这些无处不在的干…...

Node.js API 安全的主要策略:最佳实践

了解 Node.js API 安全性 保护 Node.js API 的安全需要了解潜在的漏洞并采取措施来缓解这些漏洞。这类 API 通常遇到的常见威胁包括: SQL 注入**:**操纵用户输入以针对数据库执行恶意 SQL 代码。跨站点脚本**(XSS):**将恶意脚本注入其他用户查看的网页。跨站请求伪造**(CSR…...

如何删除Google Chrome中的所有历史记录【一键清除】

谷歌浏览器记录了用户访问过的网站。这方便了查找&#xff0c;但有时也需要清理。删除所有历史记录很简单&#xff0c;只要按照以下步骤操作。 1. 打开谷歌浏览器 首先要启动谷歌浏览器。点击右上角的三个点&#xff0c;进入主菜单。 2. 进入历史记录界面 在菜单中找到“历史…...

计算机三大主流操作系统的前世今生 - Linux|macOS|Windows

全文目录 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 综合解析3.1 Linux系统综合解析3.1.1 系统定义与核心架构3.1.2 发展历程3.1.3 核心特点3.1.4 主流发行版3.1.5 应用场景 3.2 macOS系统综合解析3.2.1 系统定义与核心架构3.2.2 发展历程3.2.3 核心特点…...

大数据学习栈记——Hive4.0.1安装

本文介绍大数据技术中数据仓库Hive的安装配置&#xff0c;版本&#xff1a;Hive4.0.1&#xff0c;Ubuntu24.04。 Hive简介 Hive由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据…...

8.Excel:数据验证和下拉列表

一 数据验证 1.作用 限制用户输入单元格的值。 补充&#xff1a;数据验证要先设置验证才会起作用&#xff0c;对于已经填写完成的表格来说&#xff0c;可以快速找到不符合的数值。 选中整列&#xff0c;然后设置数据验证。 然后圈释无效数据&#xff0c;不符合的会被圈出来 2.如…...

【机器学习-线性回归-4】线性回归中的最优解:从数学原理到实践应用

在机器学习的世界里&#xff0c;线性回归就像是一把瑞士军刀——简单却功能强大。无论是预测房价、分析销售趋势&#xff0c;还是研究变量间的相关性&#xff0c;线性回归都是数据科学家首选的入门算法。但你是否曾好奇过&#xff0c;这个看似简单的算法背后&#xff0c;是如何…...