【C++基础篇】——逐步了解C++

【C++基础篇】——逐步了解C++

文章目录

  • 【C++基础篇】——逐步了解C++
    • 前言
    • 一、C++的第一个程序
    • 二、命名空间
      • 1.namespace的价值
      • 2.namespace的定义
      • 3.命名空间的使用
    • 三、C++的输入&输出
    • 四、缺省参数
    • 五、函数重载
    • 六、引用
      • 1.引用的概念和定义:
      • 2.引用的特性
      • 3.引用的使用
      • 4.const引用
      • 5. 引用和指针的关系🪶

前言

本篇笔者将从C++的第一个程序开始讲解C++的知识点,请看笔者细细道来~

一、C++的第一个程序

我们了解到C++的雏形是在C的基础上设计而来,即C++兼容C语言的绝大数语法。所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译。

//test.cpp
#include<stdio.h>
int main()
{printf("hello world\n");return 0;
}//这是我们学的第一个C语言程序

那用C++版本的hello world是什么样的呢?我们往下看。

//test.cpp
#include<iostream>
using namespace std;int main()
{cout<<"hello world\n"<<endl;return 0;
}

在这里插入图片描述

我们可以看到除了头文件有变化外,下方还多了一行我们看不懂的代码,它的输出语句也和C语言不一样。下来我们先来了解多出的那行代码。

二、命名空间

  • 我们先来看一个代码
#include <stdio.h>
int rand = 10;
int main()
{printf("%d\n", rand);return 0;
}

在这里插入图片描述

  • 这个代码没问题吧,我们也可以正常打印出来。接着往下看。
#include <stdio.h>
#include <stdlib.h>int rand = 10;
int main()
{printf("%d\n", rand);return 0;
}

在这里插入图片描述

  • 这里我们加了一个头文件,然后它就显示报错,可以看到rand显示重定义了。原因就是#include<stdlib.h>在预处理阶段会展开,它里面也有一个命名为rand的函数,所以就会命名冲突。

1.namespace的价值

在C/C++中,变量、函数以及后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。

在避免命名冲突或名字污染的方式上,C语言的解决方式非常麻烦,Bjarne Stroustrup(C++之父)深受这个问题的困扰,就引入了命名空间

使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

2.namespace的定义

1.定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。

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

2.namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不再冲突了。

在这里插入图片描述

上面的rand的在默认情况下是去访问全局的,即头文件里的rand函数,是个函数指针,所以会报错。我们把%d改成%p去打印这个函数指针变量所存储的地址。

在这里插入图片描述

要是我们想要访问命名空间里的rand,我们就要指定一下,像这样:

int main()
{printf("%p\n",rand);//访问全局域//::是域作用限定符printf("%d\n",luo::rand);//访问luo这个命名空间域里的rand
}

在这里插入图片描述

访问命名空间里的函数和结构体也是指定域即可

int main()
{printf("%p\n",rand);//访问全局域//::是域作用限定符printf("%d\n",luo::rand);//访问luo这个命名空间域里的randluo::Add(1,2);struct luo::Node node;//要注意的是:结构体的域是要放在结构体的名称前面!
}

3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。

#include <stdio.h>
#include <stdlib.h>int x = 0;//全局域
namespace luo
{int x = 1;//命名空间域
}
void func()
{int x = 2;//局部域只能在自己的局部访问
}
int main()
{int x = 3;//局部域printf("%d\n", x);//main这个局部域printf("%d\n", luo::x);//访问命名空间域printf("%d\n",::x);//访问全局域return 0;
}

在这里插入图片描述

  1. namespace只能定义在全局,当然他还可以嵌套定义。
//命名空间可以嵌套
#include<stdio.h>namespace luo
{namespace AA{int rand = 1;int Add(int left, int right){return left + right;}}namespace BB{int rand = 2;int Add(int left, int right){return (left + right) * 10;}}
}
int main()
{printf("%d\n", luo::AA::rand);printf("%d\n", luo::BB::rand);printf("%d\n", luo::AA::Add(1, 2));printf("%d\n", luo::BB::Add(1, 2));return 0;
}

在这里插入图片描述

5.项⽬工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。

//Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
namespace luo
{typedef int STDataType;typedef struct Stack{STDataType* a;int top;int capacity;}ST;void STInit(ST* ps,int n);void STDestroy(ST* ps);void STPush(ST* ps, STDataType x);void STPop(ST* ps);STDataType STTop(ST* ps);int STSize(ST* ps);bool STEmpty(ST* ps);
}//Stack.cpp
#include"Stack.h"
namespace luo
{void STInit(ST* ps, int n){assert(ps);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;}// 栈顶void STPush(ST* ps, STDataType x){assert(ps);// 满了, 扩容if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity* 2;printf("扩容:%d\n", newcapacity);STDataType* tmp = (STDataType*)realloc(ps->a,newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}ps->a = tmp;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;}
}// test.cpp
#include"Queue.h"
#include"Stack.h"
// 全局定义了⼀份单独的Stack
typedef struct Stack
{int a[10];int top;
}ST;
void STInit(ST* ps) {}
void STPush(ST* ps, int x) {}
int main()
{// 调⽤全局的ST st1;STInit(&st1);STPush(&st1, 1);STPush(&st1, 2);printf("%d\n", sizeof(st1));// 调⽤luo namespace的luo::ST st2;printf("%d\n", sizeof(st2));luo::STInit(&st2);luo::STPush(&st2, 1);luo::STPush(&st2, 2);return 0;
}

6.C++标准库都放在⼀个叫std(standard)的命名空间中。(为了防止标准库和我们定义的namespace冲突)

3.命名空间的使用

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。

在这里插入图片描述

所以我们要使用命名空间中定义的变量/函数,有三种方式:

1.指定命名空间访问,项⽬中推荐这种方式。

#include<stdio.h>
namespace luo
{int a = 0;int b = 1;
}
int main()
{printf("%d\n",luo:: a);//指定命名空间访问return 0;
}

2.using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

#include<stdio.h>
namespace luo
{int a = 0;int b = 1;
}
using luo::a;// using将命名空间中某个成员展开
int b = 3;int main()
{printf("%d\n",a);printf("%d\n",b);luo::b++;printf("%d\n", luo::b);return 0;
}

3.展开命名空间中全部成员,项⽬不推荐,冲突风险很大,日常小练习程序为了方便推荐使⽤。

#include<stdio.h>
namespace luo
{int a = 0;int b = 1;
}
using namespace luo;// 展开命名空间中全部成员int main()
{printf("%d\n",b);return 0;
}

三、C++的输入&输出

  • 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输入、输出对象。

  • std::cin 是 iostream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输入流

  • std::cout 是iostream 类的对象,它主要⾯向窄字符的标准输出流

  • std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换行字符加刷新缓冲区。

  • <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

  • 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会出),其实最重要的是C++的流能更好的⽀持⾃定义类型对象的输⼊输出。

  • IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识。(后续会出)

  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。

  • ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。

  • 这⾥我们没有包含<stdio.h>,也可以使⽤printf 和scanf,在包含 < iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
//using namespace std;
//using std::cout;
//using std::endl;int main()
{//  <<流插入std::cout << "hello world\n";int i = 10;std::cout << i<<'\n' << "\n";double d = 1.1;std::cout << d << std::endl;std::cin >> i >> d;std::cout << i << " " << d << std::endl;scanf("%d%lf", &i, &d);printf("%d %.2lf\n", i, d);return 0;
}

看到这里,大家应该可以理解C++的第一个程序的含义了。

四、缺省参数

C语言中没有缺省参数的概念,C++支持缺省参数。

1.缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)

#include <iostream>
#include <assert.h>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func(); // 没有传参时,使⽤参数的默认值Func(10); // 传参时,使⽤指定的实参return 0;
}

在这里插入图片描述

2.全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

#include <iostream>
using namespace std;
// 全缺省
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;
}
int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200, 300);return 0;
}

在这里插入图片描述

3.带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

Func1(,2,);//不支持
Func1(,2,3);//不支持

4.函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值

// Stack.h
#include <iostream>
#include <assert.h>
using namespace std;
typedef int STDataType;
typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;
void STInit(ST* ps, int n = 4);// Stack.cpp
#include"Stack.h"
// 缺省参数不能声明和定义同时给
void STInit(ST* ps, int n)
{assert(ps && n > 0);ps->a = (STDataType*)malloc(n * sizeof(STDataType));ps->top = 0;ps->capacity = n;
}// test.cpp
#include"Stack.h"
int main()
{ST s1;STInit(&s1);// 确定知道要插⼊1000个数据,初始化时⼀把开好,避免扩容ST s2;STInit(&s2, 1000);return 0;
}

五、函数重载

函数重载是C++中的一项特性,它允许在同一作用域内声明具有相同名称但参数列表不同的函数。

  • 函数名需相同。
  • 参数的个数、参数的顺序和参数的类型不同均可构成重载。
  • 在同一作用域。
  • 返回值类型不同不能构成重载,因为调用时也无法区分。
#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;
}//参数个数不同
void f()
{cout << "f()" << endl;
}void f(int a)
{cout << "f(int a)" << endl;
}//参数类型顺序不同(本质还是类型不同)
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()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, 'a');f('a', 10);return 0;
}

六、引用

1.引用的概念和定义:

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

类型& 引⽤别名 = 引⽤对象;

C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<< 和 >>,这⾥引⽤也和取地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以。

#include<iostream>
using namespace std;
int main()
{int a = 0;// 引⽤:b和c是a的别名int& b = a;int& c = a;// 也可以给别名b取别名,d相当于还是a的别名int& d = b;++d;// 这⾥取地址我们看到是⼀样的cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;return 0;
}

在这里插入图片描述

2.引用的特性

  • 引用在定义时必须初始化

  • 一个变量可以有多个引用

  • 引⽤一旦引⽤一个实体,再不能引⽤其他实体

3.引用的使用

1.引⽤在实践中主要是于引用传参引⽤做返回值减少拷贝提⾼效率和改变引用对象时同时改变被引用对象。

2.引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。

3.引⽤返回值的场景相对⽐较复杂。

4.引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向,Java的引⽤可以改变指向。

5.⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。

4.const引用

1.可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。

int main()
{const int a = 10;//int& ra = a;//引用对a的访问权限放大了,使得a可以修改;权限不能放大const int& ra = a;//正确写法int b = 7;const int& rb = b;//权限可以缩小//rb++;//rb自己的权限是只读不能写b++;const int x = 0;int y = x;//拷贝赋值const int a = 10;const int* p1 = &a;//int* p2 = p1;//权限不能放大int b = 25;int* p3 = &b;const int* p4 = p3;//权限可以缩小int* const p5 = &b;int* p6 = p5;//不存在权限放大,因为const修饰的是p4本身不是指向的内容return 0;
}

2.在 C++ 中,当你想引用一个变量时,你可以使用引用(int& 这样的方式),但引用的对象必须是可以修改的变量。如果引用的对象是一个临时值或者常量,就会出现问题。

比如说,在下面的代码中:

int a = 5;
int& rb = a * 3; // a * 3 是一个临时结果
const int& rb = a * 3;

这里 a * 3 计算的结果会创建一个临时对象,而 rb 尝试引用这个临时对象。由于临时对象是“常”的,意味着你不能修改它,C++ 会报错。
再比如说:

double d = 12.34;
int& rd = d; // d 是 double 类型,不能用 int& 引用
const int& rd = d;

这里 d 是个 double 类型的变量,而你用 int& 去引用它,这也是不行的,因为 doubleint 的转换会生成一个临时对象。

简单来说,如果你尝试用引用去引用那些只能读取而不能修改的临时值,或者类型不匹配的对象,C++ 会因为这些临时对象的常性而引发错误。这就要求你在这些情况下使用常量引用,如 const int&,这样就允许引用临时对象而不会引发问题。

3.所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象。

5. 引用和指针的关系🪶

C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有自己的特点,互相不可替代。

1.在语法概念上:引用是⼀个变量的取别名,不开空间;指针是存储⼀个变量地址,要开空间。

2.引用在定义时必须初始化;指针建议初始化,但是语法上不是必须的。

3.引用在初始化时引用⼀个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。

4.引用可以直接访问指向对象,指针需要解引用才是访问指向对象。

5.sizeof中含义不同,引用结果为引用类型的大小;但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)。

6.指针很容易出现空指针和野指针的问题;引用很少出现,引用使用起来相对更安全⼀些。

最后,本篇文章到此结束,感觉不错的友友们可以一键三连支持一下笔者,有任何问题欢迎在评论区留言哦~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用LangGraph构建多Agent系统架构!

0 前言 Agent是一个使用大语言模型决定应用程序控制流的系统。随着这些系统的开发&#xff0c;它们随时间推移变得复杂&#xff0c;使管理和扩展更困难。如你可能会遇到&#xff1a; Agent拥有太多的工具可供使用&#xff0c;对接下来应该调用哪个工具做出糟糕决策上下文过于…

51单片机的超声波视力保护仪【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器光照传感器超声波传感器按键、LED、蜂鸣器等模块构成。适用于视力保护仪、坐姿矫正器、超声波防近视等相似项目。 可实现功能: 1、LCD1602显示温度、光照、距离和学习时间 2、超声波传感器采集头部与探…

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

基于Java微信小程序的水果销售系统详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

PyTorch 介绍

什么是 PyTorch PyTorch 是一个开源的机器学习库&#xff0c;广泛用于计算机视觉和自然语言处理等应用。它由 Facebook 的人工智能研究团队开发&#xff0c;并得到了许多其他机构和个人的贡献。PyTorch 以其易用性、灵活性和动态计算图&#xff08;也称为自动微分系统&#xf…

Nexpose 6.6.273 发布,新增功能概览

Nexpose 6.6.273 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, released Oct 10, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 您的本地…

python学习-怎么在Pycharm写代码

打开Pycharm&#xff0c;点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 &#xff08;1&#xff09;点击**…** &#xff08;2&#xff09;选择python的安装路径 4.可修改文件名称-点击创建 …

STM32CUBEIDE的使用【三】RTC

于正点原子潘多拉开发板&#xff0c;使用stm32官方免费软件进行开发 CubeMx 配置 使用CubeMx 配置RTC 勾选RTC 设置日期和时间 配置LCD的引脚用来显示 STM32CUBEIDE 在usbd_cdc_if.c中重定向printf函数用于打印 #include <stdarg.h>void usb_printf(const char *f…

API项目5:申请签名 在线调用接口

开发申请签名 现在用户已经能看到这个接口了&#xff0c;也能看到这个接口文档&#xff0c;接下来就要在线调用 现在我们可以给每个新注册的用户自动分配一个签名和密钥&#xff0c;去修改一下注册流程&#xff1a; backend 项目&#xff0c;找到 UserServiceImpl.java 中的…

Miniconda管理虚拟环境【Python环境配置】

Miniconda管理虚拟环境【Python环境配置】 1. 下载并安装Miniconda2. 管理虚拟环境3. 管理虚拟环境中的包 1. 下载并安装Miniconda 1. 下载 从清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载Miniconda&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda…

go压缩的使用

基础&#xff1a;使用go创建一个zip func base(path string) {// 创建 zip 文件zipFile, err : os.Create("test.zip")if err ! nil {panic(err)}defer zipFile.Close()// 创建一个新的 *Writer 对象zipWriter : zip.NewWriter(zipFile)defer zipWriter.Close()// 创…

使用开源的 Vue 移动端表单设计器创建表单

FcDesigner Vant 版是一款基于 Vue3.0 的移动端低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 源码下载 | 演示地址 | 帮助文档 本项目采用 Vue3.0 和 …

HCIP open-Euler学习文档

第一期 操作系统基础&#xff0c;web基础 OpenEuler 目录 学习系统常用应用(Apache Nginx DNS MySQL)服务器集群架构(HAProxy, Nginx, LVS,keepalived)存储管理(GlusterFS,NAS,SAN)自动化基础(Ansible,SaltStack)Shell脚本基础(变量&#xff0c;语法&#xff0c;函数&…

使用fpm工具制作Vim.rpm包

背景&#xff1a;生产环境中的CentOS 7在安全扫描中被扫描出vim存在堆缓冲区溢出&#xff08;CVE-2024-45306&#xff09;等漏洞。根据漏洞说明&#xff0c;需要升级到最新版。 奈何CentOS 7已经停止维护了&#xff0c;所以&#xff0c;想在网上找一个最新版的vim.rpm相当不容易…

腾讯云宝塔面板前后端项目发版

后端发版 1. 打开“网站”页面&#xff0c;找到java项目&#xff0c;点击状态暂停服务 2.打开“文件”页面&#xff0c;进入jar包目录&#xff0c;删除原有的jar包&#xff0c;上传新jar包 3. 再回到第一步中的网站页面&#xff0c;找到jar项目&#xff0c;启动项目即可 前端发…

跨境业务收款难?Zoho Books来帮忙

外贸跨境企业应收账款管理繁琐&#xff0c;ZohoBooks财务管理软件提供自动化解决方案&#xff0c;简化开票、跟进、收款和账户更新流程&#xff0c;提升效率和准确性&#xff0c;助力企业优化现金流和财务健康。 什么是应收账款&#xff1f; 应收账款指的是企业在提供商品或服…

王爽汇编语言第三版实验1

前言 本系列的文章是对王爽老师的汇编语言中的实验的解答记录&#xff0c;原书一共有17个实验&#xff0c;由于学校的教学流程只做到了第14个实验&#xff0c;因此本文章只会有前十四个实验的解答记录,还有个比较重要的是&#xff0c;文章中会有原书实验中没有的题目&#xff…

汇总10个AI免费一键生成PPT的网站

一、前言 PPT幻灯片是现代办公和学习中的重要组成部分。它在工作、研究或培训中扮演着重要角色&#xff0c;并能够让观众更好地理解信息。随着当今人工智能技术的快速发展&#xff0c;现在有很多免费的AI PPT生成器可供选择&#xff0c;帮助用户更加便捷地制作出高效且具有较强…

rhce:列行性(at和cron)

配置 at练习 设置时间提醒 定义一分钟后显示命令&#xff0c;使用atq查看 cron练习 配置 systemctl status crond 查看文件所在位置 ll /var/spool/cron/ 主要功能 开始操作 进入界面操作每天早上9点说hello crontab -e 五个星号分别代表分时日月周&#xff0c;其次是执…

光通信——前传基本架构

一、前传基本架构 第三代移动通信技术引入了分布式射频接入网络&#xff08;Distributed Radio Access Network &#xff0c; D-RAN&#xff09;架构。在此架构中的的基带处理单元&#xff08; Baseband Unit &#xff0c; BBU&#xff09; 和 射频拉远单元&#xff08; Remot…