【C++心愿便利店】No.2---函数重载、引用

文章目录

  • 前言
  • 🌟一、函数重载
    • 🌏1.1.函数重载概念
    • 🌏1.2.C++支持函数重载的原理 -- 名字修饰
  • 🌟二、引用
    • 🌏2.1.引用的概念
    • 🌏2.2.引用特性
    • 🌏2.3.常引用
    • 🌏2.4.使用场景
    • 🌏2.5.传值、传引用效率比较
    • 🌏2.6.引用和指针的区别
  • 🌟三、末尾彩蛋(带你回溯时空联想之前)


前言

在这里插入图片描述

👧个人主页:@小沈YO.
😚小编介绍:欢迎来到我的乱七八糟小星球🌝
📋专栏:C++ 心愿便利店
🔑本章内容:函数重载、引用
记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~


提示:以下是本篇文章正文内容,下面案例可供参考

🌟一、函数重载

函数重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!"

🌏1.1.函数重载概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题

1. 参数类型不同
#include<iostream>
using namespace std;
int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
int main()
{
	cout << Add(1, 2) << endl;
	cout << Add(1.1, 2.2) << endl;
	return 0;
}
类型不同:一个整形一个浮点型但是函数名相同C++会自动匹配类型C却不能
2. 参数个数不同
#include<iostream>
using namespace std;
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
int main()
{
	f();
	f(10);
	return 0;
}
3. 参数类型顺序不同
#include<iostream>
using namespace std;
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}
int main()
{
	f(10, 'a');
	f('a', 10);
	return 0;
}
注意:是参数类型的顺序不同不是形参的名字不同
#include<iostream>
using namespace std;
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(int b, char a)
{
	cout << "f(int b, char a)" << endl;
}

请添加图片描述

注意:返回值不同不能构成重载
#include<iostream>
using namespace std;
void f(char a, int b)
{
	cout << "f(int a,char b)" << endl;
}
int f(char a, int b)
{
	cout << "f(int a, char b)" << endl;
}
int main()
{
	return 0;
}

请添加图片描述

4. 重载与缺省参数的碰撞擦出的火花
#include<iostream>
using namespace std;
//构成函数重载
void func(int a)
{
	cout << "void func(int a)" << endl;
}
void func(int a, int b = 1)
{
	cout << "void func(int a,int b)" << endl;
}
int main()
{
	func(1,2);
	//调用存在歧义
	func(10);
	return 0;
}

重载和缺省参数碰撞是可以构成重载的(参数个数不同),但是会出现调用歧义(当调用func(1,2)是不会出现问题的,但是调用func(10),编译器就不知道调用哪个因为两个都符合调用)

🌏1.2.C++支持函数重载的原理 – 名字修饰

为什么C++支持函数重载,而C语言不支持函数重载呢

在C/C++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接,最终形成一个可执行程序

1. 对于C语言示例:

对于C语言来说,当经过预处理、编译、汇编、链接

//#include<iostream>
//using namespace std;
void func(int i, double d)
{
	//cout << "void func(int i, double d)" << endl;
}
void func(double d, int i)
{
	//cout << "double func(double d, int i)" << endl;
}
int main()
{
	func(1, 5.2);
    func(5.2, 1);
	return 0;
}
效果演示:

请添加图片描述

2. 对于C++示例:
#include<iostream>
using namespace std;
void func(int i, double d)
{
	//cout << "void func(int i, double d)" << endl;
}
void func(double d, int i)
{
	//cout << "double func(double d, int i)" << endl;
}
int main()
{
	func(1, 5.2);
    func(5.2, 1);
	return 0;
}
效果演示:

在这里插入图片描述

名字修饰:

先提前说明一下,这部分不懂得可以看C语言—程序环境和预处理(底层原理万字详解)

请添加图片描述

实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?

  • 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  • 那么链接时,面对Add函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则
  • 使用g++修饰后的名字通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】
1. 采用C语言编译器编译后结果:

结论:在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变

2. 采用C++编译器编译后结果:

请添加图片描述

结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中

函数名修饰规则带入返回值,返回值不能构成重载
#include<iostream>
using namespace std;
int func(double d, int i)
{
	cout << "void func(int i, double d)" << endl;
	return 0;
}
void func(double d, int i)
{
	cout << "double func(double d, int i)" << endl;
}
int main()
{
	func(1.1, 1);
	func(1, 1.1);
	return 0;
}

请添加图片描述

3. 总结:
  • 通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。

🌟二、引用

🌏2.1.引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:孙悟空,唐僧称为"悟空",江湖上人称"齐天大圣"。
类型& 引用变量名(对象名) = 引用实体;

示例:
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}
效果演示:

请添加图片描述

注意:引用类型必须和引用实体是同种类型的

🌏2.2.引用特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
1. 引用在定义时必须初始化
int a = 10;
// int& ra; // 该条语句编译时会出错

2. 一个变量可以有多个引用
int& ra = a;//给a取别名
int& rra = a;//给a取别名
int& raa = ra;//给b(a的别名)取别名也是可以的


3. 引用一旦引用一个实体,再不能引用其他实体(C++的引用不可以改变指向但是Java可以)
int x = 1;
b = x; 
//这里是赋值而不是把b变成x的别名
}

在这里插入图片描述

🌏2.3.常引用

void TestConstRef()
{
权限的放大:就相当于带上金箍圈的孙悟空(const)摘下了金箍圈变得肆无忌惮
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量 --- 权限的放大在这里去掉了const也就是去掉了金箍圈
const int& ra = a;--- 权限的平移:带上金箍圈无论是孙悟空还是齐天大圣它都有限制不会肆无忌惮


权限的缩小:本来是大闹天宫的齐天大圣被戴上了金箍圈(const)就有了限制
int x=10;
const int& y=x;


double d = 12.34;
//int& rd = d; // 该语句编译时会出错,类型不同
const int& rd = d;
在C/C++中有规定:发生类型转换,会产生一个临时变量,例如上面这一小段代码const int& rd = d,转换时会有一个int类型的临时变量,临时变量再给rd,但是临时变量具有常性int& rd = d这里就是权限的放大不能通过编译,所以这种是对的const int& rd = d

// int& b = 10; // 该语句编译时会出错,b为常量 - 不能变成常量对象的别名
const int& b = 10;--- 权限平移
}
注意:

在引用的过程中:

  1. 权限可以平移
  2. 权限可以缩小
  3. 权限不可以放大
示例:
#include<iostream>
using namespace std;
int func()
{
	int a = 0;
	return a;
}
int main()
{
	const int& ret = func();
	return 0;
}

请添加图片描述

🌏2.4.使用场景

1. 做参数/交换两个数值:
#include<iostream>
using namespace std;
void Swap(int& left, int& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}
int main()
{
	int i = 3, j = 6;
	Swap(i, j);
	cout << i << endl;
	cout << j << endl;
	return 0;
}
效果演示:

请添加图片描述

2. 做返回值:
1. 传值返回:不是把n返回给ret,n在Count函数栈帧里面,函数调用结束栈帧也就销毁了

实际原理:是会生成一个临时变量(可能寄存器充当也可能其他方式),n会在返回值之前拷贝给临时变量,临时变量不会在Count函数的栈帧,一般是在寄存器或者上一层函数的栈帧

#include<iostream>
using namespace std;
int Count()
{
	int n = 0;
	n++;
	// ...
	return n;
}
int main()
{
	int ret = Count();
	return 0;
}
2. 传引用返回第一种:返回的是n的别名/n的引用

会出现类似野指针的危险:n都销毁了,在访问n的别名
问:n都销毁了还能访问它的别名吗?
答:可以,因为空间销毁并不是这块空间就没了而是被系统回收,就像酒店里的房间,退房后房间不会消失而是被回收你的入住权租给别人或者空着,而野指针就是退房后你还偷偷藏了房间的钥匙,然后偷偷跑进房间。但是这里不是野指针,返回n的别名是不合法的

#include<iostream>
using namespace std;
int& Count()
{
	int n = 0;
	n++;
	// ...
	return n;
}
int main()
{
	int ret = Count();
	cout << ret << endl;
	cout << ret << endl;
	return 0;
}

请添加图片描述

效果演示:

程序的结果有两种可能:1和随机值------>调用函数返回n的别名,当int ret=Count(),函数Count()栈帧已经销毁了,再去访问这块空间就会出现两种可能性第一种是1拷贝给ret,还有一种可能是随机值(取决于栈帧销毁后空间是否会被置成随机值取决于编译系统)请添加图片描述

3. 传引用返回第二种:

这种代表ret也是n的别名,第一次访问打印ret是1,第二次就变成了随机值为什么
知识点补充:cout是一个函数调用,(调用函数先传参)第一次先传参取到的还是1然后进行函数调用,Count函数的栈帧销毁,第一次函数调用占用的还是那块空间只不过可能比之前Count函数栈帧大或者小此时函数调用覆盖这块空间而ret还是这块空间的别名所以取到的就是一个随机值,但也不一定是随机值,当Count函数栈帧很大n在下面,就不会被覆盖

#include<iostream>
using namespace std;
int& Count()
{
	int n = 0;
	n++;
	// ...
	return n;
}
int main()
{
	int& ret = Count();
	cout << ret << endl;
	cout << ret << endl;
	return 0;
}
效果演示:

请添加图片描述

4. 例题及构图解析:
int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1, 2) is :"<< ret <<endl;
    return 0;
}

在这里插入图片描述

3. 注意:

注意:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

🌏2.5.传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低

1. 值和引用作为函数参数的性能比较:
#include<iostream>
using namespace std;
#include <time.h>
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue()
{
	A a;
	// 以值作为函数参数
	size_t begin1 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc1(a);
	size_t end1 = clock();
	// 以引用作为函数参数
	size_t begin2 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc2(a);
	size_t end2 = clock();
	// 分别计算两个函数运行结束后的时间
	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}
int main()
{
	TestRefAndValue();
	return 0;
}
效果演示:

请添加图片描述

2. 值和引用的作为返回值类型的性能比较:
#include<iostream>
using namespace std;
#include <time.h>
struct A { int a[10000]; };
A a;
 //值返回
A TestFunc1() { return a; }
 //引用返回
A& TestFunc2() { return a; }
void TestReturnByRefOrValue()
{
	 //以值作为函数的返回值类型
	size_t begin1 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc1();
	size_t end1 = clock();
	 //以引用作为函数的返回值类型
	size_t begin2 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc2();
	size_t end2 = clock();
	 //计算两个函数运算完成之后的时间
	cout << "TestFunc1 time:" << end1 - begin1 << endl;
	cout << "TestFunc2 time:" << end2 - begin2 << endl;
}
int main()
{
	TestReturnByRefOrValue();
	return 0;
}
效果演示:

请添加图片描述

通过上述代码的比较,发现传值和指针在作为传参以及返回值类型上效率相差很大

3. 总结:

传引用传参(任何时候都可以用)

  1. 提高效率
  2. 输出型参数(形参的修改,影响的实参)

传引用返回(出了函数作用域对象还在才可以用)

  1. 提高效率
  2. 修改返回对象(末尾彩蛋处有体现)

🌏2.6.引用和指针的区别

1. 在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间:
#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int& ra = a;
	cout << "&a = " << &a << endl;
	cout << "&ra = " << &ra << endl;
	return 0;
}

在这里插入图片描述

2. 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的:
#include<iostream>
using namespace std;
int main()
{
	int a = 0;
	int* p1 = &a;
	int& ref = a;
	++(*p1);
	++ref;
	return 0;
}

请添加图片描述

引用和指针的不同点:

引用和指针的不同点:

  • 引用概念上定义一个变量的别名,指针存储一个变量地址。
  • 引用在定义时必须初始化,指针没有要求
  • 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  • 没有NULL引用,但有NULL指针
  • 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  • 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  • 有多级指针,但是没有多级引用
  • 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  • 引用比指针使用起来相对更安全

🌟三、末尾彩蛋(带你回溯时空联想之前)

1. C设计顺序表部分接口
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
struct SeqList
{
	int a[10];
	int size;
};
//读取第i个位置的接口
int SLAT(struct SeqList* ps, int i)
{
	assert (i <ps->size) ;
	return ps->a [i];
}
//修改第i个位置的接口
void SLModify(struct SeqList* ps, int i, int x)
{
	assert(i < ps->size);
	ps->a[i] = x;
}
int main()
{
	return 0;
}
2. C++设计顺序表部分接口
#include<iostream>
#include<assert.h>
#include<stdlib.h>
using namespace std;

struct SeqList
{
	int a[10];
	int size;
};
int& SLAT(struct SeqList& ps, int i)
{
	assert(i < ps.size);
	return (ps.a[i]);
}
int main()
{
	struct SeqList s;
	s.size = 3;
	SLAT(s, 0) = 10;
	SLAT(s, 1) = 20;
	SLAT(s, 2) = 30;
	cout << SLAT(s, 0) << endl;
	cout << SLAT(s, 1) << endl;
	cout << SLAT(s, 2) << endl;
	return 0;
}
效果演示:

请添加图片描述

  1. 读取i位置:减少了拷贝,返回此时位置的别名
  2. 修改i位置:数组中第i个位置的值出了作用域肯定还在,因为结构体在外面不在函数的栈帧里面所以存在,出了作用域不会销毁,得到它的别名后,通过赋值加加等就会修改
  3. 如果不用引用返回的就是它的临时拷贝打印是没有问题的修改却是不可以的因为临时对象具有常性不能修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/90250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[当前就业]2023年8月25日-计算机视觉就业现状分析

计算机视觉就业现状分析 前言&#xff1a;超越YOLO&#xff1a;计算机视觉市场蓬勃发展 如今&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;新版本的发布周期很快&#xff0c;每次迭代的性能都优于其前身。每 3 到 4 个月就会推出一个升级版 YOLO 变体&#xf…

腾讯云服务器价格表大全_轻量服务器_CVM云服务器报价明细

腾讯云服务器租用费用表&#xff1a;轻量应用服务器2核2G4M带宽112元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、云服务器CVM S5实例2核2G配置280.8元一年、GPU服务器GN10Xp实例145元7天&#xff0c;腾讯云服务器网长期更新腾讯云轻量…

【线程池】线程池拒绝策略还有这个大坑(二)

目录 踩坑代码 后果展示 原因 小结 概要 上文我们聊了聊阻塞队列&#xff0c;有需要的小伙伴可以去瞅瞅【线程池】换个姿势来看线程池中不一样的阻塞队列&#xff08;一&#xff09;_走了一些弯路的博客-CSDN博客 这波我们一起来研究下线程池的拒绝策略。 你肯定要说了&a…

【ArcGIS微课1000例】0071:普通最小二乘法 (OLS)回归分析案例

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、ArcGIS普通最小二乘法回归(OLS)一、空间自…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基…

node_modules.cache是什么东西

一开始没明白这是啥玩意&#xff0c;还以为是npm的属性&#xff0c;网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的&#xff0c;node_modules里下载了cache-loader插件&#xff0c;很多朋友都是vuecli工具生成的项目&#xff0c;内置了这部…

全流程R语言Meta分析核心技术

​Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面…

掌握Six Sigma:逐步解锁业务流程优化的秘密之匙

一、Six Sigma方法简介 1. Six Sigma的起源和概念 Six Sigma起源于1980年代的摩托罗拉公司。当时的摩托罗拉在面临激烈的全球竞争和持续的质量问题时&#xff0c;发明了这种系统的管理方法&#xff0c;并通过实施&#xff0c;获得了显著的成绩。 所谓的“Six Sigma”&#x…

AIGC人工智能涉及三十六职业,看看有没有你的职业(一)

文章目录 一只弹吉他的熊猫 神奇的企鹅 功夫熊猫 视觉光影下的女子 闪光灯效 局部柔光 生物光 LOGO设计 制作儿童绘本故事 换脸艺术 打造专属动漫头像 包装设计之美 建筑设计 如何转高清图 生成3D质感图标 生成微信表情包 探索美食摄影的奇妙之旅 蛋糕创意设…

​LeetCode解法汇总2236. 判断根结点是否等于子结点之和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个 …

用Python写一个武侠游戏

前言 在本教程中&#xff0c;我们将使用Python写一个武侠类的游戏&#xff0c;大的框架全部搭好了&#xff0c;很多元素都可以自己添加&#xff0c;让游戏更丰富 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 -…

类与对象(下)

类与对象&#xff08;下&#xff09; 一、初始化列表1、构造函数与初始化2、使用初始化列表的形式3、注意点4、代码5、类需初始化列表但没使用初始化列表时报的错误6、成员变量的初始化顺序&#xff08;1&#xff09;顺序&#xff08;2&#xff09;测试代码&#xff08;3&#…

k8s之nodes

概念&#xff1a; Node是Kubernetes中的工作节点&#xff0c;最开始被称为minion。一个Node可以是VM或物理机。每个Node&#xff08;节点&#xff09;具有运行pod的一些必要服务&#xff0c;并由Master组件进行管理&#xff0c;Node节点上的服务包括Docker、kubelet和kube-pro…

5G LAN标准及现状

欢迎关注微信公众号“我想我思”。 随着通信技术的发展&#xff0c;各行各业对网络的可靠性、确定性等提出了更高的需求。5G LAN作为3GPP R16标准定义的关键特性之一&#xff0c;具有组建灵活、直接互通等特性&#xff0c;在网络部署、网络确定性、uRLLC 等方面表现优异&#…

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的&#xff0c;是明文的&#xff0c;使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议&#xff0c;要比http协议安全。 2、HTTPS协议需要到CA申请证书&#xff0c;一般…

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…

MySQL每日一练--校园教务系统

一丶数据库名称&#xff1a;SchoolDB 二丶数据库表信息&#xff1a;角色信息表 表名&#xff1a; t_role 主键&#xff1a; r_id 序号 字段名称 字段说明 类别 位数 属性 备注 1 r_id 角色编号 int 主键 自动增长 2 r_name_EN 角色名&#xff08;英…

C++信息学奥赛1149:最长单词2

#include <iostream> #include <string> using namespace std; int main() {string str1;// 输入一行字符串getline(cin,str1);int n0;string MaxArr"";string MinArrstr1;string arr"";for(int i0;i<str1.length();i){if(str1[i] or str1…

4G模组EC20 网卡udhcpc获取IP但是没有设置IP

使能网卡&#xff1a; ifconfig usb0 up dhcp获取ip&#xff0c;虽然没有报error&#xff0c;但是很显然没有设置进配置 获取ip命令&#xff1a;udhcpc -i usb0 非正常现象&#xff1a; 正常现象&#xff1a; 解决方法&#xff1a; &#xff08;1&#xff09;rootfs 创建文件夹…