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

C++入门1

C++入门1

  • 1.前言
  • 2.命名空间
    • 1.C语言对于命名空间方面的缺陷
    • 2.命名空间的语法特性
      • 1.域作用限定符
      • 2.命名空间的可嵌套性
    • 3.声明与定义分离的命名空间
    • 4.命名空间的展开
    • 5.多个命名空间中命名冲突
    • 6.对于命名空间的推荐写法
  • 3.iostream
    • 1.cout和endl
    • 2.cin
  • 3.缺省参数
    • 1.缺省参数的形式
    • 2.缺省参数举例
    • 3.缺省参数"坑点"
  • 4.函数重载
    • 1.函数重载的形式
    • 2.函数重载和缺省参数的联系
    • 3.函数重载的底层原理:函数名修饰规则
      • 为什么C语言不支持函数重载,而C++支持函数重载呢?

1.前言

C++是在C语言的基础之上,容纳进去了面向对象的编程思想和泛型编程,并增加了许多有用的库,以及一些关键字

本节主要介绍C++对于C语言语法不足的补充,以及C++是如何对C语言设计不合理的地方进行优化的,为后续学习类和对象打下基础

首先我们先看一下C++如何打印"hello world"
在这里插入图片描述
下面我们会介绍一下

#include <iostream>
using namespace std;

这两行代码的作用

2.命名空间

1.C语言对于命名空间方面的缺陷

首先因为C++是兼容C语言的,所以在C++程序里面是可以运行C语言代码的,如图是在C++文件中运行C语言代码
在这里插入图片描述
可是.如果我们定义了一个变量或者函数,跟库中的某一个变量或者函数重命名了(即发生了命名冲突问题)会发生什么状况呢?

下面我们来看一下
我们定义了一个变量rand(注意:在stdlib.h头文件中有一个函数叫做rand)

在还没有包括stdlib.h头文件时,程序是可以正常运行的
在这里插入图片描述
因为此时还没有发生命名冲突
那么当我们包括了这个头文件时呢?
在这里插入图片描述
报错:rand重定义,以前的定义是函数

所以,对于项目开发而言,我们要定义的变量和函数肯定会特别多
我们就算不跟库中的命名发生冲突,也难免会发生与我们一起开发某个项目的同事的命名冲突的问题

如果发生了命名冲突问题,那么修改名字会非常麻烦,会影响项目开发的进度,这是C语言的一个非常大的缺陷

所以C++引入了命名空间这一语法

2.命名空间的语法特性

1.域作用限定符

namespace 命名空间的名称
{可以放入int,double,char.......函数,结构体,类等等所有我们可以定义的类型
}

如图,现在我们把我们定义的rand这个整形变量放入了命名空间wzs中,那么此时就不会跟stdlib.h头文件中的rand函数发生命名冲突了
在这里插入图片描述
命名空间就像是一个围墙,把rand这个整型变量"封"起来
防止非法访问
默认情况下编译器并不会去命名空间中进行查找,只有指定时才会到该命名空间里面去找

那么如果我们想要访问命名空间wzs中的rand呢?
想要访问呢?wzs::rand来访问
这个::叫做域作用限定符
在这里插入图片描述
同理,wzs命名空间中也可以定义函数,结构体等等…
下面我们来看一下
这里请注意,当我们想要访问wzs命名空间下的结构体SListNode时
需要把命名空间的名称放到struct的后面

struct wzs::SListNode* plist=NULL;

在这里插入图片描述

2.命名空间的可嵌套性

如果我们想要定义的数据太多了,出现了一个命名空间中的命名冲突问题呢?
此时我们可以嵌套命名空间
在这里插入图片描述
还可以在wzs1或者wzs2中继续嵌套,就像是套娃一样…但是最好不要嵌套太深,否则麻烦的还是自己

那么对于那种在头文件中声明,在源文件中定义的情况呢?

3.声明与定义分离的命名空间

我们定义了一个栈,放到了wzs命名空间中
这里就先不去全部写完了,毕竟我们这节课介绍的不是栈的代码实现
而是命名空间

请注意,我们将这里的命名空间也命名为wzs会报错吗?
答案是:并不会,因为不同文件下的命名空间会被编译器合并到一起,所以并不会报错

Stack.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
//这里的命名空间也命名为wzs会报错吗?并不会
//不同文件下的同名命名空间会被编译器合并到一起,所以并不会报错
namespace wzs
{struct Stack{int* a;int top;int capacity;};void StackInit(struct Stack* ps);void StackPush(struct Stack* ps, int num);
}
Stack.cpp
#include "Stack.h"
namespace wzs
{void StackInit(struct Stack* ps){ps->a = NULL;ps->capacity = ps->top = 0;}void StackPush(struct Stack* ps, int num){if (ps->capacity == ps->top){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;int* tmp = (int*)realloc(ps->a,sizeof(int) * newcapacity);if (tmp == NULL){perror("realloc fail");exit(-1);}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top++] = num;}
}
TestStack.cpp
#include "Stack.h"
int main()
{struct wzs::Stack st;wzs::StackInit(&st);wzs::StackPush(&st, 1);wzs::StackPush(&st, 2);wzs::StackPush(&st, 3);wzs::StackPush(&st, 4);wzs::StackPush(&st, 5);return 0;
}

我们调试一下,程序运行正确
在这里插入图片描述

4.命名空间的展开

但是总是写命名空间真的好麻烦
所以能不能有一些情况下不用每次都指定命名空间呢?

using namespace wzs;//展开命名空间:默认指定在wzs这个命名空间下使用(把wzs这个墙拆掉)
//请注意:这跟展开头文件完全不同,尽管都叫做展开

那么什么情况下我们可以展开呢?
一般情况下不要展开,除非自己写好做测试,没有给别人用,不存在冲突

所以一开始写的using namespace std;(这里的std是C++官方库定义的命名空间)
的意思是
展开C++官方库定义的命名空间

但是在工程项目中不要展开std,容易发生命名冲突
但是在我们自己日常练习的时候为了方便可以展开

5.多个命名空间中命名冲突

如果我们展开的两个命名空间之间本来就有命名冲突呢?
在这里插入图片描述
此时会报错
在加上域作用限定符之后就不会报错了
在这里插入图片描述

6.对于命名空间的推荐写法

在工程项目中,我们推荐这样使用

比方说我们现在想要很方便的使用使用C++中的cout这个对象,就可以这样去做
(因为cout,cin,<<(流插入运算符),>>(流提取运算符)
涉及到类和对象的知识,我们目前无法展开详细介绍原理)
(endl(end line)相当于C语言中的换行符"\n")

//在工程当中推荐这种写法
using std::cout;
using std::endl;
using std::cin;

我们不建议直接展开std命名空间
但是每次指定cout和endl,cin的命名空间很不方便,而直接展开就会把std全部暴露出来出现冲突风险
所以我们推荐这种指定展开的写法

所以我们就可以在使用cout,cin,endl的时候不用去指定命名空间了
注意:使用cout,cin,endl必须包含头文件iostream
在这里插入图片描述

3.iostream

C++中的iostream头文件类似于C语言中的stdio.h头文件
也就是标准IO头文件

C语言中的printf被cout取代,scanf被cin取代,“\n"被endl取代
一般情况下cout,cin,endl比printf,scanf,”\n"更加方便
不过请注意,有一些情况下它们三个也并不方便,(比方说cout对于浮点数精度的控制方法就不如printf方便)
因为C++是兼容C语言的,所以在这个时候可以使用C语言中的printf,scanf,“\n”

1.cout和endl

cout这里的c的意思:console(控制台/终端)
在这里我们没有展开cout,endl
发现使用cout和endl必须加上std::,太麻烦了,所以在工程中展开我们推荐那种写法
在这里插入图片描述
在这里插入图片描述

2.cin

在这里插入图片描述

3.缺省参数

缺省参数的好处是:可以让函数传参更加灵活,这也是C++设计者设计缺省参数的一个原因

1.缺省参数的形式

诸如这样的函数,它的所有形参都被赋予了默认值,这种情况情况下叫做全缺省参数
void f(int a=1,int b=2,int c=3);诸如这样的函数,它的形参有一部分被赋予了默认值,这种情况下叫做半缺省参数
void f(int a,int b=2,int c=3);注意:缺省值必须从右向左给,不能这样给:
void f(int a=1,int b=2,int c);
因为如果我有这么一个函数调用
f(4,5);
就算是5对应的是c,但是4对应的到底是a还是b呢?
这样会产生歧义,因此C++语法规定缺省值必须从右向左给缺省参数不能跳着给:
void f(int a=1,int b,int c=3);
f(4,5);
不知道给b的是4还是5

2.缺省参数举例

//全缺省参数
void f(int a = 10, int b = 1, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
//半缺省参数
void g(int a, int b = 1, int c = 3)
{cout << a << " " << b << " " << c << endl;
}
int main()
{f();f(1);f(1, 2);f(1, 2, 3);//不过请注意:缺省参数不能跳着给,例如这样//f(, 2, );//err//g();//err:函数中调用的参数太少g(1);g(1, 2);g(1, 2, 3);return 0;
}

可见:缺省参数的好处是:可以让函数传参更加灵活,这也是C++设计者设计缺省参数的一个原因

3.缺省参数"坑点"

注意:缺省参数不能在声明和定义中同时存在

为什么?
因为要防止出现这种情况:
Stack.h:
在这里插入图片描述

Stack.cpp:
在这里插入图片描述
在这里插入图片描述
哪怕我不用这个缺省参数,自己传了一个实参,都会报错

也就是怕出现定义和声明中的缺省参数值不同的情况
那么这时缺省参数到底听.h的还是.cpp的呢?会产生歧义,因此C++语法不允许缺省参数在定义和声明中同时出现

那么如果我今天就是想要在一个声明和定义分离的一个程序中设计一个含缺省参数的函数
怎么办?

只能在声明中加上缺省参数,定义中不允许加上缺省参数

因为当调用该函数的源文件包含了头文件之后

1.如果缺省参数是设置在定义中,而不是声明中,那么我在这个调用该函数的源文件中是看不到实际的缺省参数的
2.如果缺省参数是设置在声明中的话,那么是可以看到实际的缺省参数的

下面给大家展示一下:
这是将缺省参数设置在定义中的情况
在这里插入图片描述
这是将缺省参数设置在声明中的情况
在这里插入图片描述

4.函数重载

C++是支持函数重载的,
所谓函数重载就是指:两个函数名称相同,但是参数的个数或者类型或者类型顺序不同,即构成函数重载
注意:如果两个函数只有返回值不同的话,并不会构成函数重载

1.函数重载的形式

这里以Add函数为例

int Add(int num1, int num2)
{return num1 + num2;
}double Add(double num1, double num2)
{return num1 + num2;
}int main()
{cout << Add(1, 2) << endl;cout << Add(1.1, 1.2) << endl;//cout << Add(1, 1.2) << endl;//errreturn 0;
}

大家注意到了这一行了吧

cout << Add(1, 1.2) << endl;//err

为什么会报错呢?
首先,在C语言的学习中,我们知道int和double类型是可以发生隐式类型转换的
也就是说在Add(1,1.2)这个函数调用中,有可能会发生两种情况:

(1)(int类型的1)被隐式转换为double类型,去匹配double Add(double num1, double num2)
(2)(double 类型的1.2)被隐式转换为int类型,去匹配int Add(int num1, int num2);

也就是说这个函数调用存在歧义,所以编译器会报错
也就是说哪怕我们去掉其中的一个Add函数,这个函数调用就不会报错了

下面是函数重载的几种错误形式
1.两个函数仅有返回值不同
在这里插入图片描述
2.参数仅有名称不同或者仅有参数名称顺序不同
在这里插入图片描述
在这里插入图片描述
注意:并不是说两个函数构成重载之后对它们的调用就不会产生歧义

2.函数重载和缺省参数的联系

下面请大家看一下下面两个函数能不能构成函数重载

void f(int num)
{cout << "f(int num)" << endl;
}
void f(int num = 1)
{cout << "f(int num = 1)" << endl;
}

在这里插入图片描述
答案是:不构成重载,因为参数的个数,类型,类型顺序均相同

那么在请大家看一下这两个函数会不会构成重载呢?

void f()
{cout << "f()" << endl;
}void f(int num = 1)
{cout << "f(int num = 1)" << endl;
}

在这里插入图片描述
答案是:构成重载
但是这意味着这两个函数在调用时就真的没有歧义了吗?
这种情况下是可以的
在这里插入图片描述
但是这种情况下就不行了:
在这里插入图片描述
因为在调用的时候产生了歧义
这就像是一个经典的问题:
你妈妈和你老婆掉水里,你只能救一个,你救谁?
C++懒得跟你折腾,直接在语法上不允许这样做,直接报错

3.函数重载的底层原理:函数名修饰规则

还有一个问题:函数的参数不同就能构成函数重载,那我返回值不同凭什么就无法构成函数重载呢?
这就要谈一下函数名修饰规则了
在谈这个之前,我们先建立一个Func.h,一个Func.cpp,一个Test.cpp文件
并且复习一下C语言阶段的编译链接的知识
在这里插入图片描述

现在我们有Func.h,Func.cpp,Test.cpp这三个文件
其中在Func.cpp文件中定义了两个重载的func函数
我们知道编译分为4个阶段:1.预处理:
头文件展开
宏替换
去注释
条件编译Fun.h在Func.cpp和Test.cpp中展开
Func.cpp中同时拥有func函数的声明和定义,Test.cpp中拥有func函数的声明和具体调用Fun.cpp ->  Fun.i
Test.cpp -> Test.i2.编译:.i文件进行语法检查(语法分析,词法分析,语义分析)生成汇编代码(.s文件)
Fun.i  ->  Fun.s
Test.i ->  Test.s3.汇编阶段:
把汇编代码转换为二进制机器码,生成目标文件(.o文件)
Fun.s -> Fun.o
Test.s -> Test.o4.链接阶段:
合并.o目标文件,链接一些没有确定的函数的地址,合并段表,符号表的重定位等等
生成可执行程序:
Windows: .exe,
Linux:   a.out
而这个函数名修饰规则就是在链接阶段进行的
在预处理阶段结束后
Func.cpp中同时拥有func函数的声明和定义,Test.cpp中拥有func函数的声明和具体调用
所谓声明就是一种承诺,是承诺,就要兑现
而链接阶段就是这个承诺兑现的时候
怎么兑现呢?让我的Test.cpp能够找到func函数的定义,就是兑现怎么找到呢?
(通过函数声明去找地址)
.o文件中有一个东西叫做符号表,符号表中存储了函数名跟函数地址的一种映射关系
在链接阶段,通过符号表跟一种映射关系找到函数的地址,就能进行函数的调用了而对于这个符号表来说
在C语言中,符号表中只会建立函数名跟函数地址的映射关系,
也就决定了在C语言中不允许存在同名函数,否则在链接阶段会找到多个函数地址,产生歧义而对于C++来说
有函数名修饰规则:把函数的参数代入进去对符号表中的映射进行修饰
在Linux下可以尝试看到这个名字
Linux下函数名修饰规则:
_Z4func(_Z是前缀+函数名的字符个数+函数名+参数首字母)_Z4funcdi(第一个参数类型:double,第二个:int)
_Z4funcid(第一个参数类型:int,第二个:double)int* :Pi
有兴趣,可以自己在Linux下去试试

下面我们在Linux下给大家看一看
我们在Linux下建立了两个文件:
test.c
test.cpp
先看.c:
在这里插入图片描述
cpp:
在这里插入图片描述
然后我们用gcc把test.c编译出来,编译成testc
在这里插入图片描述
然后用这个命令查看testc的内容
在这里插入图片描述
这个 < func>前面的就是它的地址,也就是第一个指令的地址,
而且我们发现这个函数名根本就没有被修饰
在这里插入图片描述
下面我们来看一下.cpp文件
先用g++把test.cpp编译成了testcpp
在这里插入图片描述
还是用这个命令进行查看
在这里插入图片描述
然后我们发现C++编译后的函数名的确被修饰了
修饰成了

_Z4funcid

在这里插入图片描述
大家也可以试一下其他的类型,指针的话:
例如int* 类型的是:会被修饰为Pi

下面我们就可以回答这个问题了:

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

因为在链接阶段

C语言文件的函数地址是完全只通过函数名去进行查找的,如果存在同名函数,会导致找到多个函数地址,让函数调用产生歧义

而C++文件的函数名经过了修饰,那么如果两个函数名相同,但是参数不同就可以进行区分了
所以对于构成重载的函数,只会找到那唯一一个,不会产生歧义

Linux下函数名修饰规则:
_Z4func(_Z是前缀+函数名的字符个数+函数名+参数首字母)

注意:不同编译器下的函数名修饰规则是不同的

那么为什么我刚才不在windows下演示呢?
因为windows下的函数名修饰太过复杂
我们把Func.cpp中的代码注释掉,让它发生链接错误
在这里插入图片描述
看到蓝色标注的地方,windows下也是一个类型对应一个符号,不过不像Linux下那么直观

以上就是C++入门1的全部内容,希望能对大家有所帮助

相关文章:

C++入门1

C入门1 1.前言2.命名空间1.C语言对于命名空间方面的缺陷2.命名空间的语法特性1.域作用限定符2.命名空间的可嵌套性 3.声明与定义分离的命名空间4.命名空间的展开5.多个命名空间中命名冲突6.对于命名空间的推荐写法 3.iostream1.cout和endl2.cin 3.缺省参数1.缺省参数的形式2.缺…...

Matlab论文插图绘制模板第118期—进阶气泡图

之前的文章中&#xff0c;分享过Matlab气泡图的绘制模板&#xff1a; 图虽说好看&#xff0c;但有一个缺点&#xff1a;需要手动调节两个图例的位置。 为了解决这一问题&#xff0c;我们不妨结合前段时间分享的紧凑排列多子图的绘制模板&#xff1a; 从而达到自动对齐排列的效…...

grafana接入OpenTSDB设置大盘语法

目录 1、filter过滤语法1.1 精准匹配1.2 正则匹配1.3 通配符匹配 完整示例1、 展示应用app的CPU利用率监控2&#xff09;展示应用app的在线核数 1、filter过滤语法 1.1 精准匹配 literal_or &#xff1a; tagv的过滤规则: 精确匹配多项迭代值&#xff0c;多项迭代值以’|分隔&a…...

HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制&#xff0c; 在远端 Stub 对象消亡时&#xff0c;可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成&#xff0c;当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户&#xff0c;需要实现消…...

实战一:Http轮询弹幕拦截

系列文章目录 训练地址:https://www.qiulianmao.com websocket逆向http拦截websocket拦截视频号直播弹幕采集实战一:Http轮询更新中实战一:Http轮询 系列文章目录前言一、判断消息传输技术二、用户进入直播间三、 用户发言四、 用户送礼五、点赞事件六、用户唯一id的获取七…...

虚拟机独立 IP 配置

虚拟机独立 IP 配置 1. 点击虚拟网络编辑器 2. 点击更改设置 3. 查看本地电脑网卡型号并设置虚拟网络编辑器桥接网卡为同型号网卡 4. 设置有限网络信息 5. 点击网络编辑按钮并点击身份 6. 编辑名称并选择MAC地址 7. 配置 IPv4 地址后点击应用即可...

升级教育技术软件的多合一解决方案

当今时代技术和教育联系越来越紧密&#xff0c;教育机构对强大、安全、灵活的 IT 解决方案的探索至关重要。 全球事件、技术进步以及学生和教职员工不断变化的需求影响着不断变化的教育格局&#xff0c;我们要采取变革性的方法来确保教育的连续性和质量提升。 Splashtop Ente…...

c++视觉检测-----角点检测

角点检测&#xff1a;cornerHarris() cornerHarris()函数是OpenCV中用于执行Harris角点检测的函数。Harris角点检测是一种用于检测图像中角点的技术&#xff0c;通常用于特征检测和图像匹配。以下是cornerHarris()函数的用法&#xff1a; void cornerHarris(InputArray src, …...

虚拟机安装Docker

安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。…...

虚幻引擎5:增强输入的使用方法

一、基本配置 1.创建一个输入映射上下文&#xff08;映射表&#xff09; 2.创建自己需要的操作映射或者轴映射 3.创建完成之后进入这个映射&#xff0c;来设置类型&#xff0c;共有4个类型 1.Digital:是旧版操作映射类型&#xff0c;一般是按下抬起来使用&#xff0c;像跳跃…...

buffer overflow detected

背景 在应用上云改造中&#xff0c;业务场景如下&#xff1a; 在使用ecs的场景中&#xff0c;应用的ip都是固定的&#xff1b;在使用k8s之后pod的ip就变的不固定了&#xff0c;k8s提供了statefulset的模式来支持这种场景&#xff0c;以固定域名的方式支持。 问题 在平台pod开…...

【c++源码】老飞飞源码完整v15源码(包含数据库前端后端源文件)

老飞飞源码完整v15源码&#xff08;包含数据库前端后端源文件&#xff09;程序来源于国外网站。程序仅供参考学习游戏开发流程。以及框架内容。 测试环境搭建 Visual Studio 2013 SQL Server 2008r Windows 10 和 11 专业版 这些文件已经过测试&#xff0c;搭建&#xff0c;运行…...

MySQL创建数据库、创建表操作和用户权限

1、创建数据库school&#xff0c;字符集为utf8 2、在school数据库中创建Student和Score表 3、授权用户tom&#xff0c;密码Mysql123&#xff0c;能够从任何地方登录并管理数据库school 4、使用mysql客户端登录服务器&#xff0c;重置root密码...

时间序列分析基础篇

**时间序列分析&#xff08;time series analysis&#xff09;是量化投资中的一门基本技术。时间序列是指在一定时间内按时间顺序测量的某个变量的取值序列。**比如变量是股票价格&#xff0c;那么它随时间的变化就是一个时间序列&#xff1b;同样的&#xff0c;如果变量是股票…...

Idea JavaWeb项目,继承自HttpFilter的过滤器,启动Tomcat时部署工件出错

JDK版本&#xff1a;1.8 Tomcat版本&#xff1a;8.5 10-Oct-2023 13:55:17.586 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate conta…...

02Maven核心程序的下载与settings.xml文件的配置,环境变量的配置

Maven核心程序的解压与配置 Maven的下载与解压 Maven官网下载安装包 将下载的Maven核心程序压缩包apache-maven-3.8.4-bin.zip解压到一个非中文且没有空格的目录 Maven的核心配置文件 在Maven的解压目录conf中我们需要配置Maven的核心配置文件settings.xml 配置本地仓库位置…...

栈实现深度优先搜索

引言 之前刚学DFS的时候并不完全理解为什么递归可以一直往下做&#xff0c;后来直到了递归的本质是栈&#xff0c;就想着能不能手写栈来代替递归呢。当时刚学&#xff0c;自己觉得水平不够就搁置了这个想法&#xff0c;今天上数据结构老师正好讲了栈的应用&#xff0c;其中就有…...

Java 基于SpringBoot的某家乡美食系统

1 简介 《Java 基于SpringBoot的某家乡美食系统》该项目含有源码、文档等资料、配套开发软件、软件安装教程等。系统功能完整&#xff0c;适合作为毕业设计、课程设计、数据库大作业学习使用。 功能介绍 这个项目是基于 SpringBoot和 Vue 开发的地方美食系统&#xff0c;包括…...

splice 和 slice 会改变原数组吗? 怎么删除数组最后一个元素?

1、splice 和 slice 会改变原数组吗? splice() 会改变原数组&#xff0c;返回的是改变的内容&#xff1b; splice() 方法可能是数组中的最强大的方法之一了&#xff0c;使用它的形式有很多种&#xff0c;它会向/从数组中添加/删除项目&#xff0c;然后返回被删除的项目。 该方…...

解锁互联网安全的新钥匙:JWT(JSON Web Token)

目录 前言 一、JWT简介 1. 什么是JWT&#xff1f; ​编辑 2. JWT的工作原理 3.JWT如何工作的 4. JWT的优势 5. 在实际应用中使用JWT 6.传统Session和JWT认证的区别 6.1.session认证方式 6.2.JWT认证方式 7.基于Token的身份认证 与 基于服务器的身份认证 二、JWT的…...

alsa音频pcm设备之i2c调试

i2cdetect 列举 I2C bus i2cdetect -l ls /dev/i2c* 列出I2C bus i2c-7 上面连接的所有设备,并得到i2c设备地址 i2cdetect -y 7 发现i2c设备的位置显示为UU或表示设备地址的数值,UU表示设备在driver中被使用. I2cdump i2c设备大量register的值 i2cdump -y 7 0x40 I2cset设置…...

1. Windows平台下如何编译C++版本的Redis库hiredis

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并…...

Centos中利用自带的定时器Crontab_实现mysql数据库自动备份_linux中mysql自动备份脚本---Linux运维工作笔记056

这个经常需要,怕出问题因而需要经常备份数据库,可以利用centos自带的定时器,配合脚本实现自动备份. 1.首先查看一下,这个crontab服务有没有打开: 执行:ntsysv 可以看到已经开机自启动了. 注意这个操作界面,用鼠标不行,需要用,tab按键,直接tab到确定,或取消,然后按回车回到命…...

完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY

完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY 目录 所遇问题 有些时候我们用命令进行安装apk如下&#xff1a; adb install xxx.apk但是会安装不成功&#xff0c;报如下错误&#xff1a; 错误现象&#xff1a;提示&#xff1a;Failed to install app-d…...

[清华大学]漏洞挖掘之状态敏感的模糊测试StateFuzz

Dr.赵博栋 Prof.张超 清华大学 网络研究院 INSC 本文主要介绍了通过State Fuzz对Linux驱动程序进行模糊测试&#xff0c;该Fuzz方法由赵博栋博士在InForSec会议上分享&#xff0c;并在USENIX Security上发布.StateFuzz :System Call-Based State-Aware Linux Driver Fuzzing.该…...

嵌入式养成计划-40----C++菱形继承--虚继承--多态--模板--异常

九十四、菱形继承 94.1 概念 菱形继承又称为钻石继承&#xff0c;是由公共基类派生出多个中间子类&#xff0c;又由中间子类共同派生出汇聚子类&#xff0c;汇聚子类会得到多份中间子类从公共基类继承下来的数据成员&#xff0c;会造成空间浪费&#xff0c;没有必要。 所以存…...

C++入门指南:类和对象总结友元类笔记(下)

C入门指南:类和对象总结友元类笔记&#xff08;下&#xff09; 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深…...

ctfshow web入门 php特性 web136-web140

1.web136 还有一种写文件的命令时tee命令 payload&#xff1a; : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…...

sshpass传输文件提示Host key verification failed.

1. sshpass功能简述 sshpass指令可用于A服务器向B服务器传输文件或执行某些指令。 2. 传输文件指令 基本传输命令&#xff1a;sshpass -p 远程服务器登录密码 scp 本地路径文件 远程服务器登录用户名远程服务器IP地址:远程服务器文件保存路径 示例&#xff1a; sshpass -p 1…...

Maven系列第5篇:私服详解

maven系列目标&#xff1a;从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第5篇。 整个maven系列的内容前后是有依赖的&#xff0c;如果之前没有接触过maven&#xff0c;建议从第一篇看起&#xff0c;本文尾部有maven完整系列的连接。 环境 maven3.6.1 …...