C++学习笔记.doc_第1页
C++学习笔记.doc_第2页
C++学习笔记.doc_第3页
C++学习笔记.doc_第4页
C++学习笔记.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

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

文档简介

C+学习笔记成功在于勤奋与努力-Akenzhang1. 默认参数可以在方法声名或者方法定义中任一处定义,但不能两处同时都定义。另外,在方法声名时,也可以不用指明参数名称。如:# include void repchar(char=*,int=45);/带有默认参数的函数声明/主要函数void main()。/定义方法repchar void repchar(char ch,int n)。2. 注意区别指针的两种引用方法:const int *p=&x; (带颜色的不可以改变)这样,就不可以通过指针来更改其指向的地址的值,即指针p可以改变,但*p不可以改变。X也可以改变。Int *const p=&x; (带颜色的不可以改变)这里*p可以改变,但p不可以改变。3. 宏定义#define注意事项:A. 该语句不可以以”;”分号结束;B. #define后面的参数或表达式,应用()小括号括起来。如:#define p(x) (a+b)#define p(x) (a+b)#define p(x) (x)*(x) -此处不能写成#define p(x) (x*x)C. 在C+中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字;D. 内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。我们也可以将定义在类的外部的函数定义为内联函数;E. 内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了;F. 内联函数声名时inline不能省略;内联函数定义时inline可以省略;G. 内联函数体内,不能含有复杂的结构控制语句,例如switch,while,如果有,则编译器会视同普通函数处理。4. 函数的默认值的几点注意事项:A. 函数若有参数,如不指定默认值,即必须指定参数值;B. 函数的默认值,可以在声名或定义时任一处指定,但不可以两处同时指定;C. 参数不可以在中间却省,只可以全部缺省或从末尾开始缺省;D. 没默认值的,一定要指定参数;E. 定义时,若有一个参数指定默认值,即其后的所有参数都必须指定参数;5. 内联函数:A. 内联函数中的inline提出一种内联申请,但不是指令。到底是否真的作为内联函数,需要有系统自己指定;B. 非常短的函数才适合做内联函数,如果代码够长,最好使用常规函数;C. inline必须在定义的内联函数中出现,而不是在声名中出现;D. 内联函数比常规函数的执行速度快,但需要比常规函数更多的内存。6. 函数重载应注意:A. 参数列表的类型或个数必须不同;B. 函数的返回值可以不同或相同;C. 函数重载只才函数声明的作用域内才有效果;D. 对于不是相同区域内声名的相同名称的函数,不能说是函数重载。7. 引用提供对象的别名或可选名。按照引用传递不会造成传递实际变量的副本,只会创建别名;返回引用不会返回变量的副本,而是返回别名。8. 作用域操作符可以将特定函数标识为特定类的成员。“:”左侧必须是类名。9. 构造函数的特点:A. 与类同名;B. 用于对对象进行初始化;C. 没有返回类型;D. 可以带参数;E. 可以象函数重载一样,使用带不同参数类型的参数的构造函数;F. 继承中的构造函数:在调用一个派生类的构造函数中可以显式地选择调用基类的哪个构造函数。Derived():base()10. 析构函数的特点:A. 与类同名;B. 名称前面有符号;C. 不能带参数,由于其作用是销毁对象;D. 没有返回值; 11. C+中,只有new才能为对象指针分配内存。如,int *P;p=new int;不可以写成:int *p=10;注意:A. new与delete为C+内置函数,而与他们相当的malloc等为外置附加函数;B. new作用用语为类的对象创建内存空间,并返回指向所创建的对象的指针。12. 有关静态成员:A. 静态成员函数不是类的对象的一部分,它没有this指针;B. 当一个类的所有对象必须共享一些信息时,静态成员数据项非常有用;C. static声明一个变量并初试化时,定语语句只有在第一次有效并且只执行一次,第二次碰到该定义语句时并不起作用了;D. static可以放在privite或public部分:放在private部分时,类外部不能访问,放在Public部分,则类外可以访问;E. 静态函数通过类名加作用域运算符(:)调用,也可以通过如下方式调用: 对象.静态成员;由于静态成员是属于整个类的,故调用的方法有两种:. 对象.静态成员;.类名.静态成员;F. 静态函数不能调用非静态成员,静态成员只能操纵类的静态数据成员,看反过来可以;G. 静态成员应在main()程序开始之前创建并初始化,如:int alpha:count=0; /在main()之前初始化静态成员countint main()H. 声名一个静态数据成员后,类的所有实例共享的只是该静态数据成员的单一个副本;I. 静态成员函数对它所属的类中的成员是“全局”的。13. this是一个指针,可以通过如下两种方式访问属性:A. this-属性;B. (*this).属性;14. 如何利用delete删除指针内存对于普通指针,可以直接利用:delete p;对于数组指针,可以 delete p;只要是使用new来分配对象数组,就必须在delete语句中使用,因为指向对象的指针与指向数组的指针之间在语法上没什么区别。因此,如果不带括号的delete,就不能删除全部数组。对象数组的初始化:如:假设有:class Employerprivate:char Name40;int Age;double Salary; Employer ManyEmps3=Employer(“Slaycke Xulberg”,33,9600),Employer(“aken”,30,9500),Employer(“zhang”,28,3500)15. 如何处理C中出现的死循环:doj=scanf(“%d”,&x);if(j1)fflush(stdin); /抛掉缓冲区里的内容while(jj;if(cin.fail()cin.clear;cin.getline(str,255); /抛掉缓冲区里的内容I=-1;while(j=-1);17. C+的输出流:(记住:cout为一个对象)A. out.put(字符); 输出一个字符串B. out.write(p,10); 第一个参数指明字符串的地址;第二个参数指明输出的字符个数;C. flush()可用于清空输出缓冲区: cout”xxxxxx”flush; 或 flush(cout);D. 设置输出的给定数字的基数是16,10还是8进制:hex(),dec();oct()如: hex(cout); 或 couthex;E. cout.width(数字); 说明控制输出结果的宽度,它仅仅能影响下一个输出项目。F. 设置填充字符:cout.fill(字符);G. cout.setf(xxxx); 控制多种公式化功能。Cout.setf(ios:showpos);Cout.setf(ios:hex,ios:oct);Cout.setf(ios:uppercase);Cout.setf(ios:floatfield,ios:fixed);Cout.setf(ios:adjustfield,ios;left); F. cout时会跳过空白字符,而没有时,默认是取消前面的空格的。Cin.unsetf(ios:skipws); 则不会忽略前面的空格。 C. 一般情况下,很少有cin与cin.get(str,数字)混合使用的。因为,cin在读取时会留有前面的一个空格在缓冲区里面。而cin.get(str,数字)则会将回车符号保留在缓冲区里面。20. C+中常见的文件操作方法有:A. 首先应定义一个文件流对象(ifstream,ofstream),他们都来自相同的类fstream;B. 将该文件流对象与具体的文件关联起来,以便当操作该文件对象时实质就是操作该文件;C. 将文件流与物理文件关联有两种方法:第一种是实例化文件对象时应用文件类的构造函数来指定文件位置与指定打开的方式:(ifstream fin(“文件位置与文件名”); ofstream fou(“文件位置与文件名”)fstream f(“文件位置与文件名”,ios:打开模式);第二种是通过文件对象的open方法来指定文件的物理位置。其中文件的打开方式有好几种:ios:in,ios:out,ios:app等。若已经定义好fout为ofstream的一个对象,即可以:fout.open(“文件位置与文件名”,ios:打开模式);D. 调用文件对象的方法,将读取的内容存入字符串或将字符串的内容写入文件:fin.read(str,xxx); (数据块的读,fin流中的数据读入到str中;第一个参数为将读入的数据储存到变量的地址指针,第二个变量为变量的大小。若为类即为sizeof(类名))如: in.read(char *)str,大小数字); cout二进制读出的字符串为:str; 若为对象即为:f.read(char *)&a,sizeof(a);fout.write(str,sizeof(xxx); (数据块的写,将str中的数据写入到流fout中。第一个为要写入到文件的内容的变量的地址指针。第二个变量为变量的大小。若为类即为sizeof(类名))E. 常用的方法(在文件内写入与写出内容)a. fout读入变量或内容;c. 如何将文件的内容读入到某个变量:有两种方法:. 利用 fin变量名;. fin.getline(buffer,80)如: while(in.getline(buffer,80) inbuffer; outbuffer; outn; *关闭打开的文件:fout.close();F. 如何相文件中写入数据: char *str; str=new char50; cin.getline(str,50); /声名并从屏幕读取一个字符串 ofstream fout(aken.txt,ios:out); /关联写出的文件 if(!fout) /判断文件是否正常打开 coutFail to open the fileendl; return 1; /退出 foutstr; /向问家写入字符串 fout.close();G. 如果文件的打开模式中指定了ios:app,那么所有的输出将被填加到文件的末尾;如果文件的打开模式中指定了ios:in,表示六可以从文件中输入;如果文件的打开模式中指定了ios:out,表示六可以从文件中输出;如果指定了ios:binary,那么文件以二进制模式打开。在默认的情况下,所有文件都上以文本模式打开;H二进制文件的读写,只要在打开模式上加:(以普通文件的读写没有大的区别)ofstream fout(aken.txt,ios:out | ios:binary);H. 文件的操作步骤:. 创建一个文件流,方法有: ifstream fin; (输入流)或 ofstream fout; (输出流)或 fstream f; (输入输出流).使用函数open()将流关联到文件上来: f.open(“文件位置”,打开模式); 常见的打开模式有:ios:app; ios: ate; ios:binary; ios:in; ios:out; ios:trunc;.判断文件是否被正确打开(如果文件打开失败,即流对象的数返回假): if(!f)cout”文件打开失败”;.向文件流写入或输出内容; f输入的边量或输入的内容; 当然向文件读入或写的方法有多种。对文本文件进行读写操作最简单的办法是使用运算符.关闭文件流:f.close();I. 需要记住的是:在我们使用运算符来读入文本文件时,将会发生字符转换。例如,空白字符将被忽略。如果想在读入文本文件是不发生字符转换,必须以二进制模式打开文件。同时,使用读入字符串时,在遇到第一个字符串后输入将会停止; J如何将文件以二进制格式写入文件: . 声名文件流: fstream f; . 将文件流与文件关联: f.open(“文件位置”,ios:out | ios:binary); . 将变量信息写入文件: -可以按照下例子循环写入。 f.write(char *)&类名,sizeof(类名); f.write(char *)&变量名,变量大小); . 关闭文件流。 如: Data obj; fstream f; char reply=Y; f.open(aken.txt,ios:out | ios:app); while(reply=Y | reply=y) cout请输入个人的详细信息:endl; obj.get(); f.write(char *)&obj,sizeof(obj); coutreply; f.close();J. 如何从文件中读取内容: . 声名文件流: fstream f; . 将文件流与文件关联: f.open(“文件位置”,ios:in | ios:binary); .将文件内容读入到变量中: f.read(char *)&类名,sizeof(类名);-可以按照下例子循环读取。 . 关闭文件流。 如: f.open(aken.txt,ios:in); f.read(char *)&obj,sizeof(obj); while(!f.eof() /判断是否到达文件尾 obj.print(); f.read(char *)&obj,sizeof(obj); f.close();K. 如何判断文件是否正常打开或是否读到文件尾:打开文件时,若文件流返回假即说明文件打开不成立:if(!fout);使用函数eof()判断文件是否达到尾部:while(!f.eof()L. 如何让文件指针回到文件开头:file.seekg(0,ios:beg);M. 关于函数read():. read()函数不仅可以从键盘输入中读取字符,也可以从任意输入流中获取信息;.read()函数不仅可以用于文本文件,也可以用于二进制文件;.read()成员函数的使用格式 read(char* but,int size),buf用来存放读取到的字符指针或字符数组,size用来指定从输入流中读取字符的个数。21. 友元函数的特点:A. 可以访问类的私有部分;B. 因为友元函数不是对象,故没有this指针;C. 在类内声明友元函数时,可以放在类的私有或共有部分声名,但一定在类的外部定义;D. 调用时,像C语言的普通函数般调用,不用加类名与作用域运算符;E. 友元函数的功能可以通过继承方法替代,且尽量少用友元函数,因为它破坏了面向对象原则。F. 如果一个函数需要访问不同类中的私有对象或属性,使用友元函数非常有用。这时应注意向前声名;可以设置一个函数,分别为不同类的友元函数,这样这个函数就可以同时访问不同类的私有属性,进而达到数据交换的目的。G. 只有需要直接访问两个或更多的类的私有成员时,才需要将该函数声名为友元函数;22. 友元类:若将一个类(A)声名为另一个类(B)的友元类,即该该类(A)的所有成员函数都可以访问类(B)的私有成员了。23. 有关运算符重载的几个要点:A. 重载不能改变操作符的基本功能;B. 重载不应该改变已经在语言中定义的优先顺序;C. 重载一个操作符不应该改变它本来的意义;D. 只能对已有的操作符进行重载,不能使用新的操作符号;E. 操作符号重载只对类可用。不能对预定义的基本类型重新定义操作符。F. 不能被重载的操作符:sizeof(),点运算符“.”,作用解析符(:),三元运算符(?:),指向成员的指针(.*)不应该被重载的运算符:逻辑与操作符(&),逻辑或操作符(|)和逗号操作符(,)24. C+中,可以通过使用类来新建数据类型,和使用操作符重载来新建操作符,C+语言提供了将自身重新定义成一个新语言的功能。操作符重载也被称作运算多态性。25. C+运算符重载有前载与后载之分:(以下说友元操作符函数)两者代码的区别是:A. 当为前缀是,直接让对象的每个数值型属性增加1,最后返回(*this)本对象;B. 当为后缀时,首先创建一个对象的实例,让其等与本对象(*this),然后让对象的每个数值属性增加1,最后返回先前实例的对象;C. 如参考下列代码:前缀:three_d three_d:operator+()x+;y+;return (*this); /返回本指针后缀:three_d three_d:operator+(int notused)three_d temp=*this; /首先实例化一个对象,另其等于本对象x+;y+;return temp; /返回实例化的对象D. 当使用成员函数重载二元运算符时,运算符左边的对象将调用运算符函数,同时通过this指针隐式地传递将自身(左边的对象)传递给函数。运算符右边的对象作为参数显式地传递给运算符函数;E. 重载操作符函数有友元函数与成员函数之分。若被重载的是成员二元操作符时,将接受一个参数;若重载的是友元二元操作符时,将接受两个参数;F. 进行运算符重载时,应注意:.算术运算符和比较运算符只能对基本数据类型进行操作,而不能对派生的或者用户定义的数据类型进行操作;.注意区分运算符的返回类型及参数列表。注意使用的是成员函数操作符还是友元函数操作符;. 若在重载操作符时,需要改变某值,即不能将其设定为const,如:void operator-=(point &pnt1,const point &pnt2) /记住:pnt1不能使用const作为修饰词 pnt1.x=pnt1.x-pnt2.x; pnt1.y=pnt1.y-pnt2.y; 26. 运算符重载时,注意strcat()内的两个参数应该是指针:如下面:注意char *str的声名,不能为char str20#include #include class Stringprivate:char *str;public:/构造函数String(char s20)str=new char20;strcpy(str,s);String()str=new char20;strcpy(str,);/重载运算符+String operator+(String s)String newStr;strcpy(newStr.str,str);strcat(newStr.str,s.str); /char *str的声名不能为char str20return (newStr);/重载运算符=String operator=(String s) /注意内的参数s的类型为类名String(与类同名)strcpy(str,s.str);return *this;/显示私有变量void show()coutstr;/主函数void main()/实例化类的对象String s1(患难时的朋友);String s2(是真正的朋友);String s3;s3=s1+s2;s3.show();cout属性 或者:*(this).属性。30. 使用友元函数的优点:A. 可以直接使用函数名来调用,不用使用对象的名字;B. 在某些重载某些特殊的运算符时,友元函数很有用;C. 友元函数简化了某些I/O操作;D. 在某些情况下,可能有两个或者多个类包含了与程序其他部分相关联的成员。这样,仅一个友元函数就可以同时访问两个或多个不同类的成员。31. 友元类访问另一个类的私有变量:将一个类声名为另一个类的友元类,这样,这个友元类内的所有函数便都可以访问主类内的私有变量了。(如:面向对象基础:C+实现 ACCP3.0 P148-P149)32. C+中,若要某个指针为空,可以有两中方法:(假设ptr为一个指针)A. ptr=0;B. ptr=NULL;33. C+中字符串的长度不包括尾的0,但在为字符串分配空间时,应加上该结尾符:(假设ptr为指针,其长度为length) ptr=new charlength+1;如果在ptr=new charlength+1之前已经为ptr分配内存,则应该将其释放:delete ptr;34. C+重载运算符时,成员重载与友元重载的一个很大的区别是:参数的个数将不一样。如,重载+时,成员重载+时只需要一个参数,其中调用+的为隐式子this参数;而通过友元重载时,应为显示参数,即会有两个参数。35. C+的复制构造函数的使用注意事项:A. 复制构造函数的参数一定要是对象的引用,否则会出现一种不断调用复制构造函数的死循环;复制构造函数就是将本类型的一个对象当做参数传给构造函数来初始化对象,但参数一定要是本类型对象的一个引用。B. 在下列三种情况下要用到复制构造函数: . 将对象初试化为对象的另一个对象,即将另一个对象赋予该对象; . 将对象作为参数传递给函数; . 函数返回对象;C. 注意下列区别:String s1=s2与String s1;s1=s2是不同的,第一种会调用到复制构造函数,如果没有复制构造函数,系统会提供一个默认的赋值运算符函数;第二种是调用赋值操作符函数,如果没有赋值运算符函数,系统会提供一个默认的赋值运算符函数。String(String &ss) /一定要是引用int size=strlen(ss.str);str=new charsize+1;strcpy(this-str,ss.str);为什么用赋值操作符?如果没有定义赋值操作符函数的话,若调用像S2=S1这样的操作时,它会调用系统默认的赋值操作符函数,但系统默认的赋值操作符函数有个缺点就是它也会将S1的指针复制给S2,这样S1与S2会指向同一个地址了。为了防止这种现象,就应使用赋值操作符函数,且记住要按照引用传递且返回的也应是一个引用。如:String &operator=(const String &str)-重要(这是由于以对象去初始另一个对象或返回一个对象都会调用构造函数)36. 对于构造函数String(char *s=”),也包括在没有参数下的情形,如:String s1(“xxxxxx”);String s1;37. 类型转换函数:类型转换构造函数与类型转换函数:A. 复制构造函数是使用同类对象作为参数创建新对象。而当需要用基本数据类型或其他类型的对象创建对象时,就要用到类型转换构造函数;B. 类型转换构造函数是,在类的构造函数中传入不同于该类的另一个对象时,在构造函数中将按照该类的属性转换成相应类型的属性;C. 类型转换函数是用在对象与基本数据类型之间以及在不同类型之间进行转换的成员函数;(a). 用户自定义类型到基本数据类型的转换:这种成员函数的特点: 首先,没有返回类型; 其次,但一定要有返回值; 接着,是以基本数据类型名做为成员函数名;(b).不同类的对象的转换: 这种不同类对象之间的转换时,应注意: 首先,两个不同类的对象之间的转换可以使用两种方法实现:使用构造函数或使用转换函数; 其次,构造函数通常在目标类中定义,而转换函数通常在 源类中定义; 接着,函数名是以类名做为转换函数的函数名; 最后,objectA=objectB; objectA为目标类,而objectB为源类。 ObjectA = objectB(常定义构造函数) (常定义转换函数)38. 虚函数:A.当使用指针来访问类时,可以使用类成员访问操作符(-)来访问类的成员。基类的指针可以指向派生类的对象,可以将派生类的地址赋予基类的指针。如果要调用派生类的函数,该函数必须在基类中被声名为虚函数,随后在每个派生类中被重新定义B.虚函数关键词virtual表示该函数对不同的派生类可以有不同的版本;C. 虚函数在基类中定义,而不用在派生类中再次声名,即关键词只用在基类中出现即可,不用在派生类中再次出现;D. 基类中的虚函数可以被声名为:virtual void 虚函数()=0;E. 虚函数的目的是使得基类的指针可以指向派生类的成员,并可以执行派生类中的方法。F. 构造函数不能是虚构函数;G. 虚函数必须在类中定义,不能在类外定义;H. 基类的指针可以指向派生类的对象,但只有基类的指针指向派生类重定义的虚函数时才会发生多态;I. 父类指针(或引用)可以指向(或引用)子类对象。当通过父类的指针或引用调用子类的指针或引用调用成员函数时,如果这个函数在父类中被定义为虚函数,那么将通过动态绑定类调用子类中定义的函数。以次相反,如果这个函数在父类中没有定义为虚函数,那么通过父类指针(或引用)将只能调用父类中定义的函数,即使这个指针指向一个子类也是如此;J. 调用析构函数是为了释放由构造函数分配的内存空间。如果基类的析构函数是非虚的,则不能用指向派生类的指针调用派生类的析构函数,所以最好通过动态绑定,使用虚析构函数来有效地释放内存空间。一般来将,在所有作为基类的类中都提供一个虚析构函数是一个非常好的做法。39. 抽象类是包含一个或多个纯虚函数的类。抽象类用于提供接口而不会暴露任何实现细节。所以不能使用抽象类来创建对象,只能用作其他类的基类。但可以创建抽象类的指针。(抽象类不能创建对象,但可以创建指针)40. 关于基类与派生类的调用顺序:A. 基类构造函数的调用顺序与基类在派生类声名的顺序相同,最后调用派生类的构造函数;B. 析构函数的调用顺序与构造函数的调用顺序相反,首先调用派生类的析构函数,然后调用基类的析构函数;C. 构造函数的调用顺序:基类构造函数-内部类的构造函数-派生类的构造函数;析构函数的调用顺序:派生类的构造函数-内部类(或对象)的构造函数-派生类的构造函数;41. 派生类中如何调用基类的构造函数? 如下为一个例子:HourlyWorker(const char *s,double wage,double hours):Employee(s)如果是在模板中,注意书写格式:public: Derived(T1 x=0,T2 y=0):Base(x) /模板使用数据时,一定要使用数据类型转换 this-y=y; 42. 多态:多态是针对基类的指针而言,若想要基类的指针可以指向派生类的属性与方法,以便在需要时执行相应的功能,可以使用虚函数与抽象类。注意:只可以指向继承的属性与方法,不能指向派生类中自定义的属性与方法,除非通过下面的转换类型。如何使用基类的指针访问派生类自定义的属性与方法?可以将基类的指针转化成派生类的指针,这样经过转换后的基类指针就可以直接访问派生类自定义的指针了。如: B_class为基类,D_class为从B_class继承的派生类,show_B为B_class自定义的方法,p为基类指针,即有:(D_class *)p)-show_B();注意:如果通过基类的指针调用派生类的非虚继承方法,调用的仍是基类的方法,而不会调用派生类的方法。若想通过基类的指针调用派生类的继承的方法,可以在基类中定义为虚方法(函数)。43. 函数模板与类模板:A. 给类模板声名实例时,应指明类的类型。如:HR hr2(akenzhang,10.15);类名 实例名(参数列表) B. 函数模板与类模板的区别: 对于函数模板,未知数据类型是放在函数内的;而对于类模板,未知数据类型是放在类内的。44. 在类定义体外定义成员函数时, 若此成员函数中有模板参数存在, 则需在函数体外进行模板声明, 并且在函数名前的类名后缀上“”.如:template vector:vector(int i) /.template T&vector:operator(int i) /. 又如模板类的继承:template class Triangle:public Base:Base

温馨提示

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

评论

0/150

提交评论