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

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录

前言

1. 什么是C++

2. C++关键字

3. 命名空间

3.1 命名空间的定义

3.2 命名空间的使用

4. C++输入和输出

5. 缺省函数

5.1 概念

5.2 缺省参数分类

6. 函数重载

6.1 概念

6.2 为何C++支持函数重载

7. 引用

7.1 概念

7.2 特性

7.3 常引用

7.4 引用与指针的区别

7.5 传值、传引用效率比较

8. 内联函数

8.1 概念

8.2 特性

8.3 宏和内敛函数

9. C++98中的指针空值

总结


前言

这一篇文章开始了我与C++这门语言的相遇,我会持续更新有关C++的文章,既是我对学习C++之后的复习与总结,也是一种分享知识的方式。这篇的主要内容围绕的是C++入门语法讲解,许多语法都是本博士C++之父,对C语言的改进。


1. 什么是C++

     C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
      1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。C++几乎可以创建任何类型的程序:游戏、设备驱动程序、HPC、云、桌面、嵌入式和移动应用等。 甚至用于其他编程语言的库和编译器也使用C++编写。
        C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

 

2. C++关键字

C++总计有63个关键字,C语言有32个关键字。

bc4a5ca446014a99ac3c8773eca91808.png

 

3. 命名空间

在C和C++中,我们会大量使用变量、函数和类,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。如下面的例子:

#include <stdio.h>
#include <stdlib.h>int rand = 10;
// C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决int main()
{printf("%d\n", rand);return 0;
}

错误列表:

bbd6bfe878914b97a043a80b64947371.png

我们在全局作用域中定义了rand变量并初始化,但是stdlib库中有rand函数,库函数和全局变量产生了命名冲突,为了避免这种情况出现,就要使用C++提供的namespace关键字。

 

3.1 命名空间的定义

定义一个命名空间,要用到namespace关键字,后面跟命名空间的名字,然后接一对花括号即可,{}中是命名空间的成员。

  • 命名空间是可以嵌套的,但是一般最多嵌套两三层。
  • 同一工程中不同的文件允许存在相同的命名空间,编译器最后会合成同一个命名空间。
// 1. 正常的命名空间定义
namespace User
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}//2. 命名空间可以嵌套
// test.cpp
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{int Mul(int left, int right){return left * right;}
}

 

3.2 命名空间的使用

看看下面的例子,先定义一个命名空间,然后再main函数中打印出User中rand变量的值。

#include <stdio.h>
#include <stdlib.h>
namespace User
{   // 命名空间中可以定义变量/函数/类型int rand = 20;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{printf("%d\n", rand);return 0;
}

运行之后的结果:

9a0db09d20664f4da8359e4bb3128ef1.png

明明已经将rand变量放入User的命名空间,应该打印20在屏幕上,可是却打印了一个很大的数字,这是为什么呢?我们先来了解一个C++程序编译默认查找变量和函数的顺序。

  1. 当前局部作用域
  2. 当前全局作用域

为什么不去命名空间查找该变量或者函数呢,我们可以做一个类比:

  • 命名空间比作一块张三的私有田,是私人领域。
  • 局部作用域就是一块公有田。
  • 全局作用域就是一块野外的田地。

如果需要某种蔬菜,一般是到自己家的田地里寻找,然后再去外面的野地,除非张三同意在他的田里摘取蔬菜,不然不回去私人的田地寻找。所以跟上面的例子类似,搜索完局部作用域和全局作用域,除非有明确说明,不然不会在某个命名空间中搜索

因此,上面的代码要打印rand的整型值,但是没有特别声明,所以先找当前局部作用域寻找,再到全局变量中寻找。而在stdlib头文件,rand是一个输出随机值的函数,所以打印的是这个函数的地址,那我们应该怎么打印User命名空间里的rand变量呢?

命名空间的使用有三种方式:

  • 加命名空间名称及作用域限定符
int main()
{printf("%d\n", User::rand);return 0;    
}
  • 使用using将命名空间中某个成员引入
using User::rand;int main()
{printf("%d\n", rand);return 0;    
}
  • 使用using namespace 命名空间名称引入
using namespace User;int main()
{printf("%d\n", rand);return 0;    
}

 注意事项:

  1. 在大型工程项目中一般不支持命名空间展开,因为编译器默认查找顺序,是先搜索局部作用域,再全局作用域和指定的命名空间展开。如果两个命名空间同时展开并且里面有同名的函数和变量,就会产生歧义。
  2. 但是在日常练习中,会使用一些常用函数,那么就可以使用using namespace std,std是把C++所有的标准库合在一起的命名空间,方便使用。

 

4. C++输入和输出

C语言的输入输出函数是scanf和printf函数。那么C++的“helloworld”是怎么样的呢?

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;int main()
{cout<<"Hello world!!!"<<endl;return 0;
}

本博士对C语言进行修改,在C++中给出cin和cout函数,分别对应输入和输出函数。

  1. 其中cin表示console input,即标准输入对象(键盘),cout表示console output,即标准输出对象(控制台)
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<iostream >头文件中,所以使用时必须包含<iostream>头文件
  3. <<是流插入运算符,>>是流提取运算符
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。
#include <iostream>
using namespace std;
int main()
{int a = 10;double b = 3.14;char c = ‘a’;// 可以自动识别变量的类型cin>>a;cin>>b>>c;cout<<a<<endl;cout<<b<<"  "<<c<<endl;return 0;
}

 

5. 缺省函数

5.1 概念

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

void Fun(int a = 0)
{cout<< a << endl;
}
int main()
{Fun();     // 没有传参时,使用参数的默认值Fun(10);   // 传参时,使用指定的实参return 0;
}

5.2 缺省参数分类

  • 全缺省参数,全部都有缺省值。
void Func(int a = 10, int b = 20, int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
  • 半缺省参数,只有部分缺省。但是半缺省参数必须从右往左依次给,不能隔开。
void Func(int a, int b = 10, int c = 20)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}

还有注意,缺省参数不能再函数声明和定义中同时出现

// Fun.hvoid Func(int a = 10);// Fun.cppvoid Func(int a = 20)
{}// 注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该
用那个缺省值。

 

6. 函数重载

6.1 概念

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

#include<iostream>
using namespace std;
// 1、参数类型不同
void Swap(int left, int right)
{cout << "void Swap(int left, int right)" << endl;int tmp = left;left = right;right = tmp;
}void Swap(double left, double right)
{cout << "void Swap(double left, double right)" << endl;int tmp = left;left = right;right = tmp;
}// 2、参数个数不同
void fun()
{cout << "fun()" << endl;
}
void fun(int a)
{cout << "fun(int a)" << endl;
}// 3、参数类型顺序不同
void fun(int a, char b)
{cout << "fun(int a,char b)" << endl;
}
void fun(char b, int a)
{cout << "fun(char b, int a)" << endl;
}int main()
{Swap(10, 20);Swap(10.1, 20.2);fun();fun(10);fun(10, 'a');fun('a', 10);return 0;
}

 

6.2 为何C++支持函数重载

C++支持函数重载,但是C语言却不支持函数重载,这是什么原因呢?

这是正常一个程序运行的步骤,先进行编译,再进行链接,最后变成一个可执行程序。

1bc58e6505824affa96d6427bfde231f.png

⽽编译⼜可以分解成:预处理(有些书也叫预编译)、编译汇编三个过程。最后会形成一个.o文件,再到链接的步骤。如果对这方面有些困惑的小伙伴,可以看起之前写的关于编译和链接文章http://t.csdnimg.cn/Je6r0。

539b8aed57c342f391692f2a59a5d94e.png

我们有两个文件a.cpp和test.cpp,假设Add和func函数的实现放在a.cpp文件下,然后在test.cpp文件中调用Add和func函数。

  • 编译的工作完成之后,还没有链接之前,因为Add和func函数的地址在a.o中,而test.o的目标文件中没有Add和func函数地址,无法调用该函数。那该怎么办呢?
  • 链接阶段就是专门处理这中问题的,链接器链接器看到test.o调用Add和func,但是没有Add和func的地址,就会到a.o的符号表中找Add和func的地址,然后链接到一起
  • 那么链接时,面对Add和func函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则,这是编译过程的工作。
  • 在Linux下g++的修饰规则下,C语言的函数名经过修饰后没有发生变化,而C++的函数名修饰后变成修饰后变成【_Z+函数长度+函数名+类型首字母】。比如下面的Add和func函数,分别是“_Z3Addii”,“_Z4funcid”。
  •  通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。
// a.cpp文件下
int Add(int x, int y)
{return x + y;
}void func(int a, double c)
{}// test.cpp文件下
int Add(int x, int y);
void func(int a, double c;int main()
{Add(x, y);func(1, 2.2)    return 0;
}

 

 

7. 引用

7.1 概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间

// 写法:类型& 引用变量名(对象名) = 引用实体;
void TestRef()
{int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}

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

 

7.2 特性

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

 

7.3 常引用

  • 第一种错误,a变量的类型是一个不可改变的整型值。如果引用整型类型,定义一个ra,此时我们可以对ra进行修改,从而影响a。这是不被允许的,是权限放大的体现。
  • 第二种错误也是一个权限放大。我们对一个整型常量值10做一个引用,而引用b可以被修改,与常量的不可修改性质产生冲突。
  • 第三种错误,我们将一个双浮点精度的变量,却引用整型变量,取别名,这会产生隐式类型转换。首先双浮点精度的d变量的值会转换成整型变量的值,这个值存放在一个临时变量中,而临时变量也具有常性,即不可修改的性质。必须在整型变量前加上一个const,体现常性。
void TestConstRef()
{//1.const int a = 10;//int& ra = a;   // 该语句编译时会出错,a为常量const int& ra = a;// 2.// int& b = 10;  // 该语句编译时会出错,b为常量const int& b = 10;//3. double d = 12.34;//int& rd = d;  // 该语句编译时会出错,类型不同const int& rd = d;
}

 

7.4 引用与指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

#include <iostream>
using namespace std;int main()
{int a = 0;int& b = a;  //语法上不开空间int* p = &a; //语法上要开空间cout << sizeof(a) << endl;cout << sizeof(b) << endl;//a的别名,相当于求a的内存大小b++;//相当于a++p++;//地址加上一个整型变量空间大小的值return 0;
}

底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{int a = 10;int& ra = a;ra = 20;int* pa = &a;*pa = 20;return 0;
}

引用和指针的不同点:

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

 

7.5 传值、传引用效率比较

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

根据引用和指针的比较,我们知道引用底层其实是按照指针方式实现的。所以引用不管是传值,还是返回变量跟指针的传址调用类似,效率高。

#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;
}

 

8. 内联函数

8.1 概念

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。

cda2b5502f2d47ce948e80a52f939ee7.png

如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。

 

8.2 特性

  • inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
  •  inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++prime》第五版关于inline的建议:

内敛说明知识向编译器发出的一个小请求,编译器可以选择忽略这个请求。

  •  inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
// F.h
#include <iostream>
using namespace std;
inline void f(int i);// F.cpp
#include "F.h"
void f(int i)
{cout << i << endl;
}// main.cpp
#include "F.h"
int main()
{f(10);return 0;
}

 

8.3 宏和内敛函数

宏在C语言经常使用,有哪些优缺点呢?

优点:

  1. 增强代码的复用性。
  2. 提高性能。

缺点:

  1. 不方便调试宏。(因为预编译阶段进行了替换)
  2. 导致代码可读性差,可维护性差,容易误用。
  3. 没有类型安全的检查 。

在C++中,本博士在改进C语言中,就新增了内联函数的用法,就是为了替代宏。

 

9. C++98中的指针空值

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

void TestPtr()
{int* p1 = NULL;int* p2 = 0;// ……
}

NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

可以看到,NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{cout<<"f(int)"<<endl;
}void f(int*)
{cout<<"f(int*)"<<endl;
}int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

程序本来是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,造成错误。

在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。
 

  1.  在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
  2.  在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同
  3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr

 


总结

这篇文章干货满满,相信看到这里的小伙伴,多多少少都有一些小收获。不仅可以巩固语法知识,还可以深入了解其中的原理。话不多说,赶紧敲起来吧!

创作不易,希望这篇文章能给你带来启发和帮助,如果喜欢这篇文章,请留下你的三连,你的支持的我最大的动力!!!

ee192b61bd234c87be9d198fb540140e.png

 

相关文章:

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录 前言 1. 什么是C 2. C关键字 3. 命名空间 3.1 命名空间的定义 3.2 命名空间的使用 4. C输入和输出 5. 缺省函数 5.1 概念 5.2 缺省参数分类 6. 函数重载 6.1 概念 6.2 为何C支持函数重载 7. 引用 7.1 概念 7.2 特性 7.3 常引用 7.4 引用与指针的区别 7…...

9.vector的使用介绍和模拟实现

1.vector的介绍及使用 1.1 vector的介绍 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c…...

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 &#x1f680; “在人工智能的领域里&a…...

Docker使用— Docker部署安装Nginx

Nginx简介 Nginx 是一款高性能的 web 服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3/SMTP&#xff09;代理服务器&#xff0c;由俄罗斯开发者伊戈尔塞索耶夫&#xff08;Igor Sysoev&#xff09;编写&#xff0c;并在2004年10月4日发布了首个公开版本0.1.0。Nginx…...

C/C++基础----运算符

算数运算符 运算符 描述 例子 两个数字相加 两个变量a b得到两个变量之和 - 两个数字相减 - * 两个数字相乘 - / 两个数字相除 - % 两个数字相除后取余数 8 % 3 2 -- 一个数字递减 变量a&#xff1a;a-- 、--a 一个数字递增 变量a: a 、 a 其中递…...

YOLOv9:下一代目标检测的革新

目标检测作为计算机视觉领域的一个重要分支&#xff0c;一直是研究的热点。YOLO系列作为目标检测算法的佼佼者&#xff0c;自YOLO1发布以来&#xff0c;就在速度和精度上取得了很好的平衡&#xff0c;深受业界和学术界的喜爱。 YOLOv9作为该系列的最新版本&#xff0c;不仅在性…...

Leetcode算法训练日记 | day20

一、合并二叉树 1.题目 Leetcode&#xff1a;第 617 题 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新…...

conda创建虚拟环境太慢,Collecting package metadata (current_repodata.json): failed

(省流版&#xff1a;只看加粗红色&#xff0c;末尾也有哦) 平时不怎么用conda&#xff0c;在前公司用服务器的时候用的是公司的conda源&#xff0c;在自己电脑上直接用python创建虚拟环境完事儿&#xff0c;所以对conda的配置并不熟悉~~【狗头】。但是python虚拟环境的最大缺点…...

Tensorflow(GPU版本配置)一步到位!!!

Tensorflow&#xff08;GPU版本配置&#xff09;一步到位&#xff01;&#xff01;&#xff01; CUDA安装CUDA配置Tensorflow配置常见的包 CUDA安装 配置了N次的Tensorflow–Gpu版本&#xff0c;完成了踩坑&#xff0c;这里以配置Tensorflow_gpu 2.6.0为例子进行安装 以下为ten…...

STL之map

CSTL之map 1.介绍 map是映射的意思&#xff0c;即每个x对应一个y&#xff0c;我们这里说成key和value 举例子说明&#xff1a;运动->篮球 &#xff08;运动是key,篮球是value&#xff09;用电脑->写代码 &#xff08;用电脑是key&#xff0c;写代码是value&#xff09;…...

闲谈2024(一)

时光飞逝&#xff0c;一转眼24年的第一个季度已经过去了&#xff0c;回望这3个多月&#xff0c;感触颇多。首先&#xff0c;24年从一个一心只读圣贤书&#xff0c;全身心投入在技术上的研发工程师&#xff0c;转变为一个团队的小leader。从我个人对自己的定位来说&#xff0c;我…...

SQL注入利用 学习- 布尔盲注

布尔盲注适用场景&#xff1a; 1、WAF或者过滤函数完全过滤掉union关键字 2、页面中不再回显具体数据&#xff0c;但是在SQL语句执行成功或失败返回不同的内容 代码分析&#xff1a;过滤关键字 union if(preg_match(/union/i, $id)) { echo "fail"; exit; } 代码…...

前端项目部署教程——有域名有证书

一、拉取nginx镜像 docker pull nginx //先拉取nginx镜像二、打包前端项目 1、将Vue打包项目传输到/usr/local/vue/下blog和admin文件夹下 重点: 每一个子域名都要申请证书&#xff0c;在阿里云每年可以免费申请20个证书&#xff0c; 免费证书申请教程在 免费证书申请教程 …...

《看漫画学C++》第12章 可大可小的“容器”——向量

在C编程的世界里&#xff0c;数组是一种基础且广泛使用的数据结构。然而&#xff0c;传统的静态数组在大小固定、管理不便等方面的局限性&#xff0c;常常让开发者感到束手束脚。幸运的是&#xff0c;C标准库中的vector类为我们提供了一种更加灵活、高效的动态数组解决方案。 …...

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…...

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…...

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…...

6.11物联网RK3399项目开发实录-驱动开发之定时器的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u 定时器使用 前言 RK3399有 12 个 Timers (timer0-timer11)&#xff0c;有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 …...

算法训练营第二十三天(二叉树完结)

算法训练营第二十三天&#xff08;二叉树完结&#xff09; 669. 修剪二叉搜索树 力扣题目链接(opens new window) 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改…...

mysql主从复制Slave_SQL_Running: No

1、SHOW SLAVE STATUS \G; Slave_SQL_Running: No 解决方案&#xff1a; 重新同步主库和从库的数据 1、从库先停掉slave stop slave; 2、在主库查看此时的日志文件和位置 show master status; 3、在从库中执行 change master to master_host192.168.2.177,master_userslave…...

【SpringBoot】SpringBoot项目快速搭建

本文将介绍Springboot项目的快速搭建 快速创建SpringBoot项目 打开IDEA在File->New->Project中新建项目 点击左侧的Spring Initializr 输入以下信息&#xff1a; Name 项目名称Group 根据公司域名来&#xff0c;或者默认com.example【倒序域名】Package Name 包名&am…...

Terraform 状态不同步处理

背景 在使用 Terraform 创建 TencentCloud TKE 的时候&#xff0c;手贱把 node pool 删掉了。导致执行 destroy, plan 都会报错。 │ Error: [TencentCloudSDKError] CodeInternalError.UnexpectedInternal, Messagerelated node pool query err(get node pool failed: [E501…...

4.2.k8s的pod-标签管理、镜像拉取策略、容器重启策略、资源限制、优雅终止

一、标签管理 1.标签在k8s中极其重要&#xff0c;大多数资源的相互关联就需要使用标签&#xff1b;也就是说&#xff0c;资源的相互关联大多数时候&#xff0c;是使用标签进行关联的&#xff1b; 2.其他作用&#xff0c;在k8s集群中&#xff0c;node节点的一些操作比如污点及污…...

能源党建后台项目总结

1.引入 本次框架是Ruoyi-plusvue2element组合。 2.样式 由于是后台项目&#xff0c;样式要求统一&#xff0c;不可以有的输入框长有的短。着重几点&#xff1a; 1.关于form表单应该如何水平布局 在element中&#xff0c;form有个属性叫&#xff1a;:inline"true"…...

股票高胜率的交易法则是什么?

股票交易中的高胜率交易法则并非一成不变&#xff0c;而是根据市场状况、个人投资风格和经验等多种因素综合而定的。以下是一些有助于提升交易胜率的法则和策略&#xff1a; 1.趋势跟踪法则&#xff1a;在股票交易中&#xff0c;趋势跟踪是一种有效的策略。通过观察大盘和个股…...

C语言 | sizeof与strlen的区别(附笔试题)

目录&#xff1a; 1. sizeof和strlen的对比 2. 数组和指针 笔试题解析 3. 指针运算 笔试题解析 内容多多&#xff0c;需耐心看完&#xff0c;加油&#xff01;&#xff01;&#xff01; 一.sizeof和strlen的对比 1.1 sizeof 在学习操作符的时候&#xff0c;我们学习了 s…...

AI自动绘画器介绍和应用场景

AI自动绘画器是一种利用人工智能技术来生成绘画作品的工具。以下是一些常见的AI自动绘画器&#xff1a; DeepDream&#xff1a; 风格&#xff1a;可以生成三种风格的图片&#xff0c;包括深度梦幻风格、深度风格和浅层风格。应用场景&#xff1a;起初设计用于帮助研究人员理解…...

java二叉树前中后序遍历

代码随想录解题思路&#x1f192;力扣前序题目&#x1f192;力扣中序题目&#x1f192;力扣后序题目 递归遍历 // 前序遍历 class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res new ArrayList<>();preorder(root…...

【LeetCode刷题笔记】LeetCode 1365.有多少小于当前数字的数字

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…...

室内定位中文综述阅读

1 室内高精度定位技术总结与展望 [4]柳景斌,赵智博,胡宁松等.室内高精度定位技术总结与展望[J].武汉大学学报(信息科学 版),2022,47(07):997-1008.DOI:10.13203/j.whugis20220029. 1.1.1 WiFi‐RTT定位 2016 年 12 月&#xff0c;随着新版 IEEE802.11 标准的公布&#xff0c…...