面向对象编程_第1页
面向对象编程_第2页
面向对象编程_第3页
面向对象编程_第4页
面向对象编程_第5页
已阅读5页,还剩152页未读 继续免费阅读

下载本文档

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

文档简介

面向对象编程第一页,共一百五十七页,2022年,8月28日授课教师:郝应光邮件地址:2第二页,共一百五十七页,2022年,8月28日3课程考核及成绩构成本课程的成绩由期末考试和平时作业2部分构成平时成绩由:期末大作业+平时随堂作业构成具体比例待定第三页,共一百五十七页,2022年,8月28日4主要内容面向对象技术C++语法概要(6)MFC框架基础详解(15)MFC文档/视图结构详解(9)几个应用程序开发实例(6)VisualC++应用程序设计(12)多线程程序设计(3)TCP/IP网络程序设计(3)动态连接库程序设计(3)数据库程序设计(3)第四页,共一百五十七页,2022年,8月28日5第一部分面向对象技术面向对象概念UML第五页,共一百五十七页,2022年,8月28日6第二部分C++语法概要类和对象静态数据成员及成员函数对象与指针操作符重载和友员继承多态性第六页,共一百五十七页,2022年,8月28日7第三部分MFC框架基础VisualC++集成开发环境简介Windows操作系统下的应用程序(SDK、MFC)用Appwizard开发一个MFC程序事件处理、映射模式及滚动视图GDI、颜色及字体对话框及控件ActiveX及IE公用控件位图第七页,共一百五十七页,2022年,8月28日第四部分MFC文档视图结构菜单、键盘及命令处理工具栏及状态栏文档和视图分离SDI及MDI文档的读写打印及打印予览拆分窗口及多视图8第八页,共一百五十七页,2022年,8月28日9第五部分MFC程序设计的其他方面多线程程序设计数据库程序设计动态连接库程序设计TCP/IP网络程序设计第九页,共一百五十七页,2022年,8月28日10主要参考书面向对象建模与设计,Rumbaugh,电力出版社面向对象分析与设计,GradyBooch,机械工业出版社ThinkinginC++,BruceEckelC++Primer,StanleyBLippman,中国电力出版社C++语言及其程序设计教程,张国峰,电子工业出版社深入浅出MFC,2Ed,侯俊杰(侯杰),松岗。VisualC++技术内幕,Microsoft,北京希望电子出版社第十页,共一百五十七页,2022年,8月28日11主要网络资源(microsoft)(世界最大开源代码库)第十一页,共一百五十七页,2022年,8月28日第一部分面向对象技术12第十二页,共一百五十七页,2022年,8月28日软件开发软件开发的过程就是程序员对客观世界问题域形式化的过程第十三页,共一百五十七页,2022年,8月28日计算机开发语言机器语言、汇编语言、高级语言,高级语言可能有几千种计算机语言都是某种程度的形式语言第十四页,共一百五十七页,2022年,8月28日计算机高级语言的历史由美国科学家巴科斯设计,1956年在IBM计算机上实现的FORTRAN。70年代以来的PASCAL80年代,C语言80年代后期,C++90年代以来,语言要OO而且Visual,更要Web,Java快速推广。第十五页,共一百五十七页,2022年,8月28日PO方法:现实世界→流程图(变量,函数)→PO语言→执行求解OO方法:现实世界→类图(对象,方法)→OO语言→执行求解OO作为一种思想及编程语言,为软件开发的整个过程:分析、设计到coding,提供了一个完整解决方案。从PO到OO第十六页,共一百五十七页,2022年,8月28日17面向过程思想问题域(Domain)以问题域的系统流程为中心分析Sub1Sub2Subn….各子流程实现----函数化Func1Func2Funcn….根据系统的流程组建软件,通过函数的调用实现第十七页,共一百五十七页,2022年,8月28日18面向对象思想问题域(Domain)以问题域中的事物为中心思考问题Object1Object2Objectn….对象归类----抽象化Class1Class2Classn….类实例化:定义对象,构建系统,形成解决方案第十八页,共一百五十七页,2022年,8月28日19面向对象的基本概念Coad和Yourdon给出了一个定义:“面向对象=对象+类+继承+通信”。如果一个软件系统是使用这样4个概念设计和实现的,则我们认为这个软件系统是面向对象的。第十九页,共一百五十七页,2022年,8月28日20对象对象是面向对象开发模式的基本成份。每个对象可用它本身的一组属性和它可以执行的一组操作来定义。属性一般只能通过执行对象的操作来改变。操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。第二十页,共一百五十七页,2022年,8月28日21消息(Message)消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。一个对象接收到消息则调用消息中指定的方法,并将形式参数与参数表中相应的值结合起来。第二十一页,共一百五十七页,2022年,8月28日22类类是一组具有相同数据结构和相同操作的对象的集合。类的定义包括一组数据属性和在数据上的一组合法操作。类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。第二十二页,共一百五十七页,2022年,8月28日23同一个类的每个对象都是类的实例(Instance),它们都可使用类中提供的函数。对象的状态则包含在它的实例变量,即实例的属性中。第二十三页,共一百五十七页,2022年,8月28日24继承(Inheritance)继承是使用已存在的定义做为基础建立新定义的技术。新类的定义是基础类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。既存类可当做基类来引用,则新类相应地可当做派生类来引用。第二十四页,共一百五十七页,2022年,8月28日25面向对象方法学面向对象分析OOA面向对象设计OOD面向对象实现OOP第二十五页,共一百五十七页,2022年,8月28日26面向对象技术回顾面向对象技术是许多人历经多年研究积累的产物。类的概念,是面向对象的重要组成部分。Smalltalk,提出许多面向对象技术的核心概念,如:消息和继承。Dijkstra的软件正确性理念,提出了用抽象层构造软件的观点。Ada语言,提出了一般性和包两个概念。C++语言,最广泛使用的面向对象的语言。Java语言,健壮的、可移植的、流行的面向对象语言。第二十六页,共一百五十七页,2022年,8月28日27UML的产生1988年到1992年是面向对象方法学蓬勃发展的时期,人们从各自的经历和软件开发的经验提出了各种面向对象的开发方法,代表的有:SallyShlaer和SteveMellor以信息模型化方法作为基础,并为目标系统增设了状态模型和过程模型;PeterCoad和EdYourdon则在信息模型化、面向对象的程序设计语言和基于知识的系统的基础上,建立了他们的OOA和OOD,主要工具是类与对象图、对象状态图和服务图;HP公司的Fusion开发方法。第二十七页,共一百五十七页,2022年,8月28日28JimRumbaughGradyBoochIvarJacobson第二十八页,共一百五十七页,2022年,8月28日29OOA和OOD是面向对象方法学中重要的部分,UML是具体的方法OOP涉及到具体的编程语言,C++开发要使用合适的工具IDE:VisualC++第二十九页,共一百五十七页,2022年,8月28日面向对象的特点30封装(Encapsulation)通过定义类实现继承(Inheritance)通过派生新类实现多态性(Morphism)虚拟函数实现第三十页,共一百五十七页,2022年,8月28日XO(X?-Oriented)SO(Service-Oriented)OO(对象、类)PO(过程、函数、变量)OO之后是什么?第三十一页,共一百五十七页,2022年,8月28日32第二部分C++语法概要第一章C++基础第三十二页,共一百五十七页,2022年,8月28日331.1C++的起源和特点C语言1972年,由DennisRitchie设计,可以认为是最优影响力的发明之一。为改进C语言,“带类的C”,1983命名为C++对C的类型系统改进和扩充(更安全)支持面向对象C++保持与C兼容(快速普及)C++不是纯粹的面向对象的语言第三十三页,共一百五十七页,2022年,8月28日341.2程序的编译过程第三十四页,共一百五十七页,2022年,8月28日351.3C++的词法记号关键字各种常量操作符标识符分隔符第三十五页,共一百五十七页,2022年,8月28日361.4C++程序的结构第三十六页,共一百五十七页,2022年,8月28日37注释输入和输出函数变量(对象)符号常量表达式语句第三十七页,共一百五十七页,2022年,8月28日381.5C++的基本数据类型第三十八页,共一百五十七页,2022年,8月28日391.7对象声明基本语法如下:数据类型 标识符1,标识符2,。。。标识符n;初始化数据类型 标识符1(初始值1),标识符2(初始值2),。。。标识符n(初始值n);数据类型 标识符1=初始值1,标识符2=初始值2,。。。标识符n=初始值n;赋值I=10;第三十九页,共一百五十七页,2022年,8月28日401.6常量整数常量浮点常量字符常量字符串常量布尔常量第四十页,共一百五十七页,2022年,8月28日411.8枚举类型定义:通过枚举一个类型的值域来定义一个数据类型,值域是通过在枚举声明时所指定的一组文字量(又称枚举常量)指定的。语法形式:enum标识符{标识符1,标识符2,标识符3,。。。标识符n};第四十一页,共一百五十七页,2022年,8月28日421.9表达式表达式由操作数和操作符组成,操作符分:算术操作符:+、-、*、/、%、++、--关系操作符:>、<、==、>=、<=、!=逻辑操作符:&&、||、!逗号表达式:?:sizeof操作符:sizeof位操作符:&、|、~赋值操作符:=第四十二页,共一百五十七页,2022年,8月28日431.10表达式中的类型强制隐含地从一种类型向另一种类型的值的映射。赋值类型强制右边的表达式类型映射成左值的类型。强制类型转换static_cast<T>(E)T(E)(T)E第四十三页,共一百五十七页,2022年,8月28日44第二章C++程序的基本控制结构顺序结构表达式语句空语句块语句选择结构循环结构第四十四页,共一百五十七页,2022年,8月28日452.1选择结构ifif-----else及其嵌套switch~case第四十五页,共一百五十七页,2022年,8月28日462.2循环结构whiledo~whilefor第四十六页,共一百五十七页,2022年,8月28日47嵌套循环循环是可以嵌套的第四十七页,共一百五十七页,2022年,8月28日482.3辅助控制语句gotobreakcontinue第四十八页,共一百五十七页,2022年,8月28日49第三章函数第四十九页,共一百五十七页,2022年,8月28日503.1函数的基本概念完成特定功能的一段代码具有合法的名称具有一定返回类型可以多次调用基本形式:返回类型函数名(形式参数1, 形式参数2,。。。,形式参数n){

函数体;}第五十页,共一百五十七页,2022年,8月28日513.2参数的传递值调用地址调用引用调用参数的求值顺序第五十一页,共一百五十七页,2022年,8月28日523.3重载具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。第五十二页,共一百五十七页,2022年,8月28日533.4带缺省参数值的函数函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。例:voidfun(intx,inty=0)voidfun(intx)第五十三页,共一百五十七页,2022年,8月28日54第四章类和对象4.1类的结构C++的类是对象的抽象数据成员。成员函数。C++类的说明第二部分C++语法概要第五十四页,共一百五十七页,2022年,8月28日55举例:4.1类的结构(外部说明)第五十五页,共一百五十七页,2022年,8月28日56访问控制描述符public后声明的是公有数据成员和成员函数,可被任何程序单元引用。private后声明的是私有数据成员和成员函数,仅可被类内部引用。public和private出现的顺序和次数是任意的。4.1类的结构(外部说明)第五十六页,共一百五十七页,2022年,8月28日57类成员函数的实现4.1类的结构(内部实现)举例第五十七页,共一百五十七页,2022年,8月28日584.2类的实例化--对象的实现一般语法:类标识符对象标识符;可以声明多个对象,对象之间代码共享,数据独立。可使用对象名引用对象的公有成员函数。方法如下:对象名.成员函数名(参数列表);第五十八页,共一百五十七页,2022年,8月28日594.2类的实例化--对象的实现成员函数所操作的数据成员是该类的某个对象的数据成员。第五十九页,共一百五十七页,2022年,8月28日60举例4.2类的实例化--对象的实现第六十页,共一百五十七页,2022年,8月28日614.3构造函数和析构函数构造函数的作用是在对象被创建时使用特定的值构造对象(初始化)。析构函数的作用是在对象被删除时做一些清理工作。构造函数与类同名。析构函数是类名前加~两者无返回类型,析构函数无参数。第六十一页,共一百五十七页,2022年,8月28日624.3构造函数和析构函数举例第六十二页,共一百五十七页,2022年,8月28日634.3构造函数和析构函数第六十三页,共一百五十七页,2022年,8月28日644.3构造函数和析构函数第六十四页,共一百五十七页,2022年,8月28日654.4成员函数的内联实现函数体放在类体内。函数体放在类体外,使用inline关键字。第六十五页,共一百五十七页,2022年,8月28日664.4成员函数的内联实现第六十六页,共一百五十七页,2022年,8月28日674.5带缺省参数值的成员函数和成员函数重载#include<iostream.h>classLocation{public: Location(intx=0,inty=0); voidMove(intx=5,inty=5); voidValueX(intx); intValueX(); voidValueY(inty); intValueY();private: voidSet(intx,inty); intX,Y;};第六十七页,共一百五十七页,2022年,8月28日684.5带缺省参数值的成员函数和成员函数重载Location::Location(intx,inty){Set(x,y);}voidLocation::Move(intx,inty){Set(x,y);}voidLocation::ValueX(intval){X=val;}intLocation::ValueX(){returnX;}voidLocation::ValueY(intval){Y=val;}intLocation::ValueY(){returnY;}voidLocation::Set(intx,inty){X=x;Y=y;}第六十八页,共一百五十七页,2022年,8月28日694.5带缺省参数值的成员函数和成员函数重载intmain(){ LocationA,B;//LocationA(0,0),B(0,0)A.Move();//A.X和A.Y被设为5A.ValueX(15);//A.X=15cout<<A.ValueX()<<A.ValueY()<<endl;B.Move(6,2);//B.X=6,B.Y=2B.ValueY(4);cout<<B.ValueX()<<B.ValueY()<<endl;return0;}第六十九页,共一百五十七页,2022年,8月28日70第五章作用域、生存期和可见性第七十页,共一百五十七页,2022年,8月28日715.1作用域及可见性一个标识符的有效区域。分为:函数原型作用域、块作用域、类作用域、文件作用域。第七十一页,共一百五十七页,2022年,8月28日72函数原型作用域函数原型中所作的参数声明在该作用域,始于左括号,结束于右括号。第七十二页,共一百五十七页,2022年,8月28日73块作用域块作用域由一对花括号定义。(局部作用域)第七十三页,共一百五十七页,2022年,8月28日74块作用域第七十四页,共一百五十七页,2022年,8月28日75类作用域第七十五页,共一百五十七页,2022年,8月28日76文件作用域第七十六页,共一百五十七页,2022年,8月28日77可见性标识符是否可以引用。在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。C++中,标识符必须先声明后引用,在同一作用域中不能声明同样的标识符。第七十七页,共一百五十七页,2022年,8月28日78可见性举例第七十八页,共一百五十七页,2022年,8月28日795.2对象的生存期静态生存期与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变文件作用域或用static指定。若未显式指定初始值,为零。动态生存期在函数内部(块作用域)声明的对象是动态生存期。若未显式指定初始值,为任意值。第七十九页,共一百五十七页,2022年,8月28日80对象的生存期举例第八十页,共一百五十七页,2022年,8月28日815.3静态成员函数和静态数据成员第八十一页,共一百五十七页,2022年,8月28日82数据共享的方法数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。数据存储在全局对象中,通过全局对象进行数据交换。封装在类中全局对象存在的问题可见性无限制不能保证操作的合法性解决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。第八十二页,共一百五十七页,2022年,8月28日83举例第八十三页,共一百五十七页,2022年,8月28日84举例第八十四页,共一百五十七页,2022年,8月28日85举例第八十五页,共一百五十七页,2022年,8月28日86举例第八十六页,共一百五十七页,2022年,8月28日87举例第八十七页,共一百五十七页,2022年,8月28日88第六章对象与指针第八十八页,共一百五十七页,2022年,8月28日896.1指针指针:对象的地址指针对象:存放指针的对象声明指针对象的语法:T*标识符;int*pointer;一个指针对象被赋值为一个对象的地址后,称指针指向对象。第八十九页,共一百五十七页,2022年,8月28日90为指针对象引入的两种操作&-----取地址操作*-----目标操作第九十页,共一百五十七页,2022年,8月28日91第九十一页,共一百五十七页,2022年,8月28日92第九十二页,共一百五十七页,2022年,8月28日93第九十三页,共一百五十七页,2022年,8月28日94第九十四页,共一百五十七页,2022年,8月28日956.2数组和指针数组:一组类型相同的对象声明语法:类型 标识符[元素个数];数组元素可以用下标引用数组名[index];数组元素也可以用指针引用第九十五页,共一百五十七页,2022年,8月28日96数组和指针通过指针引用数组元素定义指针对象数组的地址赋值给指针对象。指针引用数组元素的方法*(pointer+n)pointer[n]第九十六页,共一百五十七页,2022年,8月28日97对象数组没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。第九十七页,共一百五十七页,2022年,8月28日98举例第九十八页,共一百五十七页,2022年,8月28日996.3引用是标识对象的一种机制(是对象的一个别名)一般用作参数类型、函数返回类型。一般语法如下:基本类型&标识符一个引用不是独立的对象,只是对另一个对象的引用。基本类型&标识符=对象;第九十九页,共一百五十七页,2022年,8月28日100第一百页,共一百五十七页,2022年,8月28日101第一百零一页,共一百五十七页,2022年,8月28日102栈对象与堆对象在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。创建语法如下:T*ptr=newT(初始值列表);删除语法如下:deleteptr;数组对象的创建int*ptr=newint[10];数组对象的删除delete[]ptr;第一百零二页,共一百五十七页,2022年,8月28日103第一百零三页,共一百五十七页,2022年,8月28日104第一百零四页,共一百五十七页,2022年,8月28日105第一百零五页,共一百五十七页,2022年,8月28日1066.4指针数组数组元素的类型是指针,这样的数组称指针数组。语法:T*标识符[元素个数];第一百零六页,共一百五十七页,2022年,8月28日107多维数组与指针多维数组可以解释为其元素是多维数组的一维数组。第一百零七页,共一百五十七页,2022年,8月28日1086.5this指针一个成员函数被调用时,被自动传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。第一百零八页,共一百五十七页,2022年,8月28日1096.6具有子对象的类类型用内部包含子对象的类实现复杂的类子对象的初始化第一百零九页,共一百五十七页,2022年,8月28日110第一百一十页,共一百五十七页,2022年,8月28日111第一百一十一页,共一百五十七页,2022年,8月28日112第一百一十二页,共一百五十七页,2022年,8月28日113第七章操作符重载当使用操作符来表达对对象的某个操作时,可以将操作符函数声明为类的成员函数或类的友员函数。操作符的参数个数、优先级、结合性和使用语法是由C++规定的,不能被改变。重载操作符的形参不能具有缺省值。重载操作符的返回值类型任意,但最好不是void。第一百一十三页,共一百五十七页,2022年,8月28日1147.1重载为类的成员函数第一百一十四页,共一百五十七页,2022年,8月28日115重载为类的成员函数第一百一十五页,共一百五十七页,2022年,8月28日116重载为类的成员函数第一百一十六页,共一百五十七页,2022年,8月28日117重载为类的成员函数第一百一十七页,共一百五十七页,2022年,8月28日1187.2重载为类的友元函数第一百一十八页,共一百五十七页,2022年,8月28日119重载为类的友元函数第一百一十九页,共一百五十七页,2022年,8月28日120重载为类的友元函数第一百二十页,共一百五十七页,2022年,8月28日121重载为类的友元函数第一百二十一页,共一百五十七页,2022年,8月28日1227.3两种方法的比较一元函数最好重载为成员函数二元函数一般重载为友元函数27.5+x赋值操作符只能重载为成员函数27.5=x++和--操作符有两种形式,一般被重载为成员函数其中后缀操作重载后带有一个整型参数。第一百二十二页,共一百五十七页,2022年,8月28日123两种方法的比较下标操作符只能被重载为成员函数函数调用操作符可以看作是下标操作符的扩展第一百二十三页,共一百五十七页,2022年,8月28日124第八章继承与多态性通过已有的类进行扩展产生新类的过程产生的新类称派生类产生派生类的类称基类或父类。从一个基类派生称单基继承,从多个基类派生称多基继承。第一百二十四页,共一百五十七页,2022年,8月28日125MouseScreenDeviceKeyboardTreeAppleTreeFruit第一百二十五页,共一百五十七页,2022年,8月28日1268.1继承第一百二十六页,共一百五十七页,2022年,8月28日127访问控制访问控制用于控制基类中声明的名字在多大的范围内能够被派生类的用户访问访问控制有三种public,protected,private基类模块派生类模块间接派生类模块其他程序模块第一百二十七页,共一百五十七页,2022年,8月28日128第一百二十八页,共一百五十七页,2022年,8月28日129公有继承第一百二十九页,共一百五十七页,2022年,8月28日130私有继承第一百三十页,共一百五十七页,2022年,8月28日131在派生类中访问基类成员第一百三十一页,共一百五十七页,2022年,8月28日132保护的成员对V模块是public对H模块是private第一百三十二页,共一百五十七页,2022年,8月28日133多继承可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。第一百三十三页,共一百五十七页,2022年,8月28日1348.2构造函数和析构函数派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。一般形式如下:C::C(参数表0):C1(参数表1),C2(参数表2),…,Cn(参数表n){…}第一百三十四页,共一百五十七页,2022年,8月28日135构造函数和析构函数如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。构造对象时,先执行基类的构造函数,然后执行派生类的构造函数。析构时则相反。多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。第一百三十五页,共一百五十七页,2022年,8月28日136构造函数和析构函数第一百三十六页,共一百五十七页,2022年,8月28日137构造函数和析构函数第一百三十七页,共一百五十七页,2022年,8月28日138构造函数和析构函数第一百三十八页,共一百五十七页,2022年,8月28日1398.3二义性如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。解决二义性的办法是加类限定符。第一百三十九页,共一百五十七页,2022年,8月28日140二义性第一百四十页,共一百五十七页,2022年,8月28日141二义性如果一个派生类是从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的标识符进行访问时可能产生二义性。

温馨提示

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

评论

0/150

提交评论