C++讲义.doc_第1页
C++讲义.doc_第2页
C++讲义.doc_第3页
C++讲义.doc_第4页
C++讲义.doc_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

目 录第1章C+对C与类无关的扩展(1)61.1C+的基本知识61.1.1命名空间61.1.2C+输入输出简介61.2C+对C语言与类无关的性能扩充71.2.1新增const常量定义符71.2.2功能71.2.3定义71.2.4C+中为什么要提供const71.2.5正确区分const在修饰指针时的两种不同用法71.2.6正确区分符号名之前有无const修饰时的不同81.2.7正确区分C语言中的#define与C+中的const的不同:81.3bool类型81.4string 类型91.4.1定义string类型的变量91.4.2转换为C风格的字符串91.4.3string 的使用91.5枚举类型101.5.1枚举类型的声明和定义101.5.2匿名枚举类型101.6变量的块内定义101.6.1正确理解C中变量的定义要求101.6.2C+中的变量定义的规则101.6.3正确理解C+中的变量的各种作用域。111.7变量的引用操作符 &111.7.1引用111.7.2定义的语法111.7.3引用调用的优点121.7.4正确区分引用在如下两种不同的应用场合时的差别:131.7.5函数形参定义为引用参数时的调用要求131.7.6函数形参定义为引用参数时的的编程效果13第2章C+对C与类无关的扩展(2)152.1函数152.1.1函数原型152.2函数返回一个引用152.2.1引用的返回152.3内联函数162.3.1含义162.3.2为什么内联函数优越于宏替换162.3.3内联函数的定义172.3.4不适宜定义为内联函数的场合172.4函数默认参数172.4.1函数重载172.5函数模板182.5.1函数模板182.6定义语法182.6.1应用实例182.7new 和 delete 操作符19第3章C+对C语言与类有关的性能扩充203.1基本知识203.2面向对象(Object Oriented)203.2.1面向对象(OO):203.2.2面向对象程序设计方法(OOP):203.2.3应用实例213.2.4OOP的优点:223.3抽象223.3.1如何实现抽象223.4封装223.5继承与派生233.6多态性233.7类和对象233.7.1C+中的类:233.7.2如何正确定义出类的成员243.7.3类中成员的访问控制项253.8类中成员之间的访问方式:25第4章C+类和对象的编程264.1对象的含义264.2对象定义语法264.3客观对象264.4C+中的对象264.5使用对象264.6类中的各种特殊成员函数274.6.1内联成员函数274.6.2允许带有缺省形参值的函数274.6.3类中的函数重载274.6.4构造函数274.6.5析构函数294.6.6拷贝构造函数304.7异常处理324.7.1异常处理的方法324.7.2异常规格说明32第5章C+中的对象的各种编程335.1对象赋值335.1.1方法335.1.2应用目的335.1.3实现规则335.2对象数组335.2.1定义的语法345.2.2访问方法345.2.3对象数组的初始化345.2.4对象数组编程时的构造函数设计345.2.5对象数组编程时的析构函数设计345.3对象指针355.3.1C/C+语言中的指针355.3.2C+中的对象指针355.4对象可以作为函数的形参和返回值的定义365.5类中包含有对象成员(类的聚集,对象内嵌,包容法使用类的资源)375.6类中的静态成员375.6.1静态成员的编程375.6.2静态成员的访问方法:385.6.3静态成员函数与非静态成员函数之间的访问:385.7C+中的this指针39第6章友员函数与运算符重载416.1友员函数416.1.1友员函数416.1.2为什么需要友员函数:426.1.3友员函数与成员函数在编程方面的不同点426.1.4友员函数与一般函数(非成员函数)在编程方面的不同点426.2友员类:426.2.1含义426.2.2友员类的定义426.2.3应用目的436.3类的引用性前向说明436.4运算符重载436.4.1运算符重载的实现436.4.2使用类的成员函数实现重载446.4.3使用友员函数实现重载466.4.4自动类型转换466.4.5运算符重载编程的进一步说明47第7章C+类的继承与派生487.1入门知识487.1.1 继承487.1.2 派生487.1.3 为什么需要继承与派生487.1.4 应用的目的487.1.5 继承的可行性487.2如何实现继承与派生497.2.1基类和派生类497.2.2派生类的定义语法497.2.3如何设计派生类成员497.3继承的方式507.3.1三种继承的方式差别507.3.2public 和 private继承方式的区别507.4继承的多重性527.4.1 含义527.4.2 对象的多重相关性527.4.3 多重继承时的派生类的定义语法527.4.4 应用场合527.5继承时的构造函数527.5.1设计原则527.5.2定义的格式537.6继承时的析构函数547.6.1设计原则547.6.2定义格式547.6.3原因547.6.4调用次序54第8章多重多级继承及虚基类568.1多重多级继承时访问二义性568.1.1访问时的二义性568.1.2在多重继承时的二义性568.1.3同名支配(覆盖)原则578.1.4在多级继承时的二义性578.2虚基类578.2.1定义语法578.2.2作用588.2.3如何判断是否为虚基类的问题588.2.4处理的方法588.2.5带有虚基类的最远的派生类的构造函数58第9章多态性和虚函数609.1多态性609.1.1多态性609.1.2作用609.1.3赋值兼容原则609.1.4指向派生类及基类对象的指针619.2虚函数619.2.1定义语法619.2.2虚函数的特点629.2.3为什么需要虚函数629.2.4静态联编639.2.5动态联编的应用639.2.6如何实现动态联编639.3虚析构函数649.3.1原因649.3.2应用场合649.4纯虚函数和抽象基类659.4.1纯虚函数659.4.2定义语法659.4.3抽象基类的编程规则659.4.4抽象基类的用途65第10章综合应用6810.1类模板6810.1.1模板的声明6810.1.2模板的使用68 5中科院计算所培训中心 计算机专业技能培训系列教材教材名称第1章 C+对C与类无关的扩展(1)【本章中的知识要点】 正确理解C语言与C+语言的差别 C+对C语言扩充体现的几个方面 【重点难点】 const用法 string用法 引用1.1 C+的基本知识1.1.1 命名空间C+提供名字空间来防止命名的冲突。例如,如果两个库都定义了cout,当一个应用程序使用这两个库时,将导致命名冲突。大型应用系统由许多人来完成,命名冲突是一种潜在的危险,程序员必须细心的定义标志符以保证名字的唯一性。名字空间std涵盖了标准C+的定义和声明,例如:std:cout。q 命名空间的声明:namespace ttlint x; q 命名空间的使用(两种方式):1) 先引用再访问例如:using ttl:x; 或者 using namespace ttl;x=6; x=6;2) 直接访问如:ttl:x=34;1.1.2 C+输入输出简介C+的基本输出包括cin和cout。1.2 C+对C语言与类无关的性能扩充1.2.1 新增const常量定义符1.2.2 功能它用来冻结一个变量的值,使其值在程序中不能被进一步改变(置成只读属性,即变为常量)。1.2.3 定义const 类型定义符 变量名=初值; 如: const int sumValue=10; /常量定义 const int *ptr; /限定指针 void Function(const int & X) /限定函数的形参 1.2.4 C+中为什么要提供const其目的是替代C语言中的编译预处理命令#define(常量定义),但比它更加语义精确因为#define无法准确地反映常量的数据类型。如: #define sumValue 10 /此时的sumValue是char型还是int型?对变量一经const 修饰后,必须给它赋初值(但用于函数的形参时不需赋初值),一经const修饰后便不能修改此符号名之值。q const int x=12;x=54; /errorq void Display(const int *ptr, const int n) coutval;if(val)也是合法的。如果val的值非零,条件判断为真(true);如果val的值为零,条件判断为假(false)。在默认情况下,bool表达式输出时,真值为1,假值为0。例如:bool flag;flag=(35);coutflagn;的输出为:1可以用以下方式使其输出结果为true:cout boolalphaflagn;1.4 string 类型C+提供string类型来代替C语言的以null为结尾的char类型数组。使用string类型必须包含头文件string。有了string类型,程序员不用需要关心存储的分配,也无需处理繁杂的null结束字符,这些操作将由系统自动处理。1.4.1 定义string类型的变量方式如下: string s1; string s2=Hello; string s3=s2; string s4(Hello World);1.4.2 转换为C风格的字符串我们经常会在程序设计中遇到需要C风格字符串的情况(如以null结尾的char数组)。例如,当我们打开一个文件,而文件又要求必须为一个C风格字符串时,则可用函数c_str如:string filename=”tt.txt”;ifstream if;if.open(filename.c_str();1.4.3 string 的使用【实例练习】#include #include using namespace std;void main()string str=Hello;coutstr=str str长度为: str.length()endl;string s(10,*); /s表示含有十个*的字符串coutsendl;string str1;coutstr1; /注意:输入的字符串以空格或回车代表输入结束 coutstr1=str1endl; string s1=Hello,s2=File;string s3=s1+s2;couts3=s3endl;if(s1=s2)couts1=s2endl;elsecouts1!=s2endl;1.5 枚举类型1.5.1 枚举类型的声明和定义在C语言中,我们如下方式声明一个枚举类型:enum COLORRED,GREEN,BLUE;然后可以定义一个类型为enum COLOR 枚举类型变量:enum COLOR CL;而在C+中可以不用关键字enum,如下:COLOR CL;1.5.2 匿名枚举类型声明形式:enum MAX=1000,MIN=1;在这里我们可以将MAX和MIN作为常量使用,例如,int arrMAX;实际上enum的主要用途就是定义常量。1.6 变量的块内定义 1.6.1 正确理解C中变量的定义要求一般应该集中定义出。例如在C中:void main() int x=1; /正确 for(int i=0; i10; i+) /错误 int y=2; printf(“%d”,y); int c=10; /错误 。 1.6.2 C+中的变量定义的规则可以采用“随用随定义”的方式定义出变量,即变量的块内定义-C+中允许变量在使用之前的任一语句块中定义出来,包括for循环中。void main(void) void main(void) int x=1; /局部变量 for(int loop=1;loop10;loop+) int y; /块内变量 int z=1; /块内变量 x=3,y=4; 1.6.3 正确理解C+中的变量的各种作用域。q 文件域-全局变量(其作用域为从定义点到当前文件结束有效)。q 函数域-局部变量(其作用域为本函数内有效)。q 函数原型域-函数的形参,为局部变量,只在该函数体内有效。q 块内域-块内定义的变量(比局部变量的作用域更小),块内定义的变量的作用域为从定义点到当前块内有效,语句块执行完毕,自动释放。 【实例练习】 int X=1; /全局变量void Function(int a) /函数的形参 int b=a; /局部变量 X=b; /正确 Y=X; /错误void main() int Y=2; /局部变量 X=2; /正确 Function(X); for(int i=0;i10;i+) /块内定义的变量 X=2; /正确 int C=0; /块内定义的变量 X=2,Y=3; /正确 C=X; /错误1.7 变量的引用操作符 & 1.7.1 引用C+利用“&”来产生一个变量的引用(该变量的别名,同一内存单元二种不同的变量名)。int X=1;int & NewX=X;NewX=3; /注意:改变的其实为变量Xprintf(%d,X); /X的值被改变为3,因为X与NewX其实为同一个变量。1.7.2 定义的语法 q 类型定义符&变量名原变量名; 如: int sumValue=1; int & sumData=sumValue;即sumData与sumValue为同一个变量,但在不同的应用场合下以不同的变量名出现。q 为什么要提供引用操作符:C+中的引用主要是用来解决函数调用中形参为指针型的参数时编程其函数体时的不安全性(易出错),操作更加简单、安全。如:int add(int *X, int * Y) 改进为 int add(int &X, int &Y) *X=*X+*Y; X=X+Y; return *X; return X; void main() void main() int a=1, b=2; int a=1, b=2; add(&a, &b); add(a, b); 【蓝梦提示】 在这两种情况下,调用时都是采用传地址方式调用,但采用引用调用时编程其函数体时较简单、安全。1.7.3 引用调用的优点通过引用调用可以提高调用速度,因为只需要传送地址而不需要直接将大量数据拷贝,因而特别适用于形参为大量数据的应用场合。如:struct Data int a1000; AData; void fun(struct Data X) 这是采用传值调用时的函数定义,但是在调用时的效率较低,因为需要进行实参与形参之间的数据拷贝void fun(struct Data &X)这是采用引用调用时的函数定义,在调用时的效率较高,因为形参与实参之间本身是同一个变量。从而在调用fun(AData) 时,如果使用二种不同函数定义时,其调用效果不同。选学内容$有关函数调用的两种型式-传值调用与传地址调用q 传值调用:当函数的形参是以“值”的形式定义时,系统将以传值拷贝方式被调用,在调用时实参拷贝到形参,但在内存中将同时存在实参和形参,调用时占用两倍的内存空间,同时调用时的效率较低。void add(int x, int y) return x+y ;void main() int a=1,b=2; add(a,b); /在调用时刻在内存中同时存在 a,b与x,y变量。q 传地址调用:当函数的形参是以“地址”的形式定义时,它将以传地址方式被调用,在调用时系统将实参的地址传送到形参中,但在内存中将仅有一份参数存在(此时实参和形参变为同一变量),调用时的效率较高。void add(int *x, int *y) void add(int &x, int &y) /C语言的编程方法 /C+语言的编程方法 return *x+ *y; return x+y; void main() void main() int a=1, b=2; int a=1, b=2; add(&a, &b); add(a, b); 1.7.4 正确区分引用在如下两种不同的应用场合时的差别:q 对一般的变量进行引用:如引用的变量不是用作函数的形参或返回值,则说明时必需加以初始化以指明它的同地址变量。void main(void) int X=3; int &refX=X; fun(refX); cout X; /X的值被改变为4 void fun( int & a) a+; /a 为refX的引用q 函数的形参为引用:如引用的变量用作函数的形参或返回值,则说明时不必要加以初始化以指明它的同地址变量,此时形参为实参的引用。 int add(int &X, int &Y) /正确 int add(int &X=1, int &Y=2) /错误 X=X+Y; X=X+Y; return X; return X; 1.7.5 函数形参定义为引用参数时的调用要求调用时实参不能为常量而必须为赋已知值的变量。因为编译器无法为常量(无内存地址)建立内存地址,从而无法产生引用。同时在函数调用时系统将实参地址拷贝到形参,从而使形参即为实参,但在函数体内采用形参名来访问它。int add(int &a, int & b) void main() int X=1, Y=2; return a+ b; add(X,Y); /调用正确 add(1,2); /调用错误1.7.6 函数形参定义为引用参数时的的编程效果q 其一能在一个函数体内访问或修改另一个函数体内定义的变量的值 。【实例练习】#include using namespace std;void IncValue( int &X); /函数的原型说明或定义(在C+中必须强制说明)void main() int A=1; IncValue(A);cout The Value of A Is:Aendl; /注意C+中的标准输出与C中的不同void IncValue(int &X) X=X+1; /表面上为改变 X的值,其实是改变了main()内的A的值q 其二是能使某一函数间接实现“多个返回值”(因为在正常情况下,函数只能实现返回一个值)。【实例练习】#include using namespace std;void CalculateCircle(int R, float &CircleLen, float &CircleArea);void main() int circleR =10; float Length, Area; /定义时未赋值 CalculateCircle (circleR, Length, Area); cout”Circle Length=”Length; /经调用后它们被赋值 cout”Circle Area =” 8= 8 图 15 传值返回函数返回值还有另外一种形式,即引用返回。在这种情况下返回值不再拷贝到临时存储空间,甚至连return语句所用的那个存储单元对调用者都是可访问的。引用返回语法是在返回类型前加一个&标记。int & f( )return i;此时再次调用f时即j=f( );i的值直接拷贝到j中(图16)。i 拷贝到 j 8 = 8图16注意:如果有这样的函数定义:int & f( )int i;return i; /error:是错误的,当f返回时i已经不存在了。2.3 内联函数2.3.1 含义内联函数类似于宏扩展。当预处理器扩展一个宏时,它将用宏定义替换每个宏。当宏替换或函数扩展完成后,再执行程序,这样避免了函数调用的开销,程序可以更有效的执行。使用宏或内联函数的缺点是,如果函数很大或很多地方都调用了这个函数,程序的可执行码变得很大。2.3.2 为什么内联函数优越于宏替换与通过预处理器进行宏阔展不一样,内联函数的扩展是通过编译器完成的。当预处理器扩展一个宏时,它只是进行简单的文本替换,而不考虑代码的语义。而编译器扩展内联函数时,就不得不考虑语义了,正因为这个原因,内联函数通常比宏更受欢迎。2.3.3 内联函数的定义【实例练习】#include using namespace std;inline void swap(int &,int &); /函数声明int main()int I=7,j=-3;swap(I,j);cout”I=”Iendl”j=”jendl;return 0;void swap(int &a,int &b)int t;t=a;a=b;b=t;注意关键字inlilne出现在函数声明而不是函数定义部分。2.3.4 不适宜定义为内联函数的场合如果函数体内有循环语句、条件语句、switch等控制流语句时,不能定义为内联函数,因为它们有改变程序流程的语句,系统无法正确地进行宏替换2.4 函数默认参数C+允许程序员在函数声明中以常数形式为函数指定默认值。如果在调用函数时不提供这个参数,则将使用默认值代替。void f(int x,int y=5,int k=6);/函数声明对函数的有效调用方式是:f(12,32,123);f(12,32);f(23);这里要特别注意函数的声明顺序。例如:f(int x,int y=5,int z);/错误f(int x,int y=12,int z=34);/okf(int x=23,int y=3,int z);/错误函数参数初始化的顺序是从右向左一次进行的。2.4.1 函数重载C+允许在同一范围内使用相同名字的函数,但要保证函数参数个数或参数类型不同。如果有多个明为f的函数被定义,就称f被重载。编译器通过实参类型与同名函数的参数表进行匹配以决定调用哪个函数。例如:void f(int x,int y);void f(int x);void f(float x,floaty); f(12,12); /调用f(int x,int y)f(13); /调用 f(int x)f(12.12f,12.432f); /调用 f(float x,float y)2.5 函数模板2.5.1 函数模板它是C+中实现静态多态性的一种手段,可以用来创建一个通用功能的函数以支持多种不同形参,进一步简化重载函数的函数体设计(因为有些重载函数的函数体是相同的)。int add(int x, int y) x=x+y;/函数体是相同的只是不同类型的形参 return x;float add(float x, float y) x=x+y ; /函数体是相同的只是不同类型的形参,为什么不可以只写一个呢? return x;2.6 定义语法使用关键字template来定义说明一个函数模板template /或者template Type add(Type X, Type Y) return X+Y; 要点F采用Type来代替某一数据类型定义符(占位符号),告诉编译器此处可以用合适的数据类型替代。2.6.1 应用实例求各种类型的两数之和【实例练习】#include using namespace std; template Type add(Type X, Type Y) /定义两数之和函数模板 return X+Y; template /定义三数之和函数模板,但第二个数必须为整数 Type add(Type X, int Y, Type Z) return X+Y+Z;template /定义三数之和的函数模板,但第二个数必须为浮点数 float add(Type X, float Y,Type Z) float f=X+Y+Z; return f; void main(void) coutadd(1,2)n; coutadd(!,#)n; coutadd(1.2, 3.4)n; coutadd(1,2,3)n; coutadd(1, 2.3f, 4)n;【蓝梦提示】 在函数模板调用时必须保证实参与形参相互匹配。2.7 new 和 delete 操作符含义:new 和 delete 用于动态分配和释放存储空间。用法:new 和 delete 必须配套使用,由new 开辟的空间一定要由delete 来释放。例如:int *p=new int;/new 进行动态分配的时候会返回它所开辟的内存的地址delete p; / 当不再使用p时,一定要对它进行释放;也可以象这样来创建:int *p=new int(5); /动态分配一个整型空间并将其初始化为5也可以用new 动态分配一个连续的存储空间,例如:int *p=new int5;/动态分配5个整型空间delete p;【本章总结】熟练掌握函数重载及函数模板的应用。中科院计算所培训沈阳69第3章 C+对C语言与类有关的性能扩充【本章中的知识要点】 面向对象程序设计方法及编程思想 OOP的四个基本机制(抽象、封装、继承、多态) C+的源程序格式。【重点难点】 面向对象的特点及如何实现对事务的抽象。3.1 基本知识1、OOP(Object Oriented Programming)是面向对象程序设计方法,是目前程序设计的主流方法。2、C+是混合编程语言:C+是在C的基础上产生又保持与C相兼容,因而C+既可以实现面向对象编程又可以实现面向过程编程(兼容C)。3.2 面向对象(Object Oriented)3.2.1 面向对象(OO):父母我儿女兄妹朋友它是一种解决问题的方法或者观点,它认为自然界是由一组彼此相关并能相互通信的实体(Object,中文为“对象”)所组成的。如“人类”的相互关系如下:3.2.2 面向对象程序设计方法(OOP):q 含义:它要求程序员使用面向对象的观点来分析问题(即将所要解决的问题转化为程序中的对象-任何问题在程序中都被映射为对象),以找出问题的属性(通过数据来描述)与方法(通过函数来体现),然后用计算机语言来描述,最后在计算机中加以处理的一种程序设计方法。q 编程要求:程序员在描述或处理问题时应具有高度的概括、分类并对它加以抽象的能力,才能准确地描述出某一实体(待解决的问题)。q 应用目的:实现软件设计的产业化,变手工作坊式编程为软件构件式工业化,达到快速高效编程。实现可重用的软件组件。q 编程特点:根据所要解决的问题的各个相关性转化为程序中的各个类相关性,然后将每个类具体化产生出对应的问题对象,以消息传递的机制来组织对象之间的相互作用。程序组成形式-对象+消息,对象与对象之间通过消息作为连接相互驱动。对象(问题)之间的关系是编程关心的重点,而对象(问题)的功能实现过程则处于次要的地位(只在某一函数内考虑问题的实现)。3.2.3 应用实例计算两数之和 设计流程:q 定义出一个“加”类-描述出各种类型的数相加操作;q 将此类(实例化)具体化以定义产生出一个对象(代表本次计算的问题);q 向此对象发送一条消息-将二数相加并发送消息参数;q 再向此对象发送一条消息-显示出总和值。 【实例练习】#include using namespace std; class AddClass/定义一个加类 public: void Add(int x, int y) sum=x+y; void Add(float x, float y) sumf=x+y; void printSum(int flag) coutTotal Sum=sum; void printSum(float flag) coutTotal Sum=sumf; private: int sum; float sumf;void main(void) AddClass addObj; /定义出一个对象(它代表所要解决的问题1+2 = ?) addObj.Add(1,2);/向此问题的对象发送一条累加的消息同时附带二个消息参数 addObj.Add(3.4F, 5.6F); addObj.printSum(1); /再向此问题的对象发送一条显示总和的消息 addObj.printSum(1.0F);3.2.4 OOP的优点:q 实现数据与方法的封装,通过方法来操作改变数据,提高了数据访问的安全性;q 程序更加模块化,便于代码重用;q 由于程序是类的集合从而可以根据问题的相关性来组装程序,而面向过程则是函数的集合,零零散散不便于代码重用。3.3 抽象 对具体问题(对象)进行分类概括,提取出这一类对象的公同性质并且加以描述的过程。编程的要求:q 先注意问题的本质及描述,其次是实现过程或细节。它直接决定程序的优劣-类的定义及组成元素;q 所涉及到的主要内容:数据抽象(属性)-描述某类对象的属性或状态(对象相互区别的物理量),代码抽象(方法)-描述某类对象的共有的行为特征或具有的功能。3.3.1 如何实现抽象通过类的定义这一机制来达到。 实例 1钟表这一类对象q 数据抽象- int Hour, int Minute, int Secondq 代码抽象- SetTime()、ShowTime()实例 2人这一类对象(人类-地球上的所有人)q 数据抽象- char * name, char *sex, int ageq 代码抽象- Eat()、Work()、Walk()、Study()【蓝梦提示】 对同一类问题可以有不同的抽象结果,这取决于程序员看问题时的视角3.4 封装提供将抽象出的数据成员、代

温馨提示

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

评论

0/150

提交评论