C++primerplus读书笔记_第1页
C++primerplus读书笔记_第2页
C++primerplus读书笔记_第3页
C++primerplus读书笔记_第4页
C++primerplus读书笔记_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、第一章1、预处理器#include<iostream>将iostream文件内容添加到程序中。老式C头文件保留了扩展名.h,而C+头文件没有扩展名。(有些C头文件被转换为C+头文件,去掉扩展名,并在前面加c,如cmath)2、名称空间相当于Java中的package,using编译指令相当于Java中的import。头文件没有.h前缀时,类、函数和变量是C+编译器的标准组件,被放置在名称空间std中。3、类的本质类是用户定义的一种数据类型。类定义描述的是数据格式及其用法,而对象则是根据数据格式规范创建的实体。4、main()main()的返回值(退出值)是返回给操作系统。通常退出值

2、为0意味着程序运行成功。第二章5、OOP面向对象编程的本质是设计并扩展自己的数据类型,让类型和数据匹配。6、标识符以一个下划线开头的名称被保留给实现,作全局标识符;以两个下划线或下划线加大写字母的名称被保留给实现(编译器及其使用的资源)使用。(C+对名称长度没有限制)7、整型short至少16位;int至少和short一样;long至少32位,且至少和int一样长;long long至少64位,且至少和long一样长。8、字节字节通常指8位的内存单元,而C+中的字节依赖于实现。9、运算符运算符是内置的语言元素。sizeof运算符返回类型或变量的长度(字节)。所以,不同系统中sizeof( in

3、t )的返回值可能不同。10、头文件climits定义了各种表示类型限制的符号常量。如:#define INT_MAX 32767。(被设计为C可用的头文件,符号常量必须用#define编译指令定义)11、变量初始化函数内部定义的变量,应该在定义的时候进行初始化,否则它的值是不确定的,为被创建前相应的内存单元保存的值。(1)、int a = 1;/传统的C初始化(2)、int b(2);/C+的新方式(3)、int c = 3 或 int c3/C+的大括号初始化器用于任何类型(大括号内不包含任何东西时,变量的初始化为0)12、int计算机处理起来效率最高的长度。除非使用后缀或值太大,C+通常

4、将整形常量存储为int类型。13、wcha_t是整形类型,有足够的空间表示系统使用的最大扩展字符集。使用 iostream 中的 wcin 和 wcout 处理wcha_t流。可以通过前缀L来指示宽字符常量和宽字符串,如 wcha_t a = L'p'wcout << L"tall" << endl;(C+11新增类型 char16_t 和 char32_t ,都是无符号的,分别长16位和32位,使用前缀 u 表示前者,前缀 U 表示后者)14、boolC+将0解释为 false ,将非零解释为 true 。15、const创建常量时

5、最好马上赋值,如cont int a = 5;常量通常将首字母大写。16、浮点float至少32位;double至少48位,且不少于float;long double 至少和double一样多。这三种类型的指数范围至少是-37-37。(1)、cout.setf()可以控制输出格式,迫使cout使用定点表示法。因为cout通常会删除浮点后面的0,如3.3300000显示为3.33。(2)、浮点常量通常为double类型,通常用后缀f或F指定float类型,用后缀l或L指定long double类型。17、强制类型转换如:(long) thorn或long(thorn)强制类型转换不会修改thor

6、n本身,而是创建一个新的、指定类型的值。也可以这样:static_cast<long> (thorn),它比传统的强制类型转换更为严格。18、auto自动推断类型,关键字auto可以不指定变量的类型,编译器自动把变量的类型设置成与初始值相同,如 auto a = 100;不过,auto一般是用于处理复杂类型第四章19、数组(1)、声明数组的通用格式:typeName arrayNamearraySize,如 int a5;(编译器不会检查使用的下标是否有效。)(2)、如果没有初始化函数中定义的数组,其元素的值为以前驻留在该内存中的值。(与函数中的变量一样)(3)、sizeof 作用

7、与数组名时,得到的是整个数组中的字节数。作用于元素时,得到的是该元素的字节数。(4)、只有定义数组时才能初始化,之后就不行了。可以部分初始化,如:int a5 = 1,2,部分初始化时,编译器把其他元素设置为0。可以这样:int b = 1,2,3,4,5;  让编译器计算元素个数。(5)、使用列表初始化数组时,可以省略等号(=);大括号内不包含任何内容时,默认所有元素为0;列表初始化禁止缩窄转换。20、字符串字符串是存储在内存的连续字节中的一系列字符。(1)、C-风格的字符串以空字符结尾,其ASCII码为0,如:char dog7 = 'a','b'

8、,'c','d','e','f','0'注意,数组长度必须计算0'(2)、字符串常量,如:char cat = "cat"(注意!'S'代表字符常量,而"S"表示S'和0'两个字符组成的字符串,“S”实际表示的是字符串所在的内存地址)(3)、拼接字符串时,第一个字符串最后的0'会被第二个字符串的第一个字符取代。(4)、strlen()函数返回存储在数组中的字符串的长度,只包括可见的字符,不包括空字符。(5)、cin使用空白(空格

9、、制表符和换行符)来确定字符串的结束位置,所以它读取数组输入时,只读取第一个单词,并自动添加空字符。(6)、面向行的输入有getline()和get(),它们都通过换行符来确定输入结尾,不同的是,get()并不再读取并丢弃换行符。cin.getline(name,ArSize),将读取ArSize-1个字符到name数组中。对于get(),可以这样使用:cin.get(name,ArSize).get();(7)、读取空行时,get()将设置失效位;如果输入行包含的字符数比指定的多,getline()会设置失效位。后面的输入将被阻断。(8)、允许:char c = "hello wo

10、rld!"(9)、string类具有自动调整大小的功能,因此更为安全。(10)、strcpy(str1,str2)将str2复制给str1,strcat(str1,str2)将str2附加到str1的结尾。(11)、str1.size()和strlen(str1)的功能相同。前者是string类的一个方法,后者是一个常规函数。21、原始(raw)字符串原始字符串中,n不表示换行符,如:默认定界符 ( 和 )cout << R"(don't use "n" ,OK?)" << 'n' 输出:don&

11、#39;t use "n" ,OK?自定义定界符 +*( 和 )+*cout << R"+*("(don't use "n" ,OK?)")+*" << 'n' 输出:"(don't use "n" ,OK)"22、结构(1)、定义:struct  man char name20;double weight;int age; ;(2)、声明,允许省略关键字struct,如:man mike;(3)、初始化:ma

12、n mike "mike", 56.2, 22;(4)、使用成员运算符(.)来访问各个成员。(5)、同时定义结构和创建变量:struct  man char name20;double weight;int age; mike = "mike", 56.2, 22, jim ;(6)、还可以声明匿名结构:struct int x, int y point ;23、结构中的位字段指定占用特定位数的结构成员,如:struct my_bit unsigned int x : 4;bool  y : 1; ;24、外部声明函数外部的声明。C+

13、不提倡使用外部变量,提倡使用外部声明。25、共用体一种数据格式,能够存储不同的数据类型,但只能同时存储其中的一种类型,常用于节省内存。如:union id long long_id ;char char_id; ;(1)、由于共用体每次只能存储一个值,其长度为最大成员的长度。(2)、匿名共用体没有名称,其成员将成为位于相同地址处的变量,每次只有一个成员是当前成员。26、枚举另一种创建符号常量的方式,可以代替const。如:enum spectrum a , b , c , d , f ;(1)、默认情况下,a、b、c、d 、f 作为符号常量,对应0到4。(2)、对于枚举,只定义了赋值运算符,并

14、没有定义算术运算。(3)、只能将定义枚举时使用的枚举量赋给枚举变量。(4)、可以使用赋值运算符显式设置枚举量的值。如:enum bits first , zero = 0 , two = 200 ,three , four ;/这里three的值为201, first 的值为0(5)、枚举的取值范围。bits的最大值是202,大于它的最小的2的幂为256,所以bits的取值范围为0255(6)、通过强制类型转换,增加了可赋值给枚举变量的合法值,只要在取值范围内。如:bits b = bits(240);27、指针指针是一个变量,存储的是值的地址,而不是值本身。(1)、地址运算符(&)可

15、以获得变量的位置(存储地址)。(2)、指针,将地址看作指定的量,将值看作派生量。指针名表示地址。(3)、*运算符被称为间接值(解除引用)运算符。用于指针可以得到指针地址存储的值。(4)、声明:int * a;/ *运算符两边的空格是可选的int * b , c;/ 创建指针b和int变量c,每一个指针都需要一个*(5)、初始化:int * a = &b;/ 将指针a的值设为&b(6)、一定要在对指针使用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。(7)、将数字赋值给地址:int * pt = (int * ) 0x8000000;(8)、分配内存:int *

16、pn = new int;/从堆(heap)或只有存储区(free store)的内存区域分配内存。28、数组(1)、编译时给数组分配内存被称为静态联编,程序运行时选择数组长度被称为动态联编。(2)、创建动态数组:int * p = new int 10; / p为该元素第一个元素的地址(3)、释放数组:delete p;/ 只能释放new分配的内存;不能delete两次;对空指针delete安全;数组用delete 释放。(4)、不能使用sizeof运算符来确定动态分配的数组包含的字节数。(5)、使用数组:p0为第一个元素,p1是第二个。/ C+内部使用指针来处理数组,p1被看作 *(p+1

17、)(6)、p = p + 1;/ 指针变量加1后,增加的量为它指向的类型的字节数。(7)、多数情况下C+将数组名解释为数组第一个元素的地址。(8)、指针和数组名的区别:可以修改指针的值,而数组名是常量;对数组名使用sizeof得到数组的字节数,而对指针使用sizeof得到指针的长度。(9)、short tell10;cout << tell;/ 数组名本身为其第一个元素的地址,如:&tell0 ,即一个2字节内存块的地址。cout << &tell;/ 输出的是一个20字节内存块的地址。(10)、给cout提供一个字符的地址,它将从该字符开始打印,直到遇

18、到空字符为止。(11)、要打印一个指针的地址,必须把这个指针强转成另一种指针类型,如 (int *) p;29、使用new创建动态结构struct1 * s = new struct1;/ 此时,结构标识符是指针,所以不能使用成员运算符句点(.),/ 只能使用箭头成员运算符(->)访问成员或者使用(*s).price 来访问成员。30、自动存储、静态存储和动态存储(1)、函数内部定义的常规变量为自动变量,存储在栈中,后进先出(LIFO),程序执行中,不断增大缩小。为自动存储。(2)、在函数外面定义,或声明变量使用static关键字的变量为静态变量。静态存储是整个程序执行期都存在的变量。(

19、3)、使用new创建的变量为动态存储。new和delete管理类一个内存池,被称为free store 或 heap。(注意!栈中自动添加和删除机制使得占用的内存总是连续的,而new和delete可能导致只有存储区不连续)31、模板类vector类似string,也是一种动态数组,是使用new创建动态数组的替代品,自动使用new和delete管理内存。#include<vector>using namespace std;/ 包含头文件,vector位于std名称空间中vector<int> ele(10);/ 创建一个名为ele的vector对象,可存储10个类型为i

20、nt的元素。(注意,C+11中可用列表初始化。类型可以是变量)32、模板类array与数组一样,长度固定,使用栈存储,效率与数组相同,而更方便、安全。#include <array> using namespace std;array<int,5> arr;/ 名为 arr 的array对象,包含5个int元素。(注意,类型不能是变量!可用列表初始化)第五章1、for循环for(initialization; test-expression; update-expression) body/ test-expression 会被转换为bool,0为false,非零为tr

21、ue2、表达式表达式是值或值与运算符的组合。赋值表达式的值为其左侧成员的值,而赋值运算符是从右到左结合的。3、a+和+a(1)对于内置类型,两种执行效率相同。(2)若重载运算符,对于类而言,前缀将值加1,返回结果;后缀会复制一个副本,加1后返回副本。所以前缀比后缀效率高。4、逗号运算符(1)for循环中,将多个表达式合并为一个:i+, j+;(2)声明:int i , j;(3)逗号表达式先计算第一个表达式,再计算第二个表达式。逗号表达式的值是第二部分的值。(4)逗号表达式是优先级最低的表达式。5、strcmp()比较两个字符串。接受2个字符串地址A、B作为参数。AB相同返回0,A的字母顺序在

22、B之前,者返回负数,否则返回正数。(用引号括起的字符串常量是其地址。)6、clock()返回程序开始执行后所用的系统时间。这个值除以CLOCKS_PER_SEC可以得到秒数。7、类型别名#define AA char/ 用AA作为char的别名,所有的AA将被char替代或typedef AA char8、cincin.get()会忽略空格和换行符。发送给cin的输入会被缓冲。按下回车键,输入的内容才会被发送给程序。 cin.get(ch)会得到每个字符。其参数声明为引用类型,所以函数可以修改其参数的值。9、EOF很多PC编程环境都将Ctrl+Z视为模拟的EOF,检测到EOF之后,c

23、in将两位(eofbit和failbit)都设置为1。eof()和fail()用来查看是否被设置。所以循环等待输入的条件可以这样设置:while( cin.fail() = false ) 或 whle( !cin.fail() ) 或 while(cin) 或 while( cin.get(ch) )(通常,EOF被定义为-1)第六章10、运算符!运算符的优先级高于所有的关系运算符和算术运算符。逻辑AND运算符的优先级高于逻辑OR运算符。C+确保程序从左到右计算逻辑表达式。11、cctype字符函数库。如isalpha(ch)判断字符是不是字母,是字母就返回非零,否则返回0。12、文本IO使

24、用cin进行输入时,程序将输入看作一系列的字节,其中每个字节被解释为字符编码。第七章13、定义函数(1)、无返回值:void functionName(parameterList) (2)、有返回值:typeName functionName(parameterList) (注意!返回值的类型不能是数组,可以是其他任何类型)14、函数原型(1)、函数原型能极大降低程序出错的几率、提高效率。(2)、函数原型不要求提供变量名,有类型列表就足够了。(3)、括号为空与括号中使用void是等效的,不指定参数列表应使用省略号void haha(.); 15、函数和二维数组指针的类型是指把指针声明

25、语句中的指针名字去掉所剩下的部分对于:int data34 = 1,2,3,4,5,6,7,8,4,3,2,1;int total = sum(data,3);sum的原型是什么?(1)、原型是:int sum ( int (*a) 4 , int size);所以 int(*)4即,将这个指针指向int4。所以data的类型指向由4个int组成的数组的指针所以 int *a4 的类型是int * 4,这个指针指向int,总共有4个,即它是4个指向int指针组成的数组。(2)、函数定义:int sum (int a4 ,int size);a r c = *( *( a + r ) + c);

26、16、递归每个递归调用都创建自己的一套变量。(注意!C+不允许main()调用自己。)17、函数指针(1)、函数地址:函数的地址是存储其机器语言代码的内存的开始地址。如果think()是一个函数,那么think就是它的地址。(2)、声明指针函数:函数:double pam(int);指针函数为: double (*pf)(int) = pam;/ pf是一个指向函数的指针。第八章18、编译过程编译过程的最终产品是可执行程序(由一组机器语言指令组成)。运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。计算机随后逐步执行这些指令。19、函数调用执行到函数调用指令时,

27、程序将在函数调用后,立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入寄存器),然后跳回到地址被保存的指令处。20、内联函数编译器使用相应的函数代码代替函数调用。函数声明前加上关键字inline,函数定义前加上关键字inline。通常将省略原型,原型处直接定义。21、引用变量主要用途是作函数的参数,函数将使用原始数据,而不是其副本。(1)、创建:int rats ;int & a = rats;(2)、引用必须在声明时初始化,不能先声明再初始化。也不能通过赋值来设置引用。(3)、引用一旦与某个变量关联起来,就一直效忠。(4)

28、、若引用参数是const,若实参类型正确却不是左值 或 类型不正确却可以转换成正确类型 时,将创建临时变量。(5)、返回引用时,应避免返回函数终止时不再存在的内存单元引用。22、左值(1)、可被引用的数据对象。如变量、数组元素、结构成员、引用和解除引用的指针等。(2)、非左值,包括字面常量和包含多项的表达式。(3)、常规变量属于可修改的左值,const变量属于不可修改的左值。23、右值引用可指向右值的引用,使用&&声明。如:double & rref = std:sqrt ( 26.00 ) ;24、默认参数通过函数原型设置函数参数默认值。(1)、必须从右到左添加默认值

29、。(2)、实参按照从左到右的顺序依次被赋值给形参,而不能跳过任何参数。25、函数重载参数列表(特征标)不同,而函数名相同的函数。(1)、类型引用和类型本身被视为同一个特征标。(2)、不能把const变量赋值给非const形参26、名称修饰根据函数原型中指定的形参类型对每个函数名进行加密,用来跟踪每一个重载函数。27、函数模板相当于Java中的泛型(1)、声明:template <typename T> void Swap(T &a, T &b);/ typeName 可用 class 替换(2)、函数模板不能缩短可执行程序,最终的代码不包含任何模板,只包含了为程序生

30、成的实际函数。(3)、一般将模板放在头文件中。28、显式具体化具体化的函数定义,匹配时,使用它而不是模板。(1)、非模板函数:void swap( job &, job &);(2)、模板函数:template <typeName T> void swap( T & ,T &);(3)、显式具体化:template<> void swap<job>( job &, job &);/ swap<job>中job是可选的(4)、编译器在选择原型时:非模板函数>显式具体化>模板函数(5)、显式

31、实例化:template void swap<int> ( int, int);/ template后无<>(6)、隐式实例化:对于模板函数,编译器会通过对这个模板含数的引用生成一个含数的实例,这通常叫隐式实例化29、decltypedecltype( expression ) var;/ 让var的类型与expression一样。(注意!若expression是一个函数调用,var的类型与其返回值相同。若expression是一个左值,var为指向其类型的引用)30、后置返回类型给函数指定返回类型。如:template<class T1, class T2>

32、;  auto gt( T1 x, T2 y) -> decltype( x + y ) .return x + y ;第九章1、C+程序的组成(1)、头文件:包含结构声明和使用这些结构的原型。(2)、源代码文件:包含与结构有关的函数的代码。(3)、源代码文件:包含调用与结构有关的函数的代码。2、头文件(1)、常包含的内容:函数原型;#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。(2)、若文件名包含在尖括号中,编译器将在存储标准头文件的主机系统的文件系统中查找。(3)、若文件名包含在双引号中,编译器首先查找当前的工作目录或源代码目录,再在标准位

33、置查找。(4)、同一个文件中只能将同一个头文件包含一次。用来忽略除第一次包含之外的所有内容。头文件coordin.h中,常使用:#ifndef COORDIN_H_define  COORDIN_H_/*头文件内容*/#endif3、编译过程(1)、命令:CC file1.cpp file2.cpp(2)、预处理器将包含的文件(头文件之类的)和源代码合并。生成临时文件temp1.cpp和temp2.cpp(3)、编译器创建每个源代码文件的目标代码文件:file1.o和file2.o(4)、链接程序将目标代码文件、库代码和启动代码合并,生成可执行文件:a.out(注意!链接编译模块的时

34、候,请确保所有对象文件和库都是同一个编译器生成的。)4、存储持续性自动存储持续性、静态存储持续性、线程存储持续性(C+11)、动态存储持续性。5、栈栈中的数据在相邻的内存单元中(1)、使用2个指针跟踪栈,一个指向栈底(栈的开始位置),一个指向栈顶(下一个可用内存单元)(2)、新值没有被删除,但不再被标记。6、链接性(1)、外部链接性,可在其他文件中访问。如:函数外,不使用staitic定义的变量(2)、内部链接性,只能在当前文件中访问。如:函数外,使用static定义的变量(3)、无链接性,只能在当前函数或代码块中访问。如:代码块中定义的变量(注意!所有的静态变量都会首先被零初始化,然后再选择

35、动态、静态初始化。)7、变量声明单定义规则 -> 变量只能有一次定义(1)、定义声明(定义):给变量分配存储空间。(2)、引用声明(声明):不分配空间,引用已有的变量。使用关键字extern,且不进行初始化。(注意!要在多个文件中使用外部变量,应在一个文件中定义,其他文件中使用extern声明。)(使用extern可以覆盖变量默认的内部链接性,使其变成外部的)8、const char * const a12 = “a”,"b","c". ;/ 第一个const防止字符串被修改,第二个const确保数组中每个指针指向它最初指向的字符串。 这

36、个指针的类型是 char * 12,即char类型的指针的数组,数组大小为12。第一个const修饰char *,第二个const修饰a12。所以。9、说明符和限定符(1)、关键字thread_local:指出变量的持续性和其所属的持续性相同。(2)、const:内存被初始化后,程序不能对它修改。const全局变量的链接性为内部的。(3)、volatile:每次都取值,不允许取值优化。(4)、mutable:即使结构(或类)变量为const,某个被mutable修饰的成员也可以被修改。10、函数的链接性所有函数的存储持续性都自动为静态的,链接性是外部的。可以使用static在原型和定义中将链接

37、性设置为内部的。11、使用new初始化 int a = new int(5);/设置a的值为5. 比较之下,大括号初始化更方便和通用。(new找不到请求的内存量、失败时,将引发异常std:bad_alloc)(1)、运算符new实际上调用void * operator new ( std:size_t );(2)、运算符new 实际上调用void * operator new ( std:size_t );/这里std:size_t实际上是一个别名typedef,对应合适的整型。12、定位new运算符能指定要使用的内存位置。不跟踪哪些内存单元未使用,也不查找未使用的内存块。(1)如:#incl

38、ude <new>char buffer50;struct1 * s = new (buffer) struct1;/从buffer中分配struct1大小的内存。13、名称空间相当于Java中的package,不过也有很多不同。(1)、名称空间可以是全局的,也可以位于另一个名称空间中。(2)、默认情况下,名称空间中声明的名称的链接性是外部的。(3)、全局名称空间,对应文件级声明区域,全局变量位于此处。(4)、名称空间是开放的,即可以将某些名称添加到已有的名称空间中,如:namespace qsk char * name(const char* ); /将这个名称添加到qsk中。(

39、5)、通过作用域运算符来限定各名称,如:cout << qsk:name << endl;14、using声明和using编译指令(1)、using声明使得特定的标识符可用。(无须限定名称,直接使用)如:using std:cout;(2)、using编译指令使得整个名称空间可用。(多了一个namespace)如:using namespace std;(注意,不要在头文件中使用using编译指令。对于using声明,首选将其作用域设置为局部而不是全局。) 第十章15、类(1)、类成员可以是数据也可以是函数。类声明时,用访问控制符来修饰。(2)、定义成员函数时

40、,使用作用域解析运算符(:)来表示函数所属的类。如void Stock:update(double price)(它可以访问类的私有成员)(3)、定义位于类声明中的函数,自动成为内联函数。(4)、也可以在类外使函数成为内联函数,只需要在类实现中使用 inline 限定符,如:inline void Stock:update(double price)(5)、创建对象,如:Stock a,b;也可以使用new为对象分配存储空间。如:Stock a = new Stock;(6)、通过成员运算符来使用成员函数,如:a.show();(7)、所创建的每一个对象都有自己的存储空间,用于存储其内部变量和类成员;所有对象公用一组类方法。 16、访问控制private、public、protected不必在类声明中使用关键字private,它是类的默认访问控制。(注意!C+中,结构具有与类相同的特性,不过结构的默认访问类型是public。)17、类设计(1)、提供类声明。(2)、实现类成员函数。通常单独提供函数定义,通过(:)来制定函数属于哪个类。18、类的构造函数专门用于构造新对象、将值赋予它们的数据成员。(1)、构造函数的原型和函数头没有返回值

温馨提示

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

评论

0/150

提交评论