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

《C++ primer plus》第15章:友元、异常和其他(4)

异常

栈解退

假设 try 块没有直接调用引发异常的函数,而是调用了对引发异常的函数进行调用的函数,则程序流程将从引发异常的函数跳到 包含try块和处理程序的函数。这涉及到栈解退(unwinding the stack),下面进行介绍。

首先来看一看 C++ 通常是如何处理函数调用和返回的。C++通常通过将信息放在栈(参见第9章)中来处理函数调用。具体地说,程序将调用函数的指令的地址(返回地址)放到栈中。当被调用的函数执行完毕后,程序将使用该地址来确定从哪里开始继续执行。另外,函数调用将函数参数放到栈中。在栈中,这些函数参数被视为自动变量。如果被调用的函数创建了新的自动变量,则这些变量也将被添加到栈中。如果被调用的函数调用了另一个函数,则后者的信息将被添加到栈中,依此类推。当函数结束时,程序流程将跳到该函数被调用时存储的地址处,同时栈顶的元素被释放。因此,函数通常都返回到调用它的函数,依此类推,同时每个函数都在结束时释放其自动变量。如果自动变量是类对象,则类的析构函数(如果有的话)将被调用。

现在假设函数由于出现异常(而不是由于返回)而终止,则程序也将释放栈中的内存,但不会在释放栈的第一个返回地址后停止,而是继续释放栈,直到找到一个位于 try 块中的返回地址。随后,控制权将转到块尾的异常处理程序,而不是函数调用后面的第一条语句。这个过程被称为栈解退。引发机制的一个非常重要的特性是,和函数返回一样,对于栈中的自动类对象,类的析构函数将被调用。然而,函数返回仅仅处理该函数放在栈中的对象,而 throw 语句则处理try块和throw之间整个函数调用序列放在栈中的对象。如果没有栈解退这种特性,则引发异常后,对于中间函数调用放在栈中的自动类对象,其析构函数将被不会被调用。

下面的函数是一个栈解退的示例。其中,main() 调用了 means(),而 means() 又调用了 hmean() 和 gmean()。函数 means() 计算算术平均数、调和平均数和几何平均数。main() 和 means() 都创建 demo 类型的对象(demo 是一个喋喋不休的类,指出什么时候构造函数和析构函数被调用),以便您知道发生异常时这些对象将被如何处理。函数 main() 中的 try 块能够捕获 bad_hmean 和 bad_gmean 异常,而函数 means() 中的 try 块只能捕获 bad_hmean 异常。catch 块的代码如下:

catch (bad_hmean & bh) {	// start of catch blockbh.mesg();std::cout << "Caught in means()\n";throw;		// rethrow the exception
}

上述代码显示消息后,重新引发异常,这将向上把异常发送给 main() 函数。一般而言,重新引发的异常将由下一个捕获这种异常的 try-catch 块组合进行处理,如果没有找到这样的处理程序,默认情况下程序将异常终止。下面的程序使用的头文件与之前一个相同(exec_mean.h)。

// error5.cpp -- unwinding the stack#include<iostream>
#include<cmath> // or math.h, unix users may need -lm flag
#include<string>#include"15.10_exc_mean.h"class Demo{
private:std::string word;
public:Demo(const std::string & str){word = str;std::cout << "Demo " << word << " created\n";}~Demo(){std::cout << "Demo " << word << " destroyed\n";}void show() const{std::cout << "Demo " << word << " lives!\n";}
};// function prototypes
double hmean(double a, double b);
double gmean(double a, double b);
double means(double a, double b);int main(){using std::cout;using std::cin;using std::endl;double x, y, z;{Demo d1("found in block in main()");cout << "Enter two numbers: ";while(cin>>x>>y){try{    // start of try blockz = means(x, y);cout << "The mean mean of " << x << " and " << y<< " is " << z << endl;}   // end of try blockcatch (bad_hmean & bh){  // start of catch blockbh.mesg();cout << "Try again.\n";continue;} catch (bad_gmean & bg){ cout << bg.mesg();cout << "Values used: " << bg.v1 << ", "<< bg.v2 << endl;cout << "Sorry, you don't get to play any more.\n";break;}   // end of catch block}d1.show();}cout << "Bye!\n";cin.get();cin.get();return 0;
}double hmean(double a, double b){if (a==-b)throw bad_hmean(a,b);return 2.0 * a * b / ( a + b);
}double gmean(double a, double b){if (a<0||b<0){ throw bad_gmean(a,b);}return std::sqrt(a * b);
}double means(double a, double b){double am, hm, gm;Demo d2("found in means()");am = (a+b)/2.0;     // arithmetic meantry{hm = hmean(a,b);gm = gmean(a,b);}catch (bad_hmean & bh){bh.mesg();std::cout << "Caught in means()\n";throw;      // rethrow the exception}d2.show();return (am+hm+gm)/3.0;
}

下面是上述程序的运行情况:

Demo found in block in main() created
Enter two numbers: 6 12
Demo found in means() created
Demo found in means() lives!
Demo found in means() destroyed
The mean mean of 6 and 12 is 8.49509
6 -6
Demo found in means() created
hmean(6, -6): invalid arguments: a = -b
Caught in means()
Demo found in means() destroyed
hmean(6, -6): invalid arguments: a = -b
Try again.
6 -8
Demo found in means() created
Demo found in means() destroyed
gmean() arguments should be >= 0
Values used: 6, -8
Sorry, you don't get to play any more.
Demo found in block in main() lives!
Demo found in block in main() destroyed
Bye!

程序说明
来看看该程序的运行过程。首先,正如 Demo 类的构造函数指出的,在 main() 函数中创建了一个 Demo 对象。接下来,调用了函数 means(),它创建了另一个 Demo 对象。函数 means() 使用 6 和 2 来调用函数 hmean() 和 gmean(),它们将结果返回给 means(),后者计算一个结果并将其返回。返回结果前,means() 调用了 d2.show();返回结果后,函数 means() 执行完毕,因此自动为 d2 调用析构函数:

demo found in means() lives!
demo found in means() destroyed

接下来的输入循环将值6和-6发送给函数means(),然后 means() 创建一个新的 demo 对象,并将值传递给 hmean()。函数 hmean() 引发 bad_hmean 异常,该异常被 means() 中的 catch 块捕获,下面的输出指出了这一点:

hmean(6, -6) : invalid arguments : a = -b
Caught in means()

该 catch 块中的 throw 语句导致函数 means() 终止执行,并将异常传递给 main() 函数。语句 d2.show() 没有被执行表明 means() 函数被提前终止。但需要指出的是,还是为 d2 调用了析构函数:

Demo found in means() destroyed

这演示了异常极其重要的一点:程序进行栈解退以回到能够捕获异常的地方时,将释放栈中的自动存储型变量。如果变量是类对象,将为该对象调用析构函数。

与此同时,重新引发的异常被传递给 main(),在该函数中,合适的 catch 块将捕获它并对其进行处理:

hmean(6, -6) : invalid arguments: a = -b
Try again.

接下来开始了第三次输入循环:6 和 -8 被发送给函数 means()。同样,means() 创建一个新的 Demo 对象,然后 6 和 -8 传递给 hmean(),后者在处理它们时没有出现问题。然而,means() 将 6 和 -8 传递给 gmean(),后者引发了 bad_gmean 异常。由于 means() 不能捕获 bad_gmean 异常,因此异常被传递给main(),同时不再执行 means() 中的其他代码。同样,当程序进行栈解退时,将释放局部的动态变量,因此为 d2 调用了析构函数:

Demo found in means() destroyed

最后,main() 中的 bad_gmean 异常处理程序捕获了异常,循环结束:

gmean() arguments should be >= 0
Values used: 6, -8
Sorry, you don't get to play any more.

然后程序正常终止:显示一些消息并自动 d1 调用析构函数。如果 catch 块使用的是 exit(EXIT_FAILURE) 而不是 break,则程序将立刻终止,用户将看不到下述消息:

Demo found in main() lives!
Bye!

但仍能够看到如下消息:

Demo found in main() destroyed

同样,异常机制将负责释放栈中的自动变量。

其他异常特性

虽然 throw-catch 机制类似于函数参数和函数返回机制,但还是有些不同之处。其中之一是函数 fun() 中的返回语句将控制权返回到调用 fun() 函数,但 throw 语句将控制权向上返回到第一个这样的函数:包含能够捕获相应异常的 try-catch 组合。例如,在上面的程序中,当函数 hmeans() 引发异常时,控制权将传递给函数 means();然而,当 gmeans() 引发异常时,控制权将向上传递到 main()。

另一个不同之处是,引发异常时编译器总是创建一个临时拷贝,即使异常规范和 match 块中指定的是引用。例如,请看下面的代码:

class problem { ... };
...
void super() throw (problem) {...if (oh_no){problem oops;		// construct objectthrow oops;			// throw it...}
}
...
try {super();
}
catch(problem & p){// statements
}

p 将指向 oops 的副本而不是 oops 本身。这是件好事,因为函数 super() 执行完毕后,oops 将不复存在。顺便说一句,将引发异常和创建对象组合在一起将更简单:

throw problem();		// construct and throw default problem object

您可能会问,既然 throw 语句将生成副本,为何代码中使用引用呢?毕竟,将引用作为返回值的通常原因是避免创建副本以提高效率。答案是,引用还有另一个重要特征:基类引用可以执行派生类对象。假设有一组通过继承关联起来的异常类型,则在异常规范中只需列出一个基类引用,它将与任何派生类对象匹配。

假设有一个异常类层次结构,并要分别处理不同的异常类型,则使用基类引用将能够捕获任何异常对象;而是用派生类对象只能捕获它所属类及从这个类派生而来的类的对象。引发的异常对象将被第一个与之匹配的 catch 块捕获。这意味着 catch 块的排列顺序应该与派生顺序相反:

class bad_1 {...};
class bad_2 : public bad_1 {...};
class bad_3 : public bad_2 {...};
...
void duper(){...if (oh_no)throw bad_1();if (rats)throw bad_2();if (drat)throw bad_3();
}
...
try {duper();
}
catch(bad_3 & be){// statements
}
catch(bad_2 & be){// statements
}
catch(bad_1 & be){// statements
}

如果将 bad_1 & 处理程序放在最前面,它将捕获异常 bad_1、bad_2、bad_3;通过按相反的顺序排列,bad_3 异常将被 bad_3 & 处理程序所捕获。

提示:如果有一个异常类继承层次结构,应这样排列 catch 块:将捕获位于层次结构最下面的异常类的 catch 语句放在最前面,将捕获基类异常的 catch 语句放在最后面。

通过正确地排列 catch 块的顺序,让您能够在如何处理异常方面有选择的余地。然而,有时候可能不知道会发生哪些异常。例如,假设您编写了一个调用另一个函数的函数,而您并不知道被调用的函数可能引发哪些异常。在这种情况下,仍能够捕获异常,即使不知道异常的类型。方法是使用省略号来表示异常类型,从而捕获任何异常:

catch(...) {	// catches any type exception// statements
}

如果知道一些可能会引发的异常,可以将上述捕获所有异常的 catch 块放在最后面,这有点类似于 switch 语句中的 default:

try {duper();
}
catch (bad_3 & be){// statements
}
catch (bad_2 & be) {// statements
}
catch (bad_1 & be) {// statements
}
catch (bad_hmean & h) {// statements
}
catch(...) {		// catch whatever is left// statements
}

可以创建捕获对象而不是引用的处理程序。在 catch 语句中使用基类对象时,将捕获所有的派生类对象,但派生特性将被剥去,因此将使用虚方法的基类版本。



相关文章:

  • Android开发环境搭建
  • CS61B 2021spring HW0
  • 高阶数据结构 位图的介绍
  • 【时间复杂度和空间复杂度】
  • Linux产生死锁的必要条件和常见的锁种类
  • Python与Matlab混合编程案例
  • 17 | 如何做好面试复盘?将经验提升为能力
  • layui框架学习(1:布局)
  • Ubuntu安装wordpress
  • 【Linux】POSIX信号量
  • 【云原生】Prometheus 监控系统的初步了解与系统搭建
  • stack、queue、priority_queue
  • 高通平台开发系列讲解(GPS篇)gpsONE 系统架构
  • Lab 3: Midterm Review
  • C#手动操作DataGridView之------使用各种数据源填充表格实例
  • Python map() 使用方法及示例
  • 【Leetcode刷题】141、环形链表
  • 前同事居然因为 Pycharm 的这个功能,即使离职三年也依然经常被请去喝茶~
  • 量化选股——基于多因子模型的量化策略(第1部分—因子测算策略构建)
  • 【SpringCloud】Nacos集群搭建
  • 从源码解析代理模式
  • goto语句——“C”
  • 行为型模式-状态模式
  • C++学习/温习:新型源码学编程(一)
  • gcc中预定义的宏__GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
  • 【图卷积网络】02-谱域图卷积介绍
  • 分享148个ASP源码,总有一款适合您
  • 2023.1.25,周三【图神经网络 学习记录9】图网络的分类,异构图---注意力机制网络:节点级别的attention,语义级别的attention
  • Jetpack架构组件库:Room
  • kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge
  • 盖子的c++小课堂——第十三讲:二维数组
  • 打工人必知必会(二)——劳动合同解除
  • 数据结构 第三章 栈和队列(栈)
  • 大年初二、初三—— 牛客网刷题经验分享~
  • 利用Windows系统服务进行权限提升
  • 2021 XV6 8:locks
  • 排列的时候如何避免重复?
  • 机器学习【西瓜书/南瓜书】--- 第四章决策树
  • ffmpeg无损裁剪、合并视频
  • 《C++ primer plus》第15章:友元、异常和其他(3)
  • 3.7-2动态规划--图像压缩(举例子和写代码)
  • Java基础练习题(十二)
  • VBA提高篇_07 Goto跳转 / Exit退出 /VBA错误处理
  • 栈与队列总结
  • 最详细、最仔细、最清晰的几道python习题及答案(建议收藏哦)
  • Java基础练习题(十一)
  • 流批一体计算引擎-7-[Flink]的DataStream连接器
  • c++函数(2)
  • RabbitMQ-客户端源码之AMQChannel
  • 学习记录673@项目管理之进度管理案例
  • 【23】C语言 | 初阶结构体
  • k8s单机版使用本地存储local-path-provisioner
  • 【Git】Git 的基本使用
  • 【MySQL】第十二部分 子查询
  • WPF的APP生命周期以及全局异常捕获
  • C++初阶:vector类
  • 2022年度总结——2022我在CSDN的那些事暨2023我的目标展望:Pursue freedom Realize self-worth
  • 自动驾驶环境感知——视觉传感器技术
  • 机器学习中软投票和硬投票的不同含义和理解
  • 3.1(完结)Linux扫盲笔记
  • 冯诺依曼体系结构及操作系统(OS)的简单认识
  • 返回值的理解
  • Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取
  • 【Typescript学习】使用 React 和 TypeScript 构建web应用(三)所有组件
  • 【VisualBasicApplication】Excel编程
  • Linux系统之网络客户端工具
  • uniapp组件传参方式梳理
  • 手把手教你如何在项目中使用阿里字体图标IconFont
  • C语言函数调用详解
  • 离散系统的数字PID控制仿真-3
  • Day11 AOP介绍
  • 本质安全设备标准(IEC60079-11)的理解(三)
  • Let’s Encrypt SSL 证书的申请与使用
  • Linux——动态库
  • leetcode刷题记录总结-3. 哈希表
  • linux基本功系列之-rpm命令实战
  • 时序数据处理中的拟合问题
  • 3小时精通opencv(五) 利用TrackBar进行颜色检测
  • 数学建模学习笔记(9)多元线性回归分析(非常详细)
  • Python爬虫教你爬取视频内容
  • 数据库02_函数依赖,数据库范式,SQL语句关键字,数据库新技术---软考高级系统架构师009
  • 如何好好说话-第12章 理清楚问题就是答案
  • Java链表OJ题
  • 前端布局神器display:flex
  • Jetpack架构组件库:Hilt
  • Java基础语法——运算符与表达式
  • 安装mysql 5.7.24
  • 一周学习总结(2022.1.25)
  • CSS基础学习
  • Linux文件系统(IO缓冲区+磁盘+软硬链接)
  • 【servlet篇】HTTP协议相关知识点
  • Java---微服务---RabbitMQ入门与应用
  • 7.3 矩阵范数
  • JMeter测试redis性能
  • 【设计模式】结构型模式·组合模式
  • 第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)
  • 41.Isaac教程--使用DOPE进行3D物体姿态估计
  • 【Linux】gdb调试器的使用
  • 互联网摸鱼日报(2023-01-26)
  • python语法 dot函数
  • Docker 基础 - 3
  • 如何使用Maven构建Java项目?Maven的使用详细解读
  • RISC-V Assembler Modifiers
  • VMware虚拟机无法向宿主机拖放文件
  • Mybatis-Plus 多记录操作与逻辑删除
  • 【Python语言基础】——Python 迭代器
  • [Python]调用pytdx的代码示例
  • 【Linux】目录权限和默认权限
  • APT之木马静态免杀
  • Python装饰器使用方法详解
  • SpringBoot+Vue项目在线视频教育平台
  • 利用Golang可选参数实现可选模式
  • 游戏启动器:LaunchBox Premium with Big Box v13.1
  • CSS权威指南(十)浮动
  • RESTful的意义及其使用规则
  • SpringMVC总结
  • Android MVVM的实现
  • 0、Spring工程构建Spring快速入门Spring配置文件详解注入Sprint相关API
  • PostGIS:ST_AREA面积计算
  • 厚积薄发打卡Day115:Debug设计模式<简单工厂、工厂方法、抽象工厂>
  • 【MySQL进阶】MySQL视图详解
  • kubernetes资源对象应用类(二)
  • 线程控制--Linux
  • 测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法
  • 面试屡次碰壁后,我是如何调整最终拿下一线大厂offer的?
  • 在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop加强版(包括Minio,ssh登录等)
  • 重学python
  • Java 方法
  • 分享142个ASP源码,总有一款适合您
  • 树型结构——二叉数
  • 2-SAT
  • 8. 好客租房-WebSocket与即时通讯系统[项目必需]
  • Linux 命令(249)—— unset 命令(builtin)
  • 【1】初识Linux
  • 数据结构---堆
  • python元组
  • 【My Electronic Notes系列——直流稳压电源】
  • 有关Android的TextView组件的几个问题
  • Spring核心模块解析—BeanDifinition。
  • JavaEE多线程-定时器
  • C++编译之(4)-进阶-cmake设置install及package配置
  • 【每日一道智力题】之坤坤猜生日(面试高频)
  • 斐波那契数列的--------5种算法(又称“兔子数列”)
  • Java基础 IO
  • Extractor.app学习
  • 深入学习Vue.js(十四)同构渲染
  • Spring笔记上(基于注解开发)
  • 定位 position属性 相对定位 绝对定位 固定定位 定位下的居中 多个定位元素重叠时 补充
  • NLP | 打造一个‘OpenAI智能’机器人,只需要五分钟
  • 好的质量+数量 = 健康的创作者生态
  • 设计一个70W在线人数的弹幕系统
  • JavaWeb | 揭开SQL注入问题的神秘面纱
  • 【编程入门】开源记事本(微信小程序版)
  • 2022年复盘:越走越偏
  • C语言深度解剖-关键字(1)
  • 千峰学习【Ajax】总结
  • 【设计模式】结构型模式·享元模式
  • Redis实现好友关注 | 黑马点评
  • Ubuntu 20.04 下 部署 SoftEther
  • Python OS 文件目录方法 os.walk()
  • 《Buildozer打包实战指南》第七节 打包资源文件
  • 关于非授权访问的逻辑漏洞挖掘
  • 数据结构-树
  • JavaWeb项目中添加live2d模型
  • VBA提高篇_05日期时间函数
  • HackTheBox Stocker API滥用,CVE-2020-24815获取用户shell,目录遍历提权
  • 正则表达式(转载)
  • 【Android】开发一个简单时钟应用每天看时间起床
  • 常见DEM数据汇总
  • 如何设计一个 70w 在线人数的弹幕系统
  • “华为杯”研究生数学建模竞赛2005年-【华为杯】D题:仓库容量有限条件下的随机存贮管理(附获奖论文)
  • 3000字英文随笔(挽救下语感)
  • MS-Model【3】:Medical Transformer
  • 2023第五届中国眼博会,北京眼睛健康展,北京护眼仪展
  • 【JavaEE初阶】第六节.多线程 (基础篇 )线程安全问题(下篇)
  • 好客租房-09_学习MongoDB并完善通讯系统
  • 提权漏洞和域渗透历史漏洞整理
  • OCR文字识别基础
  • 辗转相除以及辗转相减法
  • 【Linux】多线程同步与互斥
  • 【HBase入门】5. 常用 Shell 操作(2)
  • 构造函数的4种使用方式总结
  • 如何取消PDF文件的保护设置?
  • 第二章 物理层
  • JAVA中static、final、static final的区别
  • 行为型模式-命令模式
  • 在线工具轻松设计电商直通车主图,无需下载
  • 水面漂浮物垃圾识别检测系统 YOlOv7
  • 【蓝桥云课】位运算
  • 2023-1-24 刷题情况
  • Java面试题,mysql相关基础问题(全是自己的总结,如有不对,敬请斧正)
  • flask框架全解
  • 机器视觉_HALCON_HDevelop用户指南_1.HDevelop介绍
  • C 语言零基础入门教程(九)
  • 机器学习(七):Azure机器学习模型搭建实验
  • JavaScript总结
  • 90. 注意力分数及代码实现
  • 从技术角度看Android大系统的构成
  • 如何设计一个70W在线人数的弹幕系统文章分析
  • TPH-YOLOv5
  • 前缀树 字典树 TrieTree的学习与模拟实现
  • vue2升级vue3:vue3真的需要vuex或者Pinia吗?hooks全有了
  • 如何好好说话第11章 攀登抽象之梯
  • 模型压缩(model compression)
  • 如何安装双系统与多系统(带你快速了解)
  • JAVA基础知识08集合基础
  • java-List
  • 超级详解洛谷P4011 孤岛营救问题(bfs超难题)(保证看懂)
  • Linux- 系统随你玩之--文本处理三剑客-带头一哥-awk
  • [JavaEE]线程池
  • java选择结构与switch case语句
  • MySQL 安装包下载
  • 小动画制作时需要的知识点
  • STM32+python产生三角波
  • 【刷题大本营】二叉树进阶oj题(动图讲解,附代码及题目链接)
  • 【手写 Promise 源码】第二篇 - Promise 功能介绍与特性分析
  • RAID不同类型之间的区别
  • 机器学习(六):模型评估
  • spring boot前后端交互之数据格式转换
  • Java多线程案例之阻塞队列
  • 5-6中央处理器-多处理器系统硬件多线程
  • FME进阶视频教程: FME常用转换器之坐标系操作类,讲解在FME中如何操作矢量数据的坐标系
  • LeetCode(Array)1431. Kids With the Greatest Number of Candies
  • matplotlib嵌套南海子图
  • 91.使用注意力机制的seq2seq以及代码实现
  • 目录生成测试
  • 函数的认识
  • 笔试题-2023-华为-数字芯片【纯净题目版】
  • ROS学习寄录之知识学习
  • 传参的理解
  • 网狐大联盟非联盟成员无法创建房间解决-暂时不可创建当前游戏,请选择其他游戏!
  • MyBatisPlus入门简介
  • 对JDBC驱动注册--DriverManager.registerDriver和Class.forName(driverClass)的理解
  • 【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星
  • JVM快速入门学习笔记(四)
  • 第一章 概述
  • 【大数据管理】Java实现字典树TireTree
  • 第24章 Microsoft.Data.SqlClient中间件数据库生成
  • Mybatis 基本使用案例
  • 通过实例了解uprobe及其对性能的影响
  • linux基本功系列之wc命令实战
  • [GYCTF2020]EasyThinking (ThinkPHP V6.0.0)
  • [Linux]进程地址空间
  • 2023年最新Python常见编程面试题(1)精选30个题目附答案
  • pythpon基础:创建文件索引升级版
  • 【Python语言基础】——Python 继承
  • 24. 面向对象的思想
  • 【蓝桥杯-筑基篇】基础数学思维与技巧(1)
  • MyBatis的入门
  • Linux中的权限问题
  • leetcode72 编辑距离
  • Vue3【1.v-if 和 v-show 、2.动态组件、 3.网页的渲染 、4.v-for】
  • 高等数学(第七版)同济大学 习题12-8 个人解答
  • 计算机存储系统
  • 目标检测知识蒸馏---以SSD为例【附代码】
  • 【Kotlin】扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )
  • 图论(入门版)
  • Linux存活指令和具体使用方法
  • ★ 我的世界各类奇葩武器实现!(命令方块1.13+)
  • 基于ImageAI的图像识别
  • 【论文阅读】吴恩达分享的论文阅读方法
  • DlhSoft Gantt Chart Light Library 4.3.47 Crack
  • Docker 解决 `denied: requested access to the resource is denied`
  • ROS学习寄录之环境搭建
  • 想要学会二叉树?树的概念与结构是必须要掌握的!快进来看看吧
  • MySQL事务的四大特性以及并发事务问题
  • SpringBoot-过滤器的使用(在访问页面时过滤掉未登录的用户使其不能访问相应页面)
  • ricequant量化的基础是什么?
  • 条款2:理解auto型别推导
  • Linux|奇怪的知识---CPU温度监控
  • 笔试题-2023-杰理科技-数字IC设计【纯净题目版】
  • 离线用户基于内容召回集
  • GPU虚拟化(留坑)
  • spingboot如何接受前端请求
  • python列表用法
  • 2023起点上,一段迷茫的自我倾诉
  • 数学小抄: 李群李代数再回顾 [SLAM十四讲]
  • Vuex里面四个map方法(mapState、mapGetters、mapActions、mapMutation)
  • CSS之浮动以及清除浮动的几种方式
  • 27. 作用域
  • Windows CMD命令大全
  • Python流程控制语句之循环语句
  • 好客租房-13.WebMagic
  • Springboot+java师生交流答疑作业系统
  • 基于Android的高校疫情防控信息系统的设计与实现
  • 通过Moonbeam的Connected Contracts互连合约从Axelar转移Token至Centrifuge
  • 77、TensoRF: Tensorial Radiance Fields
  • 基于Android的动漫之家系统的设计与实现
  • 【C++】深浅拷贝
  • Springboot整合Redis
  • 基于代理 Dao 实现 CRUD 操作
  • Java线程池(超详细)
  • ESP32设备驱动-8x8LED点阵驱动(基于Max7219+SPI)
  • Python-Flask-2023.1.24-Review
  • HTML学习
  • mysql之explain(性能分析)
  • C语言基础知识(38)
  • go 语言 string 类型思考
  • AxMath使用教程(持续更新中)
  • /proc/meminfo的理解vmtouch使用介绍内存碎片整理
  • 行为型模式-模板方法模式
  • WordPress整站源码安装说明(搬家换域名/服务器)的安装步骤
  • 最小化最大值+拓扑排序要点+概率
  • 十大经典排序算法(动态演示+代码)-选择排序与插入排序
  • 好客租房-12.ES接入java
  • 【Linux】Linux调试器——gdb使用
  • 5-5中央处理器-指令流水线
  • HTML基本常用标签
  • java+ssm网上书店图书销售评价系统
  • 【数据结构】详谈复杂度
  • Python函数(函数定义、函数调用)用法详解
  • Python基础学习 -- 常用模块
  • k8s安装nfs设置pv pvc并部署mysql
  • BERT模型结构可视化与模块维度转换剖析
  • 【LeetCode】计算右侧小于当前元素的个数 [H](归并排序)
  • 【每日一道智力题】三个火枪手(快来看人生哲理)
  • SaaS是什么,目前主流的国内SAAS平台提供商有哪些?
  • Opencv项目实战:19 手势控制鼠标
  • 2023 年第一弹, Flutter 3.7 发布啦,快来看看有什么新特性
  • 3.5动态规划--凸多边形的最优三角剖分
  • (python)selenium工具的安装及其使用
  • 对多线程中线程池的理解
  • 深度学习流行的框架有哪些?分别有什么特点
  • C++初阶--多态
  • Leetcode:46. 全排列、47. 全排列 II(C++)
  • LeetCode13罗马数字转整数
  • CE训练教程进阶,步骤 9: 注入++
  • 【21】C语言 | 几个经典数组练习题
  • VMWare 移动Linux CentOS 7虚拟机后连不上网怎么办
  • 【Ubuntu】Nacos 2.1 单机安装
  • LeetCode 2520. 统计能整除数字的位数
  • “深度学习”学习日记。与学习有关的技巧--Bacth Normalization
  • Ubuntu下为可执行文件和脚本文件(.sh)生成桌面快捷方式
  • 【c语言进阶】结构体最常用知识点大全
  • 30. PyQuery: 基于HTML的CSS选择器
  • 初出茅庐——索引和文档的基本操作
  • C++:类中const修饰的成员函数
  • AtCoder Beginner Contest 285 题解
  • 2023年springcloud面试之Eureka(第二部分)
  • 为 TDesignBlazor 添加暗黑模式
  • DFS(六) N皇后 II
  • Linux中的工具使用【vim的存活级】
  • JavaScript 所见所得文本编辑器 Froala Editor 4.0.17Crack
  • Allegro如何自动做差分对内等长操作指导
  • 洛谷-P2114 [NOI2014] 起床困难综合症
  • 【学习笔记】[AGC023E] Inversions
  • JDBC连接池多线程通过CountDownLatch实现线程并发执行
  • ISIS简介、NSAP与NET地址、Router-Id转换成NET地址
  • 【GIS】高分辨率遥感影像智能解译
  • C语言基础 — ( C语言库函数<stdio.h>——C标准的内容)
  • AI算法(三)plt基础
  • final的一个重要用途-宏变量和未初始化问题
  • C++空间命名
  • 快速排序的实现和优化~
  • macOS Ventura 13.2 (22D49) 正式版发布,ISO、IPSW、PKG 下载
  • MS Access数据库多数据源JDBC查询
  • 十大经典排序算法(动态演示+代码)-堆排序
  • Python3 round() 函数
  • 信息论复习—连续信源、信道及容量
  • RadSystems Studio 8.1.8 Crack
  • 【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现
  • 【MySQL】第十一部分 SELECT的执行过程
  • 【目标跟踪】------deepsort
  • 2023牛客寒假算法集训营3
  • 基于Springboot vue前后端分离在线培训考试系统源码
  • MyBatis基本使用及XML配置
  • Java数组
  • [数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序
  • 鱼雷的发射角设置
  • 深度学习数据标注_Lableme
  • JavaWeb语法八:网络原理初识
  • 基于STM32的FreeRTOS开发(1)----FreeRTOS简介
  • 搭建本地Maven仓库
  • 算法:树状数组详解(c++实现 求解动态数组区间和问题)
  • 《深入浅出计算机组成原理》学习笔记 Day10
  • day 19 暴力枚举
  • 尚医通-手机登录-判断用户登录状态-用户网关整合(三十)
  • 使用Vue 简化 用户查询/添加功能
  • emoji 符号大全,给各位程序员增加一些奇怪的知识点
  • Mysql入门技能树-数据类型
  • Eclipse导入python项目
  • 简明Java讲义 2:数据类型和运算符
  • 【JavaWeb】JavaScript基础语法(下)
  • 56. 合并区间 738.单调递增的数字
  • 数据库和SQL概述
  • 力扣刷题记录——645. 错误的集合、657. 机器人能否返回原点、674. 最长连续递增序列
  • AtCoder Regular Contest 149
  • 常用的负载均衡算法
  • 恶意代码分析实战 14 反虚拟机技术
  • Mine Goose Duck 0.2版本发布
  • 离线用户召回定时更新
  • MP-4可燃气体传感器介绍
  • 【设计模式】结构型模式·外观模式
  • C C++实现两矩阵相乘--模拟法
  • 服务器配置定时脚本 crontab + Python;centos6或centos 7或centos8 实现定时执行 python 脚本
  • git 操作整理
  • ESP32设备驱动-TSL2561亮度传感器驱动
  • SOLID原则总结
  • 机器学习笔记之深度玻尔兹曼机(二)深度玻尔兹曼机的预训练过程
  • [Android开发基础1] 五大常用界面布局
  • JavaEE day4 初识HTML+总结3
  • 【C#】WPF实现经典纸牌游戏,适合新手入门
  • LA@determinant@行列式@Vandermonde行列式
  • python爬虫学习笔记-mysql数据库介绍下载安装
  • Linux使用YUM源安装Docker
  • Prometheus学习整理-Prometheus-operator
  • Python(for和while)循环嵌套及用法
  • Elasticsearch:Elasticsearch percolate 查询
  • mysql之索引
  • 【Linux】文件权限
  • MySQL内外连接
  • 04_iic子系统
  • IPV4地址详解
  • 矩阵理论复习(六)
  • AX7A200教程(4): DDR3的读写fifo仿真
  • 2023牛寒2--Tokitsukaze and Three Integers
  • [ 华为云 ] 云计算中Region、VPC、AZ 是什么,他们又是什么关系,应该如何抉择
  • 【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)
  • 20230125英语学习
  • Linux常见命令 8 - 其他文件搜索命令 locate, which, whereis, grep
  • 前端艺术之毛玻璃-倾斜-日历
  • Java基础 Stream流方法引用异常文件
  • TCP/IP IP地址概念与应用
  • 手把手教你写一个极简版Netty
  • Tkinter的Checkbutton控件
  • 汇编语言学习 下
  • 二叉树基础oj练习
  • fpga实操训练(系统开发和硬件接口)
  • 审批工作流—ccflow
  • ThreadLocal详解
  • Java大数值与浮点数计算
  • cmake 05 使用库
  • 浏览器使用本地硬盘上的JS文档
  • Python基础学习七
  • Java IO流之字符流详解
  • 二叉树专题汇总
  • 多个盒子排列规则(视觉格式化模型) 多个盒子的排列 页面布局
  • Linux下动静态库的打包与使用C C++
  • ubuntu 22.04学习笔记
  • 2023年网络安全比赛--中间件渗透测试中职组(超详细)
  • Python初学者看过来啊,老油条来复习
  • 单绞机控制算法模型(Simulink仿真)
  • 十二、创建和管理表
  • MySQL HA(High Availability) 数据库高可用工具Orchestrator安装
  • 通信原理简明教程 | 基本概念
  • 【头歌】单链表的排序操作
  • Mysql入门技能树-使用数据库
  • Java线程池
  • 恶意代码分析实战 1 静态分析基础技术
  • 恶意代码分析实战 7 WinDbg
  • Vue-Router详解
  • PHP 实例 - AJAX 实时搜索
  • 【MySQL】存储引擎
  • 《MLB美职棒大联盟》:年度最佳教练奖·棒球1号位
  • 19、Javaweb案例-登录功能
  • 【Git :分布式版本控制工具】
  • jvm面试题汇总
  • 电商项目之同一笔单多次收款成功
  • 零基础学JavaWeb开发(二十二)之 springmvc入门到精通(2)
  • Issues with peer dependencies found
  • CSS 艺术之心形-彩虹-加载动画
  • Python---自动生成二维码
  • Java集合常见面试题(四)
  • input 实现回车失焦,考虑输入法的情况
  • 高等数学【合集2】
  • 雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元
  • 【操作系统】—— Windows常用快捷键(带你快速了解)
  • 基于Andriod的智慧校园卡系统的设计与实现
  • (18)go-micro微服务ELK介绍
  • OSG三维渲染引擎编程学习之二十八:“第三章:OSG场景组织” 之 “3.10 Switch开关节点”
  • 动态站点地图提交百度收录
  • 【价格型需求响应】基于Logistic函数的负荷转移率模型需求响应研究(Matlab代码实现)
  • javascript中Math.random()产生随机数进行随机点名
  • Hyperbolic geometry (双曲几何简介)
  • 【Leetcode每日一题】34.在排序数组中查找元素的第一个和最后一个位置|二分求下标
  • 【JavaEE】如何开始基础的Servlet编程(基于Tomcat服务器)
  • 【SpringCloud20】SpringCloud Alibaba Seata处理分布式事务
  • MODBUS总线的学习笔记
  • OSG三维渲染引擎编程学习之二十七:“第三章:OSG场景组织” 之 “3.9 AutoTransform自动对齐节点”
  • 最实用的 Docker 知识(一)
  • Leetcode:78. 子集、90. 子集 II(C++)
  • 1月23日Linux c编程之Makefile
  • UPS BP650CH实现nas自动关机
  • MySQL —— 库操作
  • ❤️如何实现所谓的“关键字传参”--理论+易懂版⭐
  • 【JavaEE】认识线程Thread类及常用方法线程状态
  • Shell语法
  • MP-2平面烟雾气体传感器介绍
  • springboot中restful风格请求的使用
  • 【19】C语言 | 三子棋
  • 【每日一题Day97】LC1828统计一个圆中点的数目 | 模拟
  • 议论文书写总结
  • Day869.索引(下) -MySQL实战
  • 离线召回与排序介绍
  • 【Ajax】防抖和节流
  • CMAKE
  • 【面试克星】【公式少代码少话多】Vins-Mono预积分相关知识点总结与概述
  • C语言基础知识(36)
  • Python实现一个简易的CLI翻译程序
  • SQL学习