C++初阶--C++入门
目录
- 前言
- C++关键字
- 命名空间
- 命名空间的定义
- 命名空间的使用
- 加命名空间名称及作用域限定符
- 使用using namespace 命名空间名称引入
- 使用using将命名空间中的成员引入
- C++的输入与输出
- 缺省参数
- 全缺省
- 半缺省参数
- 函数重载
- 参数类型不同
- 参数个数不同
- 参数类型顺序不同
- 引用
- 引用特性
- 常引用
- 使用场景
- 引用做参数
- 引用做返回值
- 引用和指针的区别
- 内联函数
- 特性
- 宏的优缺点
- auto 关键字
- auto的使用细则
- auto不能使用的场景
- 不能作为函数参数
- 不能用来声明数组
- 基于范围的for循环
前言
从本章开始,我们就要正式的进入到C++的学习了。C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等,同时对C语言某些设计不合理的地方进行优化,如在作用域,IO,函数,指针以及宏方面。下面我们先从一些较容易理解的知识开始讲其起,为后续学习类和对象打下基础。
C++关键字
C++总计63个关键字,C语言32个关键字。下面我们仅仅只是见一见这些关键字,以后我们再对这些关键字一一进行学习。
命名空间
在C语言中,我们在对变量命名时难免会发生和库中某些关键字重名冲突的问题,而在C语言中这个问题是没办法解决的,只能更换变量名。但在C++中,我们可以使用命名空间对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
比如下面这段代码
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
int main()
{printf("%d\n", rand);
return 0;
}
// 编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对**{}即可,{}
中即为命名空间的成员**。其中命名空间中可以定义的成员有变量/函数/类型。
举几个例子
namespace SC
{int a = 10;int b = 2;int Add(int x, int y){return x + y;}struct Node{int val;struct Node* next;};
}
我们还可以进行命名空间的嵌套
namespace SC1
{int a;int b;int Add(int left, int right){return left + right;}namespace SC2{int c;int d;int Sub(int left, int right){return left - right;}}
}
我们需要了解的是:同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
命名空间的使用
我们在学习了命名空间这个概念以后该怎么使用它呢?下面我们来学习命名空间的使用,先来看这一段代码:
namespace SC1
{int rand = 1;
}
int main()
{printf("%d", rand);return 0;
}
打印结果
我们发现并不是我们想要的1而是一个地址。所以这样直接调用命名空间里的rand是不行的,我们可以采取以下三种方法来访问
加命名空间名称及作用域限定符
我们可以使用符号“ :: ”来访问命名空间中的成员变量,具体使用方法我们看这段代码
namespace SC1
{int rand = 1;
}
int main()
{printf("%d", SC1::rand);return 0;
}
打印结果
使用using namespace 命名空间名称引入
我们还可以使用using namespace 将命名空间展开,这样就能正常访问了,我们来看这段代码
namespace SC1
{int x = 1;
}
using namespace SC1;
int main()
{printf("%d", x);return 0;
}
打印结果
但是这种方法存在弊端,我们通过这种方法将命名空间展开,那么可能又会造成命名的污染,如下
namespace SC1
{int rand = 1;
}
using namespace SC1;
int main()
{printf("%d", rand);return 0;
}
这时候编译器就又无法识别rand的明确所指了。
使用using将命名空间中的成员引入
学习完上面这两种方法,第三种方法就比较好理解了,相当于把我们想要访问的数据从命名空间中拿出来使用。
namespace SC1
{int x = 1;
}
using SC1::x;
int main()
{printf("%d", x);return 0;
}
打印结果如下
C++的输入与输出
当初我们在学习C语言时,第一个学习的就是C语言的输入与输出,在终端打印“hello world”,那么现在我们同样来使用C++的方式打印“hello world”。代码如下
#include<iostream>
using namespace std;
int main()
{cout<<"Hello world!!!"<<endl;return 0;
}
说明:
- 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
- cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
- <<是流插入运算符,>>是流提取运算符。
- . 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
#include<iostream>
using namespace std;int main()
{int a = 1;float b = 2.89;double c= 6.890;char arr[10] = { 0 };char d[] = "hello world";cin >> arr;cout << arr << endl;cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;return 0;
}
这里的cin和C语言中的gets比较类似,在遇到空格,换行,tab会作为分隔符,所以这里的hello world并不会完全打印出来,只会打印hello。
打印结果如下:
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
在C语言中,如果我们调用一个函数,什么实参都不给肯定是不行的,但是在C++中,我们如果没有传递实参过去,那么函数会使用默认值。我们看下面这段代码:
void f(int a = 10)//C语言中并没有给形参赋值
{cout << a << endl;
}
int main()
{f(20);f();//C语言肯定是行不通的return 0;
}
打印结果如下
全缺省
全缺省参数,即函数的全部形参都设置为缺省参数。看下面这段代码
void f(int a = 0, int b = 1, int c = 2)
{cout << "a=" << a << endl;cout << "b=" << b << endl;cout << "c=" << c << endl;
}int main()
{f();return 0;
}
半缺省参数
void func(int a, int b, int c = 2)
{cout << a << endl;cout << b << endl;cout << c << endl;
}
这里我们需要注意的是:
半缺省参数必须从右往左依次给出,不能间隔着给。
函数重载
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题<>/font。
常见的函数重载分为三种类型:
参数类型不同
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()
{Add(10, 20);Add(10.1, 20.2);return 0;
}
打印结果如图
参数个数不同
void f()
{cout << "f()" << endl;
}
void f(int a)
{cout << "f(int a)" << endl;
}
int main()
{f();f(10);return 0;
}
打印结果如图
参数类型顺序不同
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;int main()
{int a = 1;int&b = a; //相当于给a起了一个别名为b,int是b的类型cout << a << endl;cout << b << endl;b = 3; //改变b也就相当于改变了acout << b << endl;cout << a << endl;
}
打印结果如图
引用特性
引用的特性有以下三个
1. 引用在定义时必须初始化
2. 一个变量可以有多个引用
3. 引用一旦引用一个实体,再不能引用其他实体
看个例子
void TestRef()
{int a = 10;// int& ra; // 该条语句编译时会出错int& ra = a;int& rra = a;printf("%p %p %p\n", &a, &ra, &rra);
}
常引用
我们在上面有提到过,引用的类型和引用的实体必须是同种类型的,但是仅仅只是相同还是不够的,我们还要关注是否可以修改的问题。
void TestConstRef()
{const int a = 10;//int& ra = a; // 该语句编译时会出错,a为常量const int& ra = a;// int& b = 10; // 该语句编译时会出错,b为常量const int& b = 10;double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不同const int& rd = d; }
比如说a,这里的a被const修饰之后变为了常量,但如果我们仅仅采取int &ra的方法就意味是对一个可修改的变量定义了一个别名,这显然是不对的,所以我们要将引用也用const修饰才可以。
我们再来看这段代码:
#include<iostream>
using namespace std;
int main()
{int a = 10;double&ra = a;
}
这个引用的结果首先告诉读者是错误的,要理解这个问题,我们就要先搞清楚隐士类型提升具体是怎么实现的。在int转变为double的时候存在隐士类型提升,在提升的过程中系统会创建一个常量区来存放a类型提升后的结果。这样就又回到上面刚刚说到的那种情况了,所以我们需要添加一个const修饰对权限进行修改才行,代码如下
#include<iostream>
using namespace std;
int main()
{int a = 10;const double&ra = a;
}
使用场景
引用做参数
当初在学习C语言的时候,我们可是被传值调用和传址调用的理解折磨了许久,但现在我们在传参的时候采取传引用就可以避免这个问题了(你想,引用的本质是变量的别名,我们修改引用的值同时也修改了原来的值,本质上还是指针,但不再需要解引用这类操作了!),我们就以交换数据这个函数为例:
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
}
是不是看起来就要容易理解的多了。
引用做返回值
我们先来看这段代码
#include<iostream>
using namespace std;
int& Add(int a, int b)
{int c = a + b;return c;
}int main()
{int& ans = Add(1,2);Add(3, 4);cout << ans << endl;
}
打印结果如下
为什么是7不是3呢?
我们要理解这句话:如果函数返回时,出了函数作用域,返回对象还未还给系统,则可以使用引用返回;如果已经还给系统了,则必须使用传值返回。
我们通过一张图来理解
说的直白通俗一点就是,每次调用函数都要开辟一块空间,而c是在这块函数空间中创建的一个临时变量,出了这个函数这块空间就被收回了,下次再调用这个函数,又会在相同的位置开辟空间,但下一次执行的相关操作就会把上一次的数据覆盖了,
要想解决这个问题,我们可以在c前加一个static关键字修饰,static的作用说直白一点就是保证这个数据出了作用域不会被销毁,后续也不会被覆盖。
引用和指针的区别
引用和指针的区别主要有以下几点
1、引用在定义时必须初始化,指针没有要求。
2、引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
3、没有NULL引用,但有NULL指针。
4、在sizeof中的含义不同:引用的结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)。
5、引用进行自增操作就相当于实体增加1,而指针进行自增操作是指针向后偏移一个类型的大小。
6、有多级指针,但是没有多级引用。
7、访问实体的方式不同,指针需要显示解引用,而引用是编译器自己处理。
8、引用比指针使用起来相对更安全
内联函数
内联函数其实本质上就是我们之前学习的宏,但是宏在书写的时候坑有非常多,稍不注意就会出现差错,因为它是整体替换的,这其中就可能存在运算符优先级的问题。但是我们使用内联函数就可以有效优化这个问题。
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
特性
1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长/递归的函数不适宜使用作为内联函数。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内代码比较长/递归等等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
宏的优缺点
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用.
3.没有类型安全的检查。
C++有哪些技术替代宏?
1. 常量定义换用const enum
2. 短小函数定义换用内联函数
auto 关键字
在早期的C/C++中auto的含义是:使用auto修饰的变量是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它。
在C++11中,标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。 可能光看这一句话,你不一定能懂,下面我们举几个例子
#include<iostream>
using namespace std;
int TestAuto()
{return 10;
}
int main()
{int a = 10;auto b = a;auto c = 'a';auto d = TestAuto();cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;cout << a << endl;cout << b<< endl;cout << c << endl;cout << d << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}
打印结果如下
注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类
型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
auto的使用细则
用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&.
#include <iostream>
using namespace std;
int main()
{int a = 10;auto b = &a; //自动推导出b的类型为int*auto* c = &a; //自动推导出c的类型为int*auto& d = a; //自动推导出d的类型为int//打印变量b,c,d的类型cout << typeid(b).name() << endl;//打印结果为int*cout << typeid(c).name() << endl;//打印结果为int*cout << typeid(d).name() << endl;//打印结果为intreturn 0;
}
auto不能使用的场景
不能作为函数参数
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{}
不能用来声明数组
void TestAuto()
{int a[] = {1,2,3};auto b[] = {4,5,6};
}
基于范围的for循环
对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
我们看这段代码
int main()
{int a[4] = { 1,2,3,4 };for (auto e : a){e *= 2;}for (auto e : a){cout << e << endl;}return 0;
}
我们发现的打印结果不是2,4,6,8
这是因为这里auto e相当于int i,只是创建了一个临时变量,想要打印出2,4,6,8有两种解决方法
//1
int main()
{int a[4] = { 1,2,3,4 };for (auto e : a){e *= 2;cout << e << endl;}return 0;
}
//2
int main()
{int a[4] = { 1,2,3,4 };for (auto& e : a){e *= 2;}for (auto e : a){cout << e << endl;}return 0;
}
要注意的是,在函数传参传数组过去时,函数内部for循环迭代就不能迭代这个传过来的数组了,因为这个数组在传参的时候就变成指针了,for循环的范围就不确定了。
本章内容到这里就结束了,如有出入,欢迎指正。
相关文章:

C++初阶--C++入门
目录 前言C关键字命名空间命名空间的定义命名空间的使用加命名空间名称及作用域限定符使用using namespace 命名空间名称引入使用using将命名空间中的成员引入 C的输入与输出缺省参数全缺省半缺省参数 函数重载参数类型不同参数个数不同参数类型顺序不同 引用引用特性 常引用使…...

Matlab实现PID控制仿真(附上30个完整仿真源码+数据)
本文介绍了如何使用Matlab实现PID控制器的仿真。首先,我们将简要介绍PID控制器的原理和控制算法。然后,我们将使用Matlab编写一个简单的PID控制器,并使用仿真环境来验证其性能。最后,我们将通过调整PID控制器的参数来优化控制系统…...

微信小程序:文件下载
目录 第一步 请求资源 第二步 获取资源后写入到微信本地 获取资源 写入资源(wx.getFileSystemManager)writeFile 的api 第三步 读取资源(openDocument与saveImageToPhotosAlbum) 第一步 请求资源 下面是请求接口中的脚本内容 export let baseUrl http://192.168.78.112…...

QString和QByteArray的区别
QString和QByteArray的区别 本质格式转换QString字符串格式化打印长度 本质 QString是对QByteArray的再次封装 QString可以通过char*来构造,也可以通过QByteArray来构造 QByteArray就是char* QString是编码后的char* QString也是封装了字符串, 但是内部的编码为utf…...

Vue3 Vite electron 开发桌面程序
Electron是一个跨平台的桌面应用程序开发框架,它允许开发人员使用Web技术(如HTML、CSS和JavaScript)构建桌面应用程序,这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…...

【Nodejs】Express模板使用
1.Express脚手架的安装 安装Express脚手架有两种方式: 使用express-generator安装 使用命令行进入项目目录,依次执行: cnpm i -g express-generator可通过express -h查看命令行的指令含义 express -hUsage: express [options] [dir] Optio…...

【iOS】App仿写--管理系统
文章目录 前言一、账号界面二、功能界面三、添加功能四、删除功能五、更改功能六、查找功能七、排序功能八、退出功能总结 前言 在日常生活中,如果用文字来记述与管理我们数据会十分麻烦,并且人工成本较高,这里笔者给出一种管理系统的模版&a…...

JS实现队列的数据结构
创建queue.ts /*** 队列*/ export default class Queue<T> {private items: object;private count: number;private header: number;constructor() {this.items {};this.count this.header 0;}/*** 入队列* param element* returns 当前队列的数量*/enqueue(element:…...

title: 用 LangChain 构建基于资料库的问答机器人(四):通过代理使用外部工具
上一篇教程我们介绍了 ReAct 系统,这是一个非常强大的行为模式,但它需要编写大量的示例来告诉 LLM 如何思考、行动,并且为了遵循这个模式,还需要编写代码来分析生成文字、调用函数、拼接 prompt 等,这些工作都是十分繁…...

使用 CSS 自定义属性
我们常见的网站日夜间模式的变化,其实用到了 css 自定义属性。 CSS 自定义属性(也称为 CSS 变量)是一种在 CSS 中预定义和使用的变量。它们提供了一种简洁和灵活的方式来通过多个 CSS 规则共享相同的值,使得样式更易于维护和修改。…...

Unity 性能优化一:性能标准、常用工具
性能标准 推荐耗时: 性能提现到玩家直观感受,就是帧率,为了达到要求的帧率,就要控制CPU的耗时,不同类型的游戏,对帧率要求不一样。下面是推荐耗时: 推荐内存: 避免游戏闪退的重点…...

【http长连接+池化】
参考: https://it.cha138.com/ios/show-49862.html http://blog.chinaunix.net/uid-16480950-id-103597.html https://www.cnblogs.com/kevin-yuan/p/13731552.html https://www.jianshu.com/p/17e9aacca438 一、http长连接和短连接 HTTP协议是无状态的协议&#…...

opencv-20 深入理解HSV 色彩空间(通过指定,标记颜色等来拓展ROI区域)
RGB 色彩空间是一种被广泛接受的色彩空间,但是该色彩空间过于抽象,我们不能够直接通过其值感知具体的色彩。 我们更习惯使用直观的方式来感知颜色,HSV 色彩空间提供了这样 的方式。 通过 HSV色彩空间,我们能够更加方便地通过色调、…...

python调用arcgis功能一例
python调用arcgis功能一例 执行方法: D:\data\python>python test_Select.pywindow11下环境变量设置 此电脑/属性/系统/高级系统设置/高级/环境变量/path path中添加全局目录:C:\Python27\ArcGIS10.4 test_Select.py脚本内容 # Name: Select_Examp…...

Spring MVC 是什么?
一、什么是 Spring MVC? 官方对于 Spring MVC 的描述是这样的: Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web …...

Rust操作MySQL
查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库: chrono 流式查询使用: query_iter 输出到Vec使用: query 映射到结构体使用: query_map 获取单条数据使用: query_first 命名…...

JAVA面试总结-Redis篇章(二)——缓存击穿
JAVA面试总结-Redis篇章(二) 缓存击穿解决方案一:互斥锁解决方案二:逻辑过期 缓存击穿 解决方案一:互斥锁 解决方案二&…...

Spring相关知识点
概述 分层的轻量级的全栈开源框架 展示层SprigMVC 持久层 Spring JDBCTemplate 业务层事务管理 注: 轻量级:API简单 全栈:各层都有相应解决方案 在Spring的体系结构中,由上而下,逐层依赖 Spring相当于是一个粘合剂&…...

Nginx专题--反向代理(未完成)
反向代理 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。 反向代理:其实客户端对代理是无感知的&…...

什么是搜索引擎?2023 年搜索引擎如何运作?
目录 什么是搜索引擎?搜索引擎的原理什么是搜索引擎爬取?什么是搜索引擎索引?什么是搜索引擎检索?什么是搜索引擎排序? 搜索引擎的目的是什么?搜索引擎如何赚钱?搜索引擎如何建立索引?网页抓取文本处理建…...

Spring系列一:spring的安装与使用
文章目录 💞 官方资料🍊Spring5下载🍊文档介绍 💞Spring5🍊内容介绍🍊重要概念 💞快速入门🍊Spring操作演示🍊类加载路径🍊Debug配置🍊Spring容器…...

Ubuntu--科研工具系列
翻译系列 pot-desktop github链接: https://github.com/pot-app/pot-desktop 下载deb Releases pot-app/pot-desktop GitHub 安装过程 在下载好的deb目录下打开终端(自动安装依赖) sudo apt install "XXX.deb" (后面可以直接托文件到终端&#…...

【压测指南|压力测试核心性能指标及行业标准】
文章目录 压力测试核心性能指标及行业标准指标1:响应时间指标2:吞吐量(TPS)指标3:失败率总结: 压力测试核心性能指标及行业标准 在做压力测试时,新手测试人员常常在看报告时倍感压力:这么多性能…...

spark-submit --files
一、原理 spark-submit --files通常用来加载外部资源文件,在driver和executor进程中进行访问 –files和–jars基本相同 二、使用步骤 2.1 添加文件 spark-submit --files file_paths 其中file_paths可为多种方式:file: | hdfs:// | http:// | ftp:// |…...

应该选云服务器还是物理服务器
应该选云服务器还是物理服务器 一、为什么需要云服务器或独立服务器取代共享主机 在最早之前,大多数的网站都是共享主机开始的,这里也包含了云虚拟机。这一类的站点还有其他站点都会共同托管在同一台服务器上。但是这种共享机只适用于小的网站ÿ…...

【iOS】动态链接器dyld
参考:认识 dyld :动态链接器 dyld简介 dyld(Dynamic Linker)是 macOS 和 iOS 系统中的动态链接器,它是负责在运行时加载和链接动态共享库(dylib)或可执行文件的组件。在 macOS 系统中…...

RocketMQ集成Springboot --Chapter1
RocketMQ集成Springboot 三种消息发送方式 生产者 引入依赖 <!--⽗⼯程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><…...

【Unity3D日常开发】Unity3D中比较string字符串的常用方法
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 字符串string的比较有很多方法,比如: …...

vue3+ts+element-plus 之使用node.js对接mysql进行表格数据展示
vue3tselement-plus axiosnode.jsmysql开发管理系统之表格展示 ✏️ 1. 新建一个node项目* 初始化node* 安装可能用到的依赖* 配置文件目录* 添加路由router1. 添加router.js文件,添加一个test目录2. 修改app.js ,引入router📒 3. 启动并在浏览器打开 * …...

华为eNSP:isis配置跨区域路由
一、拓扑图 二、路由器的配置 1、配置接口IP AR1: <Huawei>system-view [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei-GigabitEthernet0/0/0]q AR2: [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.2 24 [Huawe…...