函数 ~~~

news2024/11/13 9:09:02

函数

目录:

  • 函数
    • 函数概述
    • 函数类型
    • 函数定于与声明
    • 函数参数
    • 引用
    • 函数可变函数
      • 函数可变参数 使用
    • 函数默认参数
    • 函数返回值
    • 函数嵌套调用
    • 函数递归
    • 内联函数
    • 内联函数与普通函数区别
    • 函数重载

image-20230103230611202

函数概述

C++语言中的函数在其他编程语言中也称为过程或子例程。 我们可以创建函数来执行任何任务。 一个函数可以调用多次。

函数提供模块化和代码可重用性。

函数有很多优点,但这里主要介绍以下两点:

  1. 提高代码可重用性

通过在C++中创建函数,可以调用函数多次。 所以实现相同的功能不需要一遍又一遍地编写 相同的代码。

  1. 代码优化

函数能使代码优化,我们不需要写很多代码。假设,要检查多个数字(111,663和781等)是否是 素数。 如果不使用函数,需要编写计算质数逻辑程序3次。 所以,这里就产生了不必要的重 复代码。

函数类型

C++编程语言有两种类型的函数

  1. 库函数:是在C++头文件中声明的函数,入:ceil(x),cos(x),exp(x)等
  2. 用户定义的函数:是由C++程序员创建的函数,以遍可以多次使用它。它降低了大程序的复杂性并优化了代码。

函数定于与声明

定义函数

type funcName(paramlist)
{
    // todo
    return value;
}

声明函数

type funcName(paramlist);

区别

直接定义函数一般放在main函数之前,定义完即可使用

另外,可以在main函数前先声明,在mian之后定义函数

函数参数

语法

 void  funcName(paramType1 param1, paramType2 param2)  

  {  

 	 // 执行语句...  

  }  

定义了一个函数 funcName,该返回的返回值类型是 type,如果没 有返回值,则写 void

该函数有两个参数,分别为 paramType1 类型的参数 param1 paramType2 类型的参数 param2,函数的返回值为 void

引用

引用即为某个已存在的变量取别名,引用变量与被引用变量共用一块内存空间,比如土豆和马铃薯都是同一种东西的不同命名。

通过在数据类型后、变量名前添加“&”符号来定义引用类型。

语法:

type &name=data;

int num = 11;

int &num2 = num; // num2就是num的别名,num2就是num的引用

引用特性

  1. 引用只是别名,不占内存;和它引用的变量共用同一块内存空间;
  2. 引用仅在定义时带&,使用时普通变量一样使用,不含&;
  3. 引用必须在创建的时候初始化,一旦引用初始化后,就不能改变 引用所指向的变量,类似于指针常量。
  4. 引用必须与一个确定的合法内存单元相关联,不存在NULL引用且不可以使用;

一个变量可以有多个引用,就像人一样,有可能有多个昵称!

引用使用场景

  1. 做参数

    void change (int &v1,int &v2){}

    在函数被调用时,就相当于传递实参

#include <iostream>
using namespace std;
void change(int & num)
{
	num *= 2;
}
int main()
{
    int x = 100;
    change(x);
    cout << "x= " << x << endl;
    return 0;
}
  1. 引用做返回值

​ 语法

type& funcName(){}

当函数返回一个引用时,则返回一个指向返回值的隐式指针

当返回一个引用时,要注意被引用的对象不能超出作用域。所以返 回一个对局部变量的引用是不合法的,但是,可以返回一个对静态

变量的引用。

int& func(int& v1) {
    v1 *=100;
    return v1;
}
int main() {
    int num = 2;
    cout << func(num) << endl;
    cout << num << endl;
    return 0;
}

形参与实参

形参:函数括号里面的变量参数,叫形式参数

type funcName(type v1,type v2);

实参:调用函数时给的实值,叫实际参数

funcName(2,3);

函数可变函数

语法

  type  funcName(paramType1 param1, ...)  
  {  
      // 执行语句...  
      return value;  
  }  

可变参数,即函数参数的个数是任意的,最典型的可变参数的就是 系统内置的 scanf 函数和 printf 函数。

可变参数的函数必须至少有一个强制参数,可选参数的类型可以变 化。可选参数的数量由强制参数的值决定,或由用来定义可选参数 列表的特殊值决定。

对于每一个强制参数来说,函数头部都会显示一个适当的参数,像 普通函数声明一样。参数列表的格式是强制性参数在前,后面跟着 一个逗号和省略号(…),这个省略号代表可选参数。

可变参数函数要获取可选参数时,必须通过一个类型为 va_list 的对象,它包含了参数信息。这种类型的对象 也称为参数指针(argument pointer),它包含了栈中至少一个参数的位置。

可以使用这个参数指针从一个可选参数移动到下一个可选参数,由此,函数就可以获取所有的可选参数。 va_list 类型被定义在头文件 stdarg.h 中。

当编写支持参数数量可变的函数时,必须用 va_list 类型定义参数指针,以获取可选参数。当我们处理可变参 数时,主要涉及到以下几个宏函数:

va_start

语法

void va_start(va_list argptr, lastparam);

argptr

定义好的 va_list 变量。

lastparam 强制参数。

宏 va_start 使用第一个可选参数的位置来初始化 argptr 参数指针。该宏的第二个参数必须是该函数最后一个有 名称参数的名称。必须先调用该宏,才可以开始使用可选参数

函数可变参数 使用

va_arg

语法

type va_arg(va_list argptr, type);

argptr 定义好的 va_list 变量。

type 可变参数的具体类型。

展开宏 va_arg 会得到当前 argptr 所引用的可选参数,也会将 argptr 移动到列表中的下一个参数。宏 va_arg 的第二个参数是刚刚被读 入的参数的类型。

va_end

语法

void va_end(va_list argptr);

argptr定义好的 va_list 变量。

当不再需要使用参数指针时,必须调用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 来重新初始化一个之前用过的参数指针, 也必须先调用宏 va_end。

va_copy

语法

void va_copy(va_list dest, va_list src);

dest 目的 va_list 变量。

src 源 va_list 变量。

宏 va_copy 使用当前的 src 值来初始化参数指针 dest。然后就可以 使用 dest 中的备份获取可选参数列表,从 src 所引用的位置开始。

函数可变参数 案例

用函数可变参数,实现求任意变量的和。

#include <cstdio>
#include <cstdarg>
#include <iostream>
using namespace std;
int mulSum(int n, ...)
{
    int sum = 0;
    va_list argptr;
    va_start(argptr, n);
    for (int i = 0; i < n; i++)
    {
        // 初始化argptr
        // 对每个可选参数,读取类型为int
        sum += va_arg(argptr, int);    //累加到 sum  中
    }
    va_end(argptr);
    return sum;
}
int main()
{
    int result = mulSum(4, 1, 3, 5, 8);
    cout << "result = " << result << endl;
    return 0;
}

函数默认参数

定义 函数 时可以给形参指定一个默认的值,这样调用函数时如果 没有给这个形参赋值(没有对应的实参),那么就使用这个默认的 值。也就是说,调用函数时可以省略有默认值的参数。如果用户指 定了参数的值,那么就使用用户指定的值,否则使用参数的默认值。

所谓默认参数,指的是当函数调用中省略了实参时自动使用的一个 值,这个值就是给形参指定的默认值。

语法

  type  funcname(paramterType param1, paramterType2 param2 = value)   
  {  
  	return [val];  
  }  

默认参数案例

#include <iostream>
using namespace std;
int sum(int num1, int num2 = 100)
{
    int ret = num1 + num2;
    cout << ret << endl;
}
int main()
{
    int num1 = 1;
    int num2 = 2;
    sum(num1, num2);
    sum(num1);
    return 0;
}

函数返回值

C++ 中 函数 可以不返回任何值,也可以返回一个值,但 C++ 的函数不支持返回多个值。同时,C++ 函数的返回值需要显式的声明其 类型。

语法

  type  funcName(paramType1 param1, paramType2 param2)  
  {  
      // 执行语句...  
      return value; 
 }  

函数嵌套调用

函数可以嵌套调用,即,我们可以在一个函数里面调用另一个函数。

语法

void funcName()
{
    funcName1();
    funcName2();
           [return]
}

函数递归

函数递归就是一个 函数在函数体内又调用了自身,称为函数的递 归调用。

语法

type funcName(param)
{
    if (param == cond)
    {
           return;
    }
    funcName(param2);
}

递归条件

  1. 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)。

  2. 函数的局部 变量 是独立的,不会相互影响。

  3. 递归必须向退出递归的条件逼近,否则就是无限递归了。

  4. 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用, 就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。

**递归图示 **

image-20230104165120499

递归案例

求1+2+3+4+5+…+n的和

int sum(int n){
    int total = 0;
    for(int i=1; i<=n;i++){
        total += i;
    }
    return toatl;
}

简单算法实现代码

int sum(int n){
 	return1+n)*n /2.0;
}

递归实现代码

int sum(int n){
    if(n==1){
   		 return 1;
    }
    return sum(n-1) + n;
}

递归案例2

递归实现斐波那契数列(fibo)的第n项。

int fibo(int n){
    if(n <= 2){
   		 return 1;
    }
    else{
   		 return fibo(n-1) + fibo(n-2);
    }
}

递归案例3 汉罗塔

移动过程中必须遵守以下规则:

  1. 每次只能移动柱子最顶端的一个圆盘;

  2. 每个柱子上,小圆盘永远要位于大圆盘之上.

在这里插入图片描述

分析:

只有一个盘子

image-20230104165850915

两个盘子

image-20230104165909562

对于 n 个圆盘的汉诺塔问题,移动圆盘的过程是:

  1. 将起始柱上的 n-1 个圆盘移动到辅助柱上;
  2. 将起始柱上遗留的 1 个圆盘移动到目标柱上;
  3. 将辅助柱上的所有圆盘移动到目标柱上。
void hanoi(int num, char sou, char tar,char aux) {
	static int count = 1;//统计移动次数
	//如果圆盘数量仅有 1  个,则直接从起始柱移动到目标柱
    if (num == 1) {
        cout << "第” <<count << “次:从”<<  sou << “ 移动至”<<tar  << endl;
        count++;
    }
    else {
        //递归调用 hanoi() 函数,将 num-1  个圆盘从起始柱移动到辅助柱上
        hanoi(num - 1, sou, aux, tar);
        //将起始柱上剩余的最后一个大圆盘移动到目标柱上
        cout << "第” <<count << “次:从”<<  sou << “ 移动至”<<tar  << endl;
        count++;
        //递归调用 hanoi() 函数,将辅助柱上的 num-1  圆盘移动到目标柱上
        hanoi(num - 1, aux, tar, sou);
    }
}
int main()
{
    //以移动 3 个圆盘为例,起始柱、目标柱、辅助柱分别用 A、B、C  表示
    hanoi(3, 'A', 'B', 'C');
    return 0;
}

内联函数

在 C 语言 中,如果一些 函数 被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。在 C++ 中,为了解决 这个问题,特别的引入了 inline 修饰符,表示为内联函数。

栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环 递归调用 的最终结果就是导致栈内存空间枯竭。

使用场景

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数 根据刚才的状态继续往下执行。

一个 C/C++ 程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如 return 0;)来结 束自己的生命,从而结束整个程序。

函数调用是有时间和空间开销的。程序在执行一个函数之前需要做一些准备工作,要将实参、局部变量、返回地址以及若干寄存器都压入栈中,然后才能执行函数体中的代码;函数体中的代码执行完毕后还要清理现场,将之前压入栈中的数据都出栈,才能接着执行函数调用位置以后的代码。

如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句, 那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于 C 语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

内联函数定义

关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用。

语法

inline returntype funcname(paramterType params)   // inline  与函数定义体放在一起
{
	return [val];
}

技术细节

如下的函数风格,不是内联函数,因为内联函数的 inline 关键字,只能放在函数定义的地方:

inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
	
}

inline关键字

inline 是一种 “用于实现的关键字”,而不是一种 “用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了 inline 关键字,但我认为 inline 不应该出现在函数的声明中。

这个细节虽然不会影响函数的功能,但是体现了高质量 C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联

使用限制

inline 的使用是有所限制的,inline 只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如 while**、switch 并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)**

内联函数 案例

判断多个数是否为偶数?

#include <iostream>
using namespace std;
inline bool isEven(int num)
{
	return num % 2 == 0;
}
int main()
{
    int num1 = 100;
    int num2 = 101;
    bool b1 = isEven(num1);
    bool b2 = isEven(num2);
    cout << “b1 =<< b1 <<endl;
    cout <<  "b2 = " << b2 << endl;
    return 0;
}

内联函数与普通函数区别

内联函数 和 普通函数 最大的区别在于内部的实现方面,当普通函数在被调用时,系统首先跳跃到该函数的入口地址,执行函数体,执行完成后,再返回到函数调用的地方,函数始终只有一个拷贝。

而内联函数则不需要进行一个寻址的过程,当执行到内联函数时,此函数展开(很类似 宏 的使用),如果在 N 处调用了此内联函数,则此函数就会有 N 个代码段的拷贝。

函数重载

在 C中,我们定义的 变量名 和函数名在同一作用域一定是不允许 重复的,因此,如果我们需要定义几个功能类似的函数,那么我们必须想办法给它们做不同的命名。

在 C++ 中,允许我们为函数设置同样的名字,但这些函数的参数列表的顺序或者类型必须不一致,这就是 C++ 中的函数重载。

函数重载是 C++ 允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。在 C++ 中不仅函数可以重载,运算符也可以重载。

函数重载规则

  1. 函数名称必须相同。

  2. 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。

  3. 函数的返回类型可以相同也可以不相同。

  4. 仅仅返回类型不同不足以成为函数的重载。

**如何做到函数重载 **

C++ 代码在编译时会根据参数列表对函数进行重命名,例如 void Swap(int a, int b) 会被重命名为 _Swap_int_int,void Swap(float x, float y)会被重命名为_Swap_float_float

当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择 对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也 不一样。

案例

利用函数重载,实现求两个数的和

int sum(int a,int b){
	return a+b;
}

float sum(float a,float b){
	return a+b;
}

double sum(double a,double b){
	return a+b;
}

利用函数求出num1-num2之间的所有素数(num1 <num2).

bool isPrime(int n){  // 判断是否为素数
    bool flag = 1;
    for(int i=2; i<=n/2;i++){
        if(n % i == 0){
        	return 0;
        }
    }
    return 1;
}
void prime(int num1,int num2){  // 输出num1 -num2之间的素数
    for(int i = num1; i<=num2; i++){
        if(isPrime(i)){
        	cout << i << “  “;
        }
    }
}
int main(){
    int num1 ,num2;
    cin >> num1 >> num2;
    prime(num1,num2);
    return 0;
}

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

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

相关文章

小游戏引擎选型注意事项

写在前面 前面写了几期有关于小游戏的文章&#xff0c;主要从小游戏开发、小游戏运营、小游戏变现等多个角度进行了较为粗略的介绍&#xff0c;很多同学表示对小游戏引擎部分很感兴趣&#xff0c;希望能够有一些更为深入的分析介绍。今天就对目前主流的小游戏引擎进行探讨。 …

短短一年,市值抹去三分之一 跌落高坛的苹果

美东时间1月3日&#xff08;周二&#xff09;&#xff0c;苹果&#xff08;AAPL&#xff09;收报125&#xff0e;07美元&#xff0c;跌幅3&#xff0e;74&#xff05;&#xff0c;市值降至1.99万亿美元&#xff0c;2万亿美元市值俱乐部中的最后一家就此陨落。此前微软和石油巨头…

电影《绝望主夫》观后感

上周的时候&#xff0c;看了开心麻花的电影《绝望主夫》&#xff0c;讲的是一对夫妇整个世界对换的故事&#xff0c;即丈夫整个继承了妻子世界&#xff0c;妻子继承了丈夫世界观&#xff0c;这确实给人了一种新的视角&#xff0c;一个对调视角。 记得以前刷视频的时候&#xff…

算法之回溯算法

目录 前言 如何理解回溯算法 两种回溯算法的经典应用 1.0-1背包 2.正则表达式 总结 参考资料 前言 很多经典的数学问题都可以用回溯算法解决&#xff0c;比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。用来指导像深度优先收索这种经典的算法。 如何理…

2021 CCF “计算之美”学术大会参会总结

最近在回顾读研以来参加过的大大小小的学术会议记录&#xff0c;在此整理记录之。 前言 2021年6月12日&#xff0c;2021年CCF“计算之美”——新基建时代产、教、研、地融合学术大会在海上丝绸之路起点宁波成功举办。近200人参与本次大会&#xff0c;40余位嘉宾带来精彩分享&…

pwr | 谁说样本量计算是个老大难问题!?(三)(配对样本与非等比样本篇)

1写在前面 之前我们介绍的基于发生率或者均值进行样本量计算的方法&#xff0c;但都是在组间进行计算。&#x1f914; 有的时候我们需要获取组内变化&#xff0c;进行样本量计算。&#x1f92b; 常见的就是配对样本&#xff0c;比如相同受试者进行多个时间点的观察&#xff0c;…

Navicat远程连接禅道一键安装在Linux的MySQL数据库

禅道一键安装的数据库&#xff0c;默认只能在服务器本机访问。远程访问须进行配置&#xff0c;本文说明具体的配置方法&#xff0c;并且已经过验证。 1、首先检查对应的端口是否开放&#xff0c;默认端口为3306. 2、连接到禅道自带的网页版数据库 3、执行SQL创建一个新角色 …

外贸人需要知道的销售技巧有哪些?

外贸销售技巧米贸搜整理如下&#xff0c;希望对你有所帮助:第一步:准备好。没有准备意味着为失败做准备&#xff0c;没有计划意味着为破产做打算。这是为什么呢&#xff1f;因为你不知道你这次要谈什么&#xff0c;所以你首先要做的是准备好整个谈话的结果。第一&#xff0c;我…

PDF能转换成PPT吗?该怎样转换?

PDF能转换成PPT吗&#xff1f;当然是可以的啦&#xff01;我们在工作时候经常需要将PDF文件转换成各种格式的文件&#xff0c;这样可以更方便我们处理各种文件&#xff0c;PPT文件可以用来汇报、展示工作内容等&#xff0c;是我们经常使用的文件类型之一&#xff0c;所以有时候…

Linux文件描述符fd详解重定向原理

文章目录什么是文件描述符fd&#xff1f;文件描述符的分配规则重定向的原理什么是文件描述符fd&#xff1f; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.…

AppScan 是一款web安全扫描工具

AppScan介绍&#xff1a; AppScan是IBM的一款web安全扫描工具&#xff0c;主要适用于Windows系统。该软件内置强大的扫描引擎&#xff0c;可以测试和评估Web服务和应用程序的风险检查&#xff0c;根据网站入口自动对网页链接进行安全扫描&#xff0c;扫描之后会提供扫描报告和修…

2022 中国白帽人才能力与发展状况调研报告

声明 本文是学习2022中国白帽人才能力与发展状况调研报告. 下载地址 http://github5.com/view/55039而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 中国白帽人才能力与发展状况调研报告 2022.11 补天漏洞响应平台 奇安信行业安全研究中心 概述 …

元数据管理Datahub架构讲解

目录1. 概述2. 各模块介绍2.1 Metadata Store​2.2 Metadata Models2.3 Ingestion Framework2.4 GraphQL API2.5 User Interface3. Ingestion Framework的架构3.1 Metadata Change Event(MCE)3.2 Pull-based Integration3.3 Push-based Integration​3.4 Applier(mce-consumer)…

CAN学习资料汇总

先简单做个汇总&#xff0c;细节稍后再逐一写出来 CAN&#xff0c;CANOpen与OSI七层协议的关系 CAN CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的&#xff0c;并最终成为国际标准&#xff08;…

暴涨1000w播放!B站爆款恰饭,弹幕刷屏“上链接”

12月27日&#xff0c;在2022 AD TALK bilibili营销伙伴大会上李旎谈到B站第一批主流用户大多数已经进入28-30岁的阶段&#xff0c;近亿的用户开始对内容的需求有了新的变化。除此之外&#xff0c;B站近几年的用户增长速度亮眼&#xff0c;2022年第三季财报显示平台日活用户已经…

动态内存管理(15)

目录 1、动态内存函数的介绍 1、malloc 2、free 3、calloc 4、realloc 2、常见的动态内存错误 3、C/C程序的内存开辟 4、柔性数组 1、定义 2、柔性数组的特点&#xff1a; 3、使用 1、动态内存函数的介绍 1、malloc malloc 向堆区申请一块连续可用的空间&#xff…

【高阶数据结构】AVL树(动图详解)

&#x1f308;欢迎来到数据结构专栏~~AVL树详解 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句…

5G NR 标准 第12章 波束管理

第12章 波束管理 第 11 章一般性地讨论了多天线传输&#xff0c;然后重点介绍了多天线预编码。 讨论多天线预编码的一般假设是可以对不同的天线元件进行详细控制&#xff0c;包括相位调整和幅度缩放。 实际上&#xff0c;这需要在数模转换之前在数字域中执行发射机侧的多天线…

path 路径模块

1、什么是 path 路径模块 path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性&#xff0c;用来满足用户对路径的处理需求。 方法名 说明 path.join() 用来将多个路径片段拼接成一个完整的路径字符串 path.basename() 用来从路径字符串中…

Kubernetes(4)- 数据存储

第八章 数据存储 ​ 在前面已经提到&#xff0c;容器的生命周期可能很短&#xff0c;会被频繁地创建和销毁。那么容器在销毁时&#xff0c;保存在容器中的数据也会被清除。这种结果对用户来说&#xff0c;在某些情况下是不乐意看到的。为了持久化保存容器的数据&#xff0c;ku…