It计算机课件 第4章 函数_第1页
It计算机课件 第4章 函数_第2页
It计算机课件 第4章 函数_第3页
It计算机课件 第4章 函数_第4页
It计算机课件 第4章 函数_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

<学出瓶士

X

-/丁

C

+

+

第4章函数

4

、草

1

信华学出瓶社量扁翱制|孱

C71,''―/■fff."iT\:I/AHyKn<*>>Ju2CJA..,<

+

+

语第4章函数

序令学习目标

程1.掌握函数的声明和定义、函数的调用及函数的参数

传递过程;

2.掌握关键字inline的含义与使用;

43.掌握递归函数的使用;

草4.掌握函数重载的使用方法;

数5.掌握函数模板的使用方法;

6.了解各类系统函数,掌握常用的系统函数的使用。

2

C/「一XJ/」,.二F*«✓✓***二^//)四*~gE_<尊/<^尸**丹"片wfj■"0/*^/■

+

+4.1函数的定义和声明

程4.1.1函数的定义

设函数是一人命名的程序代码块,是程序完成其操作的场所,是将功

计能重复的程序段抽象出来所形成一个独立的、可重复使用的功能模块。

程定义函数的一般格式为:▲

返回类型函数名(裂类型1参数1,数据类型2参数2「)

4语句序列;

、形参表

行说明:

>函数必须先定义才可以使用

>定义函数就是编写完成函数功能的程序块。

3

利华广字厅被包

C

+

+

语4.1函数的定义和声明

言在函数的定义中:

程>返回类型为函数返回值的类型,可以是系统任一基本数据类型或用户已定义

的一种数据类型,它是函数执行过程中通过return语句要求的返回值的类型,

计又称为该函数的类型。当一个函数不需要通过return语句返回一个值时,称

教为无返回值函数或无类型函数,此时需要使用void作为类型名。

程>函数名是用户为函数所起的名字,它是一个标识符,应符合C++标识符的一般

命名规则,用户通过使用这个函数名和实参表可以调用该函数。

>形式参数表可以包含任意多项(可以没有),当多于一项时,前后两个参数之

第间必须用逗号分开。

4>用花括号括起来的语句序列组成了函数体,即函数所完成的具体操作,函数

草体一般分为3部分:第1部分为定义部分,定义函数所需要的局部常量与局部

函变量;第2部分为函数的功能部分,完成函数的功能;第3部分为返回值部分,

数返回函数的结果。如果函数体中没有任何语句,该函数称作空函数。

>每个函数都是一个功能独立的模块,绝不允许在一个函数体内定义另一个函

数。

C

+

+4.1函数的定义和声明

语[I**********************************

言2*p4_1.cpp*

*函数的使用,对两个数取大*

序3

4***********************************I

计5#include<iostream>函数定义

教6usingnamespacestd;

7intmax(intx,inty)i

8{r----------------------------:~~-

9intz;函数体:函数所完成

第10z=(x>y)?x:y;一^的具体操作一

411returnz;

5

C信单人字5被在颉颤HR初遇I及9星国H

+

+4.1函数的定义和声明

序在C++程序中,使用函数前首先需要对函数原型进行声

计明,告诉编译器函数的名称、类型和形式参数。

程卜C++中,函数原型声明原则如下:H

(1)如果函数定义在先,调用在后,调用前可以不必声明;

4如果函数定义在后,调用在先,调用前必须声明。

草(2)在程序设计中,为了使程序设计的逻辑结构清晰,一般

数将主要的函数放在程序的起始位置声明,这样也起到了

列函数目录的作用。

利华广字厅被包

CIWI

+

+

语4.1.2函数原型的声明

程在C++中,函数原型声明原则如下:

设(1)如果函数定义在先,调用在后,调用前可以不必声明;如果函

计数定义在后,调用在先,调用前必须声明。

教(2)在程序设计中,为了使程序设计的逻辑结构清晰,一般将主要

的函数放在程序的起始位置声明,这样也起到了列函数目录的作用。

声明函数原型的形式如下:

4

草返回类型函数名(数据类型1参数1,数据类型2参数2,…);

例如:

intmax(intx,inty);—==32^〜加上参数名会使函数函

intmax(intjnt);[、功能和参薮更清晰。,

7

清华袁学出版社‘鸳f皓

C""*/整e厂*.,CJ*rfMi/JuC3r«^5。「tyj»>

+

+4.1.2函数原型的声明

言函数调用的一般形式为:

序函数名(参数1,参数2,...);

,__________)

计Y

教实际参数表

>各实际参数表中的实际参数应与形参表中的形参一一对应,即个数相等且对应参数

的数据类型相同。

>函数调用是一个表达式,函数名连同括号是函数调用运算符。表达式的值就是被调

4函数的返回值,它的类型就是函数定义中指定的函数返回值的类型,即函数的类型。

>如果函数的返回值为void,说明该函数没有返回值。

例如:

数cout«max(a,b)«endl;

招注音­

主函数main()不需要进行原型语声明,也不允许任何函数调用它,它只由操作系统调用

并返回操作系统。

8

清华方学出扳社

C

+

+4.2.2函数调用的执行过程

程当调用一个函数时,整个调用过程分为三步进行:

设第一步:函数调用;

计①将函数调用语句下一条语句的地址保存在一种称为“栈”的内存中空间

中,以便函数调用完后返回。

将数据放到栈空间中的过程称为压栈。

②对实参表从后向前,依次计算出实参表达式的值,并将值压栈。

③转跳到函数体处。

4

草第二步:函数体执行,即逐条运行函数体中语句的过程。

函④如果函数中还定义了变量,将变量压栈。

⑤将每一个形参以栈中对应的实参值取代,执行函数的功能体。

⑥将函数体中的变量、保存在栈中的实参值,依次从栈中取出,以释放栈

空间。从栈中取出数据称为出栈,X出栈用pop(x)表示。

第三步:返回,即返回到函数调用表达式的位置。

⑦返回过程执行的是函数体中的return语句。.

C

+

+4.2.2函数调用的执行过程

程以函数max()为例,演示函数调用的详细过程如图4-1所示

执行代码内存

100B0000:④push(z)max()定义部分

⑤max([bp-8],[bp-4])

程max()功能体

==>[bp-12]

⑥pop(z)max()执行码

@pop(x)

第©pop(y)栈内存

4⑦jump(pop())

函bp-12:

数①push(l00B0A43)bp-8:

②push(b)bp-4:0

调用max(a,b)

②push(a)bp:100B0A43

©jump100B0000

100B0A43:____bb)之后的语句

10

淆华十字出旃社...

C

+

+4.2.3函数参数的按值传递

程函数调用过程实际上执行了一个从参数传递--执行函数体-一返

序回的过程。其中的函数参数传递过程的实质是将实参值通过栈空间

设一一传送给实参的过程,这种把实参表达式的值传送给对应的形参

教变量传递方式称为“按值传递”。

4

11

等,[.匕_二学年X什

/l‘"""'1/J>■1-'JJIZz*;,■9

C

+

+4.2.3函数参数的按值传递

语[I**************************************

言2*p4_2.cpp*

*函数的传值调用,将两个数交换*

序3

9intt;

4

摩华土学出扳社

CIWI

+

+4.2.4嵌套调用

言在一个函数中调用其它函数叫函数的嵌套。C++中函数的定义是平行的,

程除了main。以外,都可以互相调用。函数不可以嵌套定义,但可以嵌套调

序用。比如函数1调用了函数2,函数2再调用函数3,这便形成了函数的嵌套

设调用。

教[/**************************************************************

2*p4_3.cpp*

3*函数的嵌套调用,求三个数中最大数和最小数的差值*

A**************************************************************/

第5#include<iostream>

4

6usingnamespacestd;

草7intmax(intx,inty,intz

8

9intt;

函数定义

10t=x>y?x:y;

11return(t>z?t:z);

12}

13

淆华丁字出的孑干....-

/JJ<J",一"Ji--▼K•二:t,"/«:,「,’■//'•1,/•/=—.“一Lr*.「7•r•/二,=」,..

C

+13intmin(intx,inty,intz)

+

14{

15intt;

程16t=x<y?x:y;

序17return(t<z?t:z);

设18)

19intdif(intx,inty,intz)

程20{

21returnmax(x,y,z)-min(x,y,z);

22}

23voidmain()-----------

第24{嵌套调用

4

25inta,b,c;

函26cin»a»b»c;

数27cout«"Max-Min="<<dif(a,b,c)«endl;

28)

一运行结果:一

》5-615/

》21

­

清华广字出版社,--------

CJ*tI、**Fr*\Sff**7''­-J*ylyf'**•E/JuCjfl-71€*P

+

+4.2.4递归调用

程在调用一个函数的过程中又直接或间接地调用该函数

设本身的这一现象,叫做函数的递归调用。

程〃1(n=0)

n!二y

第<n(n-l)!(n>0)

4

草・递归可以分为直接递归调用和间接递归调用。

直接递归调用:是在调用函数的过程中又调用该函数本身;

间接递归调用:是在调用fl()函数的过程中调用f2()函数,而f2()中

又需要调用门()。

15

滑工咨理学出版社;立出皓用茄M的抗时汁-'=2

C*,•"ffA*•fr*?,厂T\.j/Af:M.r*-M*]JuC2#=1尸夕f*frr*.**

+

+4.2.4递归调用

言递归方法是从结果出发,归纳出后一结果与前一结果直到初值为

序止存在的关系,要求通过分析得到:初值+递归函数,然后设计一个

设函数(递归函数),这个函数不断使用下一级值调用自身,直到结

教果已知处。

递归函数设计的一般形式是:

第函数类型递归函数名f(参数X)

4{

草if(满足结束条件)

函结果二初值;

else

结果二含f(x-1)的表达式;

返回结果;

16

清华衮学国戒社’皙t朋

C*2/少厂•5C///77^2-?^Jz2ZrV

+

+4.2.4递归调用

I************************************************

序2*p4_4.cpp

设3*函数的递归调用,求n!

计4***********************************************

程5#include<iostream>

6usingnamespacestd;

7intfac(intn)

8{______________

第9Stt;「递归函数定义〜

4

草IMif(n==1)/'--------

函11t=1;

12else/

13t=n*fac(n-1);

14return(t);

15}

17

清华二学出版近一变二-----

C9’

+

+4.2.4递归调用

言16voidmain()

序17{constintmax_n=12;〃int类型数能表示的n!的最大的n

设18intn;______________

计19cout«,,lnputaintegernumber:";匚递归函数调用

程20cin»n;

21if(n>=1&&n<=max_n)

22cout«"Factorialof"«n«"is:"«fac(n)«endl;

第23else

24cout«"lnvalidn."«endL____________________________________

运行结果:

12/

479001600

递归程序分两个阶段执行:

①调用:欲求fac(n)-*先求fac(nT)ffac(n-2)...-*fac(1)

若fac(l)已知,回推结束。

②回代:知道fac(1)f可求出fac(2)->fac⑶f...-(n)

18

音4.匕-「步二行,十

r

C/尸],二。J"./11—1*/12^*#-*

+

+4.2.4递归调用

程函数参数传递过程:

4

19

清华方学出扳社

CIWI

+

+4.2.4递归调用

程【例4-5】汉诺塔(TowerofHanoi)问题。

设有三根柱子A、B、CoA柱上有从小到大排列的n个盘,要求把这

计些盘全部搬到C柱上,可以利用空的B柱;但是每次只能搬动一个盘,

教且在搬动时每个柱子上必须保持盘从小到大的排列次序。如,当盘

数n二3时搬动步骤为:(1,A->C),(2,A->B),(2,C->B),(3,A-

>C),(1,B->A),(2,B->C),(1,A->C)O

4

B(辅助)C(目标)

20

清华尢学出版社

C

+

+4.2.4递归调用

语分析:

程将n个盘子从A柱移到C柱可分解为以下3步:

A(源)B(辅助)C(目标)

①将A柱上-1个盘子借助于C柱先移到B柱;

4

②将A柱上剩下的第n个盘子移到C柱:

2

3

4

③将B柱上n-1个盘子借助A移到C柱。21

音小匕一「学年二万士十

C

+4.2:4递归调用

[/*******************************

言2*p4_5.cpp*

程3*汉诺塔问题*

序4*******************************/

5include<iostream>

教6usingnamespacestd;

程7voidmove(intn,charsource,chartarget)

8(

9cout«"("«n«","«source«"—>"«target«")"«endl;

10)

第11voidhanoi(intn,charA,charB,charC)

4

12{一------------

草13if(n==1)递归函数定义

函------------------------------

14move(1,A,C);

15else{

16hanoi(n-1,A,C,B);

17move(n,A,C);

18hanoi(n-1,B,A,C);

19)

20)

22

C清华玄二学出版社

+

+4.2.4递归调用

言21voidmain()

序22{

设23intnum;

教24cout«"lnputthenumberofdiskes";

程25cin»num;递归函数调用

26hanoi(num,'A','B','C);

27)

第运行结果:

4

J55tL

早Inputthenumberofdiskes3/

(1,A—>C)

函(2,A—>B)

(2,C—>B)

(3,A->C)

(1,B—>A)

(2,B—>C)

(1,A—>C)

23

清华方学出扳社

C

+

+内联函数

语4.3

言内联函数:

序是通过在编译时将函数体代码插入到函数调用处,将调用函数的方

设式改为顺序执行方式来节省程序执行的时间开销,这一过程叫做内联

教函数的扩展。因此,内联函数实际上是一种用空间换时间的方案。

内联函数的定义形式如下:

第inline函数类型函数名(形式参数表)

4

函数体;

在内联函数扩展时也进行了实参与形参结合的过程:先将实参名

(而不是实参值),将函数体中的形参处处替换,然后搬到调用处。但

从用户的角度看,调用内联函数和一般函数没有任何区别。

24

清华玄工学出版社

C

+内联函数

+4.3

语1I/**********************************

言2*p4_6.cpp*

3*内联函数的使用*

**********************************/

设4

计5#include<iostream>内联函数定义

教6usingnamespacestd;

7inlinedoubleCirArea(doubleradius)

8

9return3.14*radius*radius;

第10}

411voidmain()

草12

13doubler1(1.0),r2(2);厂内联函数调用

14cout«CirArea(r1)«endl;1—

15cout«CirArea(r1+r2+4)«endl;

16}

运行结果:

12/

47900160025

利华广字厅被包

CIWI

+

+内联函数

语4.3

程由于计算机的资源总是有限的,使用内联函数虽然节省了程序运行的时

序间开销,但却增大了代码占用内存的空间开销。因此在具体编程时应仔细地

设权衡时间开销与空间开销之间的矛盾,以确定是否采用内联函数。

教与处理register变量相似,是否对一个内联函数进行扩展完全由编译器

程自行决定。因此,说明一个内联函数只是请求而不是命令编译器对它进行扩

展。事实上,如果将一个较复杂的函数定义为内联函数,大多数编译器会自

动地将其作为普通函数处理。

4注意:

草>如果仅在声明函数原型时加上关键字inline,并不能达到内联效果。

>内联函数的定义必须出现在对该函数的调用之前,因为编译器在

对函数调用语句进行替换时,必须事先知道替换该语句的代码是

什么。这也是仅在声明函数原型时加上关键字inline,并不能达到

内联效果的原因。

26

瘠华十字出版社M总.――

内联函数声明与使用

声明时使用关键字inlineo

»编译时在调用处用函数体进行替换,节

省了参数传递、控制转移等开销。

A注意:

>内联函数体内不能有循环语句和switch

语句。

»内联函数的声明必须出现在内联函数第

一次被调用之前。

A对内联函数不能进行异常接口声明。

27

清华之学出成社

C3*/rr"Ir*?VA—,'vylb/-jr*3*JPP"'fi^'C*ys^TC^

+

+带默认形参值的函数

语4.4

C++语言允许在函数说明或函数定义中为形参预赋一个默认的值,

序这样的函数就叫做带有默认形参值的函数。在调用带有默认参数值的

设函数时,若为相应形参指定了实参,则形参将使用实参的值;否则,

计形参相使用其默认值。这就大大地方便了函数的使用。

例如:

intsub(intx=8,inty=3)

第(

4

returnx-y;

草}

函voidmain(void)

数(

sub(20,15);〃传递给形参x,y的值分别为20和15

sub(10);〃传递给形参x,y的值分别为10和3

sub();〃传递给形参x,y的值分别为8和3

}

28

清华之学出成社

C3*/rr"Ir*?VA—,'vylb/-jr*3*JPP"'fi^'C*ys^TC^

+

+4.4带默认形参值的函数

言(1)若函数具有多个形参,则缺省形参值必须自右向左连续地定义,并且在一

序个缺省形参值的右边不能有未指定缺省值的参数。这是由于C++语言在函数调

设用时参数是自右至左入栈这一约定所决定的。

教例如:

程intf(inta,floatb=5.0,charc='.',intd=10);〃正确

intf(inta=1,floatb=5.0,charc='.',intd);〃错误,d未给值

intf(inta=1,floatb,charc='.',intd=10);〃错误,b未给值

4

草(2)在调用一个函数时,如果省去了某个实参,则直到最右端的实参都要省去

函(当然,与它们对应的形参都要有缺省值)。

数例如:

假如有如下声明:

intf(inta,floatb=5.0,charc='.',intd=10);

采用如下调用形式是错误的:

f(8,,,4);〃语法错误

29

清华尢学出版社

CIWI

+

+4.4带默认形参值的函数

程(3)缺省形参值的说明必须出现在函数调用之前。这就是说,如果存在函数原型,

序则形参的缺省值应在函数原型中指定;否则在函数定义中指定。另外,若函数

设原型中已给出了形参的缺省值,则在函数定义中不得重复指定,即使所指定的

计缺省值完全相同也不行。

程例如:

intsub(intx=8,inty=3);〃缺省形参值在函数原型中给出

voidmain(void)

intadd(intx=5,inty=6)

4sub(20,15);//20-15

J55tLtreturnx+y;

早sub(10);//10-3

sub();//8-3

函intmain()

数)

//缺省形参值

intsub(intx,inty){add();〃调用在实现后

没有在函数定义时给出

returnx-y;

)

30

r=J>rII»

信华-无字力被包鼻麻鬲洞删舞腾制费I

C'4;ffV,FL*7'\:rtAnGfjfr//Jf»2fi-i*"^5cT尸-JJRI

+

+4.4带默认形参值的函数

(4)在同一个作用域,一旦定义了缺省形参值,就不能再定义它。

例如:

intf(inta,floatb,char,intd=10);

=,

程intf(inta,floatb,charc.',intd=10);〃错误:企图再次定义缺省参数c和d

(5)如果几个函数说明出现在不同的作用域内,则允许分别为它们提供不同的缺

第省形参值。

4例如:

函intf(inta=6,floatb=5.0,charc='.,,intd=10);

数voidmain(void)

(

intf(inta=3,floatb=2.0,charc=,n',intd=20);

cout«f()«endl;〃f函数使用局部缺省参数值

)

31

清华尢学出版社

Cr--1/.1»/

+

+4.4带默认形参值的函数

程例:

序intadd(intx=l,inty=2);

计intmain()

教{intadd(intx=3,inty=4);

程add();〃使用局部默认形参值

(实现3+4)

}

第voidfun(void)

4{...

草add();〃使用全局默认形参值

函(实现1+2)

32

C

+

+4.4带默认形参值的函数

(6)对形参缺省值的指定可以是初始化表达式,甚至可以包含函数调用。

例如:

〃d参数的缺省值是函数调用。

intf(inta,floatb=5.0,charc-.'Jntd=sub(20,15));

第(7)在函数原型给出了形参的缺省值时,形参名可以省略。

4

JsbtL

早例如:

函intf(int,float=5.0,char=\,,int=sub(20,15));

33

清华瀛的蓼数传递

用引用做形参

A引用(&)是标识符的别名,是一种特殊类型的

变量。例如:

inti,j;

int&ri=i;

//建立一个int型的引用ri,并将其

〃初始化为变量i的一个别名

j=10;

ri=j;//相当于i=j;

»声明一个引用时,必须同时对它进行初始化

,使它指向一个已存在的对象。

A一旦一个引用被初始化后,就不能改为指向

其它对象。

»引用可以作为形参

voidswap(int&a,int&b){...}

34

例:输入两个整数交换后输出

#include<iostream>

usingnamespacestd;

voidSwap(int&a,int&b);

intmain()

{intx(5),y(10);

cout«nx="«x«ny=n«y«endl;

Swap(x,v);

cout«nx="«x«ny=n«y«endl;

return0;

)

voidSwap(int&a,int&b)

{intt;

t=a;运行结果:

a=b;

b=t;x=5y=10

)x=10y=5

35

S管案寻*麻城引用为参数,达

到交换目的。t=a;

x的别名

a

a_=bb=t;

abb

形参是实参的一个别名,对一一r

形参的任何操作直接影响实一W一

参。xy

36|

C

+

+函数重载

语4.5

程C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。

序方便使用,便于记忆。

教函数重载:

就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编

蟒器根据实参和形参的类型及个数的最佳匹配,自动决定调用哪一个函数。

4

草intmax(int,int);

函intmax(int,int,int);

数floatmax(float,float);

doublemax(double,double);

37

清华尢学出版社

C

1/******************************

+2

+*p4_7.cpp.

3

语*函数的重载'

4

言*******************************

程5

#include<iostream>

序6

设7usingnamespacestd;

计8intadd(intx,inty)----函数重载

9(

cout«"(int,int)\t";

10

returnx+y;

11

12)函数重载

第13doubleadd(doublex,doubley)

4

14(

15cout«"(double,double)\r;

16returnx+y;

17}____

18intadd(intx,doubley)"函数重载

19(

20cout«"(int,double)\tn;

21returnint(x+y);

}

清华尢学出版社

C

+21

+22

言23

程24

序25

计26voidmain()

教27

28cout«add(9,8)«endl;

重载函数的调用

29cout«add(9.0,8.0)«endl

30cout«add(9,8.0)«endTT

431cout«add(9.0,8)«endl;

草32)

运行结果:

(int,int)17

(double,double)17

(int,double)17

(double,int)17

-----------------------------------------------------------------------------------------------------------------------------^9

羽挈十学出版社

C

+

+4.5函数重载

言b注意:

程(1)各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相

序同,仅仅是返回类型不同,则是非法的。在编译时会认为是语法错误。

计//C++无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,

教〃返回类型是不知道的。

程intadd(intil,inti2);

floatadd(intfl,intf2);

(2)确定对重载函数的哪个函数进行调用的过程称为绑定(binding),绑定的优先次序为

第精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后

4的匹配。___________________________________________________________________

J55tL

〃将char型转换成int型,然后与add(int,int)绑定。

函add('A','A'+'O');

数〃函数实参向(double,double)转换,然后与add(double,double)绑定。

add(float(8),float(9));

〃实参类型为(longdouble,int),向低类型转化。

add(longdouble(8),9);

40

v=J>r^-^irIIL^L一)I

摩华嗟:字身破包

CP-:B,ff."Il/*rjr*-':J»/AJs%TM*fJKJA-->「irr-C^l

+

+函数重载

语4.5

言绑定(匹配)二义性

程两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定,这

序种现象就叫绑定(匹配)二义性。

计消除这种二义性的办法有:

教①添加重载函数定义,使调用获得精确匹配。如:增加定义add(long

程double,int)

②将函数的实参进行强制类型的转换,使调用获得精确匹配。

例如:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论