【C++】穿越编程岁月,细品C++进化轨迹,深化入门基石(续章)——揭秘函数缺省参数的魅力、函数重载的艺术、引用的奥秘与内联函数的效率
文章目录
- 一、函数缺省参数
- 二、函数重载
- 三、引用
- 1.引用的概念和定义
- 2.引用的特性
- 3.引用的使用
- 4.const引用
- 5.指针和引用的关系
- 四、inline内联函数和nullptr
- 1.inline
- 2.nullptr
一、函数缺省参数
缺省参数其实就是默认参数,它是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数(有些地⽅把缺省参数也叫默认参数)
为了更好理解缺省参数,我们直接来演示一下它的用法,案例就是我们之前写过的顺序表初始化函数,如下:
void SLInit(SL* ps, int n = 10)
{assert(ps);//C++也有自己的一套内存开辟方法,后面会讲到//现在暂时使用mallocSLDataType* tmp = (SLDataType*)malloc(sizeof(n));if (tmp == NULL){perror("malloc");return;}ps->arr = tmp;ps->size = 0;ps->capacity = n;
}
在这个初始化函数中,我们多增加了一个参数,这个参数就是缺省参数,用户在调用这个函数时可以不传第二个参数,这个时候就会使用缺省参数10,给顺序表开辟好10个元素大小的空间
如果用户在使用前就大致知道了自己要使用多大空间,就可以直接自己传第二个参数,如果用户传了参数,之前的默认参数就失效了,函数会按照用户传的num来给顺序表开辟默认大小
这样做的好处就是可以避免频繁向堆区申请空间,可以提高性能,从这个例子我们也可以看出缺省参数确实很有用
接着我们来介绍一下缺省参数的分类,全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值,注意不是一半的参数给缺省值,而是“部分”,同时C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值,比如:
//全缺省
void Func1(int a = 10, int b = 20, int c = 30){cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;}//半缺省,半不是一半的意思,是“部分”
//半缺省要从右往左给默认值
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
在上面的半缺省函数中,要从右往左给默认值,跟赋值的顺序一致,如果我们我们可以把需要自己传的参数写在前面,后面就可以交给默认参数,当然也可以自己传
在传参时,C++规定必须从左到右依次给实参,不能跳跃给实参,比如当我们给Func1函数传参时,可以只给a传,可以只给a,b传,也可以都传,但是不能跳过a给b传,因为这样编译器分不出来到底要传参给谁
函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值,因为如果声明和定义的缺省参数不同的话,编译器也不知道到底采用哪一个缺省值,所以干脆语法上直接规定在函数声明给缺省值
二、函数重载
函数重载就是C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同,但是返回值不同不能构成函数重载,这个我们稍后举例解释
这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活,C语⾔是不⽀持同⼀作⽤域中出现同名函数的,比如相加函数Add,如果我们要整型相加就要写一个整型Add,如果要浮点型相加就要写一个浮点型相加,并且两个函数名字不能都为Add
那么我们要实现相加函数还要想办法取不同的名字来避免名称冲突,所以C++引入了函数重载,只要参数不同,那么函数名就可以相同,所以我们可以实现多个Add来支持多种类型的相加,如下:
#include <iostream>
using namespace std;int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}int main()
{int a = 10;int b = 20;double c = 10.1;double d = 20.5;cout << Add(a, b) << endl;cout << Add(c, d) << endl;return 0;
}
我们这两个Add函数的参数不同,构成了函数重载,编译器会根据类型自动匹配对应的函数,比如上面传a和b的函数会调用参数为int的Add函数,传c和d的函数会调用参数为double的Add函数,如图:
那么我们现在来测试一下,如果两个同名函数只有返回值不同,能不能构成函数重载,如下:
int Func()
{return 1;
}double Func()
{return 1.1;
}int main()
{cout << Func << endl;return 0;
}
我们来看看代码运行后会发生什么:
可以看到编译器报错了,告诉我们这两个函数无法构成重载,因为它们仅仅只有返回值不同,在调用Func函数时,编译器也不知道要调用哪个函数,有了冲突,所以两个函数只有返回值不同是无法构成函数重载的
三、引用
1.引用的概念和定义
引用是C++提出的新概念,它不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,从语法角度来说,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间,就像我们小时候的乳名一样,叫现在的名字是我们,叫乳名也是我们
引用的大致使用格式如下:
类型& 别名 = 引⽤对象
类型后面跟的就是跟取地址一样的符号,但是要注意区分,那并不是取地址操作符,而是引用操作符,那么为什么这个符号都已经用作取地址了,还要拿来给引用使用呢?
这是因为C++为了避免引入过多的运算符,所以把一些符号复用了,比如这里的引用和之前的流插入<<和流提取>>(C语言中也用作位运算符),我们要特别注意区分一下这些符号
接下来我们就简单演示一下引用的使用,后面还会具体讲到引用的使用场景:
int main()
{int a = 10; cout << a << endl;//b就是a的别名//从语法角度上别名不占空间int& b = a;b = 8;cout << a << endl;return 0;
}
这里b就是a的别名,如果我们修改b的话,a会不会跟着被修改呢,我们来看看代码运行结果:
可以看到我们修改a的别名b,也会把a跟着修改了,因为从概念上来说b是a的别名,和a共用同一块空间,修改了b自然也就修改了a
2.引用的特性
(1)引用在定义时必须初始化,这一点和指针不同,指针在定义时可以不初始化,而引用不初始化化就会报错
(2)一个变量可以有多个引用,也就是一个变量可以取多个别名,并且取别名后再对别名引用,这个引用还是原变量的引用
(3)一个引用一旦确定,就不能再更改为其它变量的引用
//演示第(2)条特性
int main()
{int a = 10;//b是a的别名int& b = a;//c是b的别名int& c = b;c = 20;cout << a << " " << b << endl;return 0;
}
在上面的代码中,b是a的别名,c是b的别名,那么按理来说c也是a的别名,因为b和a都共用同一块空间,c和b共用一块空间,自然a和c就共用一块空间了,那么我们来看看代码运行结果:
接下来我们来演示第(3)条特性
int main()
{int a = 10;int& b = a;int c = 20;b = c;return 0;
}
这里b是a的引用,当我们写出b = c之后,不会改变b对a的引用,让它变成c的引用,而是一个赋值操作,将c的值赋值给b,同时也是赋值给a
这也是引用无法完全替代指针的原因,虽然后面使用指针的大部分情况都可以使用引用替换,但是在数据结构上引用不能代替指针,比如链表,当我们删除节点后,一个引用不能改变指向引用到下一个节点
所以大部分情况下指针和引用相辅相成,大部分情况下可以使用引用代替指针,一些特殊情况下还是要使用指针
3.引用的使用
(1)引⽤在实践中主要是于引⽤函数传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象,因为引用只是原变量的别名,从语法角度上并没有开辟新的空间,更加有效率
(2)引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些,比如我们使用引用来写一个Swap函数,如下:
void Swap(int& x, int& y)
{int tmp = x;x = y;y = tmp;
}
由于x和y是对应变量的引用,所以我们在使用时不必再解引用了,写起来非常方便
(3)至于引用作为返回值我们就要格外小心,因为有时候我们会返回局部变量的引用,当局部变量出函数的作用域后会销毁,那么引用也就变成了野引用,如下:
int& Func()
{int a = 10;return a;
}
当a出了函数Func的作用域之后,a就被销毁了,那么我们返回a的别名,就变成了野引用,所以我们要保证我们返回的引用不是一个局部变量,而是一个即使函数栈帧被销毁了也依然存在的变量
(4)引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代, C++的引⽤跟其他语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向
(5)⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但实际上引用和指针的结合使用反而更容易让学生混淆了,况且C教材使用C++语法本身就不是很合理
4.const引用
引用是可以引用一个const对象的,但是这个引用必须是const引⽤,const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩和平移,但是不能放⼤,为了更好地理解这句话,我们举一个例子:
int main()
{const int a = 20;//a和b都被const修饰不能更改//权限一致,所以叫权限的平移const int& b = a;//c没有被const修饰,可以更改//但是a被const修饰不能更改//所以这属于权限放大,是不被允许的int& c = a;int x = 10;//原本x可以更改//但是y被const修饰,不能更改//所以这属于权限的缩小const int& y = x;return 0;
}
根据上面代码的分析,我们大致知道了权限的缩小、放大和平移,其中权限的放大是不被允许的,所以我们要谨慎使用,但是我们也要注意的一些我们可能会误会的情况,我们来看这样一个问题,如下:
//这里的b属于权限放大吗?
int main()
{const int a = 20;int b = a;return 0;
}
很明显这是不属于权限的放大的,因为这里根本没有涉及到引用,这里只是把a的值赋值给了b,没有发生有关权限的操作,所以不要搞混了,一定要注意看有没有引用
5.指针和引用的关系
1. C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代
2. 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间(实际在汇编层引用的本质就是使用了指针,但是语法层面上引用没有开空间)
3. 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的
4. 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象
5. 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象
6. sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8个字节)
7. 指针很容易出现空指针和野指针的问题,引⽤很少出现野引用,引⽤使⽤起来相对更安全⼀些
四、inline内联函数和nullptr
1.inline
当函数最前面加上inline后,我们称它为内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率
它就和我们C语言里面的宏函数差不多的作用,但是要比宏要更加稳定和可控,并且宏还不方便调试,C++中的内联函数就是为了替代宏函数
不过我们要注意的是inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个
因此inline内联函数更适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略
同时inline不建议声明和定义分离到两个⽂件,分离会导致链接错误,因为inline被展开,直接替换成了对应的语句,类似于宏展开,也就没有函数地址,那么链接时会出现报错,所以我们可以直接把它定义到头文件中
那么接下来我们简单地举一个例子:
inline int Add(int x, int y)
{return x + y;
}
在这个Add函数中,它的逻辑十分简单,甚至只有一条语句,所以为了避免要开辟函数栈帧造成浪费,我们将它定义为内联函数,使它在调用的地方直接展开,而不需要开辟它的函数栈帧
2.nullptr
nullptr也的出现是为了解决C++和C当中空指针的坑,我们首先来看看C++和C是如何定义空指针NULL的,方法就是:在main函数中写出NULL,然后ctrl + 单击即可跳转到NULL的定义中,如图:
在C++和C中,NULL其实是一个宏,这个条件编译指令我们在C语言预处理阶段已经学习过了,如果看不懂参考:【C语言】预处理(预编译)详解(下)(C语言最终篇)
那么现在我们直接翻译上面的宏语句,首先第一句就是,如果没有定义NULL那么就进入下面的判断,同时这里嵌套了一个ifdef
因为如果是C++文件,在文件前面会定义一个标志_ _cplusplus,这里就是判断前面有没有定义这个标志,如果定义了,说明是C++文件,然后C++文件中的NULL就被定义成了0,否则不是C++文件的话,NULL就被定义为了(void*)0
这两种定义其实都各有不足,我们来举一个例子:
void f(int x)
{cout << "f(int x)" << endl;
}void f(int* ptr)
{cout << "f(int* ptr)" << endl;
}int main()
{f(0);f(NULL);return 0;
}
在上面代码中,有两个函数f,它们构成函数重载,我们期望f(0)调用第一个函数,f(NULL)调用第二个函数,那么事实如我们所愿吗?我们来看看代码运行结果:
我们发现两次调用都调用的是第一个函数,原本NULL应该当作指针处理呀?原因就是前面我们说过的,在C++文件中,NULL被定义为了0,这是一个大坑,那么我们能否使用C语言的定义形式呢?
在C++中,这也是不被允许的,不能随意把整型转成void*的指针,所以会报错,如图:
所以C++为了弥补这个错误,C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型
使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型,所以如果我们在C++中想要使用空指针就直接使用nullptr即可,如图:
如上图所示,当我们使用nullptr中就可以正确匹配到对应重载的函数,所以我们要及时在学习的初阶就把习惯养成,用nullptr表示空指针,而非NULL
那么今天C++入门基础的知识(下)就分享到这里啦,欢迎点赞三连,有什么问题欢迎给我私信,我会尽快回复
bye~
相关文章:
【C++】穿越编程岁月,细品C++进化轨迹,深化入门基石(续章)——揭秘函数缺省参数的魅力、函数重载的艺术、引用的奥秘与内联函数的效率
文章目录 一、函数缺省参数二、函数重载三、引用1.引用的概念和定义2.引用的特性3.引用的使用4.const引用5.指针和引用的关系 四、inline内联函数和nullptr1.inline2.nullptr 一、函数缺省参数 缺省参数其实就是默认参数,它是声明或定义函数时为函数的参数指定⼀个缺…...
1/7 Spring三级缓存
首先我们来spring创建bean首先通过反射创建bean原始对象,然后通过 填充里面的属性,然后如果有AOP的话,那么就会创建这个代理对象,最后将代理对象传入这个单例池中 如何解决循环依赖问题的 比如A依赖B,B依赖A 如果在单例池没有找…...
【RK3568笔记】Android修改开机动画
概述 Android 的开机动画是由一系列连续的 PNG 图片作为帧组成的动画形式,不是一张 GIF 图片。将各帧 PNG 图片以压缩方式进行保存(压缩方式要求是存储压缩),并将保存的文件名命名为 bootanimation.zip,这个 bootanim…...
牛客网刷题 ——C语言初阶(5操作符)——JZ15 二进制中1的个数
1.题目描述 题目OJ链接 描述 输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。 2.思路 求2进制中1的个数,可以转换为求每一位,1的个数,1&1还是1 所以判断如果该数值&1为真,我们就co…...
Lua语言中常用的字符串操作函数
string.sub(s, i, j) 功能: 截取字符串 s 中从位置 i 到位置 j 的子字符串。 local s "Hello, Lua!" print(string.sub(s, 1, 5)) -- 输出 "Hello" print(string.sub(s, 8, 11)) -- 输出 "Lua!" string.len(s) 功能:将字符串长度…...
SpringBoot 2.6 集成es 7.17
引言 在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…...
Elasticsearch:搜索相关性
这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost:在索引层面修改相关性2、boosting:修改文档相关性3、negative_boost:降低相关性4、function_score:自定义评分5、…...
nlp培训重点-2
1. 贝叶斯公式 import math import jieba import re import os import json from collections import defaultdictjieba.initialize()""" 贝叶斯分类实践P(A|B) (P(A) * P(B|A)) / P(B) 事件A:文本属于类别x1。文本属于类别x的概率,记做…...
Python判断、循环练习
01 02 03...
基于ROS先验地图的机器人自主定位与导航SLAM
2021年学习,当时参加科大讯飞的智能车大赛, 【语音交互启动-teb算法路径规划A*算法自动避障路径最短优化yolo5目标检测视觉结果判断分类终点指定点位自动泊车语音播报。】 【讯飞学院】http://www.iflyros.com/home/ 一、全局路径规划中的地图 栅格地图&…...
计算机网络与服务器
目录 架构体系及相关知识 三层架构: 四层架构: 常见的应用的模式: OSI模型 分层 数据链路层 TCP/IP模型 TCP和UDP都是传输层的协议 TCP三次握手、四次次分手 URL&HTTP协议详解 网址URL 结构化 报文行 报文头 空行 报文体…...
IP查询于访问控制保护你我安全
IP地址查询 查询方法: 命令行工具: ①在Windows系统中,我们可以使用命令提示符(WINR)查询IP地址,在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息; ②在Linux系统中&…...
在 ASP.NET CORE 中上传、下载文件
创建 Web API 来提供跨客户端和服务器的文件上传和下载是常有的事。本文将介绍如何通过 ASP.NET CORE 来实现。 首先在 Visual Studio 中创建空的 Web API 项目,然后选择目标框架 .Net Core 3.1。 创建名为 FileController 的控制器,提供操作文件的接口…...
ETCD未授权测试
一、测试环境搭建 首先拉取etcd镜像 docker pull quay.io/coreos/etcd:v3.3.1 # 查看镜像 docker images创建自定义网络 docker network create --driver bridge --subnet172.16.1.0/16 --gateway172.16.1.1 mynet # 查看网络 docker network ls创建etcd节点 节点1: docke…...
ffmpeg将mp4等文件转mp3
安装ffmpeg 目录 安装ffmpeg macOS Windows 实现方法 Base Golang macOS 在macOS上,你可以使用Homebrew来安装FFmpeg,这是最简单和推荐的方法。以下是具体步骤: 安装Homebrew(如果尚未安装): 打开终端,执行以下命令来安装Homebrew: /bin/bash -c "$(c…...
python学习笔记—15—数据容器之列表
1. 数据容器 列表(list)、元组(tuple)、字符串(str)、集合(set)、字典(dict) 2. 列表 (1) 定义 tmp_list ["super", "carry", "doinb"] print(f"tmp_list {tmp_list}, tmp_list type is {type(tmp_list)}") tmp_list1 ["doi…...
基于MATLAB的汽车热管理模型构建
一、引言 汽车热管理系统对汽车性能、部件寿命及驾乘体验至关重要。它能确保发动机、电池等关键部件在适宜温度工作。MATLAB 功能强大,为构建高精度热管理模型提供有效途径,助力优化系统设计与控制策略。 二、汽车热管理系统构成 2.1 发动机冷却系统&…...
MySQL的主从复制
MySQL 主从复制详解 MySQL 的主从复制是一种用来实现数据同步的机制,可以将一个 MySQL 实例的数据同步到一个或多个从库(Slave)实例中。它广泛应用于数据备份、高可用架构、读写分离、负载均衡等场景。 1. 主从复制的基本概念 主库ÿ…...
playwright 录制
一、新建项目TestProject3 二、准备swagger 三、开始录制 打开PowerShell 7 (x64) cd D:\xxx\xxx\VS2022Projects\TestProject3\TestProject3\bin\Debug\net8.0 pwsh playwright.ps1 codegen --targetcsharp -b chromium localhost:5252/swagger/index.html #支持的语言 java…...
Azure主机windows2008就地升级十步
Azure上云主机的windows2008系统需要进行就地升级。 按着微软的升级路径:win2008-->win2012-->win2016-->win2022 第一步:创建快照备份,防止升级失败第二步:升级托管磁盘,在VM管理的地方将磁盘升级成托管磁盘…...
MySQL 主从复制 的原理、配置和如何实现 主从灾备
1. MySQL 主从复制原理与工作流程 MySQL 的主从复制本质上是一个 基于事件的日志传输系统。在这个系统中,所有对数据的修改(如 INSERT、UPDATE 和 DELETE)会在 主数据库 上记录到 二进制日志(binlog),然后…...
本地多卡(3090)部署通义千问Qwen-72B大模型提速实践:从龟速到够用
最近在做文本风格转化,涉及千万token级别的文本。想用大模型转写,在线的模型一来涉及数据隐私,二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限,正好实验室给俺配了4卡3090的机子,反正也就是做个推理&#…...
高级数据库系统 复习提纲
第一章 数据库技术的回顾与发展 简述三代数据库的发展历史及其对应特点: 新型数据库在“数据模型”上的创新: 简述数据库和什么相关技术结合,产生了什么新型数据库? 1. 数据库和并行处理技术结合,产生“并行数据库”…...
Python编程实例-特征向量与特征值编程实现
特征向量与特征值编程实现 文章目录 特征向量与特征值编程实现1、什么是特征向量2、特征向量背后的直觉3、为什么特征向量很重要?4、如何计算特征向量?4、特征向量Python实现5、可视化特征向量6、总结线性代数是许多高级数学概念的基石,广泛应用于数据科学、机器学习、计算机…...
十年后LabVIEW编程知识是否会过时?
在考虑LabVIEW编程知识在未来十年内的有效性时,我们可以从几个角度进行分析: 1. 技术发展与软件更新 随着技术的快速发展,许多编程工具和平台不断更新和改进,LabVIEW也不例外。十年后,可能会有新的编程语言或平台…...
第6章——HTTP首部
第六章——HTTP首部 HTTP报文结构 都必有报文首部 HTTP请求报文 HTTP响应报文 HTTP首部字段 ###传递重要信息 首部字段结构 首部字段名:字段值(,字段值,字段值) 首部字段类型 通用首部字段 请求首部字…...
Java多线程
一、线程的简介: 1.普通方法调用和多线程: 2.程序、进程和线程: 在操作系统中运行的程序就是进程,一个进程可以有多个线程 程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念; 进程则是执行程序的一次执…...
C++ 复习总结记录四
C 复习总结记录四 主要内容 1、构造函数其它要点 2、static 成员 3、友元 4、内部类 5、匿名对象 6、拷贝对象时编译器的优化 一 构造函数其它要点 1.1 构造函数体赋值 创建对象时,编译器调用构造函数,给对象中各个成员变量一个合适初始值 cl…...
Oracle Dataguard 需要配置的参数详解
Oracle Dataguard 需要配置的参数详解 目录 Oracle Dataguard 需要配置的参数详解一、数据库名:DB_NAME二、数据库唯一名:DB_UNIQUE_NAME三、LOG_ARCHIVE_CONFIG四、LOG_ARCHIVE_DEST_1五、LOG_ARCHIVE_DEST_2六、LOG_ARCHIVE_DEST_3七、LOG_ARCHIVE_DES…...
Java 内部类与异常类
目录 1.Java 内部类 2.Java 匿名类 1. 匿名类继承一个父类 2. 匿名类实现一个接口 3.Java 异常类 4.Java 异常的分类 1. Throwable类 2. Error类 3. Exception类 5.Java 常见的异常 1. NullPointerException(空指针异常) 2. ClassCastException(类转换异常) 3. In…...
Matlab仿真径向受压圆盘光弹图像
Matlab仿真径向受压圆盘光弹图像-十步相移法 主要参数 % 定义圆盘参数 R 15; % 圆盘半径,单位:mm h 5; % 圆盘厚度,单位:mm P 300; % 径向受压载荷大小,单位ÿ…...
补偿电阻对ota零极点的影响
本文内容主要是关于补偿电阻对零极点产生的影响。 1.极点分析 该补偿电阻并不会影响在输出端的主极点,受影响的主要是镜像极点。 这里我们可以先单看电流镜部分,这个补偿电阻的作用在于将极点推向原来的两倍,从而达到增加带宽的目的[1]。 …...
C++单例模式跨DLL调用问题梳理
问题案例: 假设有这样一个单例模式的代码 //test.h header class Test { public:static Test &instance() {static Test ins;return ins;}void foo(); };void testFoo();//test.cpp source #include "test.h"void Test::foo() {printf("%p\n&q…...
Linux高并发服务器开发 第十天(man手册 系统调用 文件打开关闭 文件创建权限)
目录 1.文件IO 1.1man 手册 1.2系统调用 1.3操作函数 1.3.1打开文件 1.3.2关闭文件 1.4文件创建权限 1.文件IO 1.1man 手册 man man 可以查看。man手册共 9 卷。 可执行程序、shell命令。系统调用函数。(内核提供的函数)库函数第 5 卷。查看特殊…...
用CRD定义未来:解锁机器学习平台的无限可能
Kubernetes CustomResourceDefinition(CRD)详解 一、CRD 概述 CRD(CustomResourceDefinition,自定义资源定义)是 Kubernetes 提供的一种机制,用于用户自定义新的资源类型。CRD 扩展了 Kubernetes API&…...
A second-price auction
第二价格密封拍卖(A second - price auction)是一种常见的拍卖形式,以下是一个用收益矩阵(Payoff Matrix)来说明第二价格密封拍卖的例子: 假设有三个竞拍者:A、B、C,他们对一件古董…...
MacBook_Xcode_Swift雨燕
Swift Swift Swift Swift是苹果公司开发的现代化编程语言, 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…...
力扣面试题 - 08.07.无重复字符串的排列组合 C语言解法 回溯递归dfs深度优先
题目: 无重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合,字符串每个字符均不相同。 示例 1: 输入:S "qwe"输出:["qwe", "qew", "wqe", "…...
数值分析速成复习笔记
请确保你有10hour的有效学习时间,保你拿90 证明部分 编程部分...
1.07 标准IO
1.思维导图 2.先编写以下结构体 struct Student { char name[20]; double math; double chinese; double english; double physical; double chemical; double…...
单片机实现模式转换
[任务] 要求通过单片机实现以下功能: 1.单片机有三种工作模式(定义全局变量MM表示模式,MM1,2,3表示三种不同的模式) LED控制模式 风扇控制模式 蜂鸣器控制模式 2.可以在某一个模式下通过拓展板KEY1按键控制设备 (按…...
JVM实战—OOM的定位和解决
1.如何对系统的OOM异常进行监控和报警 (1)最佳的解决方案 最佳的OOM监控方案就是:建立一套监控平台,比如搭建Zabbix、Open-Falcon之类的监控平台。如果有监控平台,就可以接入系统异常的监控和报警,可以设置当系统出现OOM异常&…...
GolangWeb开发- net/http模块
文章目录 Golang开发-案例整理汇总一、net/http介绍二、HTTP客户端Get请求Post请求三、HTTP服务端总结Golang开发经典案例,点击下方链接 Golang开发-案例整理汇总 一、net/http介绍 Go语言内置的net/http包提供了HTTP客户端和服务端的实现。 文档链接: https://pkg.go.dev/n…...
算法:线性查找
线性查找算法是一种简单的查找算法,用于在一个数组或列表中查找一个特定的元素。它从数组的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索完整个数组。线性查找的时间复杂度为O(n),其中n是数组中的元素数量。 实现原理 从列表的第一个元素开始,逐个检查每个…...
基于 Boost.Asio 和 Boost.Beast 的异步 HTTP 服务器(学习记录)
已完成功能: 支持 GET 和 POST 请求的路由与回调处理。 解析URL请求。 单例模式 管理核心业务逻辑。 异步 I/O 技术和 定时器 控制超时。 通过回调函数注册机制,可以灵活地为不同的 URL 路由注册处理函数。 1. 项目背景 1.1 项目简介 本项目是一个基于…...
『SQLite』常见函数的使用
摘要:主要讲解SQLite中的常见函数,有聚合函数、数字函数、字符串函数、日期函数、类型转换函数等。 主要函数 聚合函数:count()、sum()、avg()、min()、max()字符串函数:length()、upper()、lower()、substr()、trim()日期和时间…...
win下搭建elk并集成springboot
一、ELK 是什么? ELK 实际上是三个工具的集合,Elasticsearch Logstash Kibana,这三个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建可视化的海量日志分析平台。 ElasticSearch ElasticSearch 是一个基于 Lucen…...
ABAQUS柱状晶模型基于泰森多边形建模
建立柱状晶几何模型进行有限元分析有助于深入理解材料的微观结构与宏观性能之间的关系,为材料设计、制造工艺优化及失效预测提供了强有力的工具。本案例介绍采用AutoCAD基于泰森多边形算法生成柱状晶三维几何部件,并导入Abaqus有限元软件内建立包含晶粒及…...
MySQL InnoDB常用锁总结(行锁、间隙锁、临键锁、表锁)
在高并发数据库系统中,锁机制是保障数据一致性和事务隔离性的重要手段。MySQL 的 InnoDB 存储引擎提供了多种锁类型,包括行锁、间隙锁、临键锁和表锁。本文将详细介绍这些锁的原理、使用场景及其注意事项,并结合案例进行说明。 1. 表锁 概念…...
Flink系统知识讲解之:如何识别反压的源头
Flink系统知识之:如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念,强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理,这里有…...