C++课件 C++_第八章_第1页
C++课件 C++_第八章_第2页
C++课件 C++_第八章_第3页
C++课件 C++_第八章_第4页
C++课件 C++_第八章_第5页
已阅读5页,还剩104页未读 继续免费阅读

下载本文档

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

文档简介

1,第8章 类和对象,8.1 类 8.2 对象的定义和引用 8.3 构造函数 8.4 析构函数 8.5 组合类 8.6 对象数组与对象指针 8.7 静态成员 8.8 友元 8.9 共享数据的保护,2,8.1类,8.1.1 类的声明 类声明的形式如下: class 类名 private: 私有数据成员和成员函数 protected: 保护数据成员和成员函数 public: 公有数据成员和成员函数 ;,class Record/图书类 private: char bookname20; /表示图书的名称 int number; /表示图书号 public: void regist(char *a,int b); /成员函数regist void show( ); /成员函数show ;,3,类声明的内容 数据:声明数据成员的数据类型、名字、以及访问权限。 函数:定义成员函数及对它们的访问权限。可以在类内定义成员函数,也可以在类外定义成员函数。,4,8.1.2 类成员的访问控制 private(默认) protected public 三种访问控制的含义(理解) 类声明时注意 分号不能丢 访问控制声名顺序随意 成员不能用auto等修饰 成员函数的定义类内和类外均可 数据成员的初始化,5,/ 一个简单的类声明例子 #include class CMyClass /声明类名为CMyClass private: /声明私有成员 int m_i; /声明m_i的数据类型为整型 public: /声明公有成员 void set(int a); /声明成员函数set()的原型 int get( ); /声明成员函数geti()的原型 ; void CMyClass:set(int a)/定义成员函数seti() m_i=a; int CMyClass:get( )/定义成员函数geti() return m_i; ,6,class CTest public: int m_x; private: int m_y; protected: int m_z; public: int GetX(); private: int GetY(); protected: ;,/分辨对错 void main( ) CTest t1; t1.m_x+; t1.m_y+; t1.m_z=0; int a = t1.GetX(); int b = t1.GetY(); ,7,class和struct的区别 8.1.3 类的成员函数 1.成员函数的目的? 2.成员函数定义方式一:(常用形式) 在类声明中给出成员函数原型的说明,而成员函数的定义则在类的外部完成。其一般形式是: 返回类型 类名函数明(参数表) 函数体 ,8,#include class point private: int x,y; public: void setpoint(int xx, int yy); /声明setpoint()的原型 int getx( ); /声明成员函数getx()的函数原型 int gety( ); /声明成员函数gety的函数原型 ;,9,void point:setpoint(int xx, int yy) /定义函数setpoint x=xx; y=yy; int point:getx( ) /定义成员函数getx return x; int point:gety( ) /定义成员函数gety return y; ,10,用这种方法定义成员函数应注意以下事项: 在所定义的函数名前必须缀上类名,类名与函数名之间必须加上作用域运算符“:”,例如point: 在类内只是声明成员函数的函数原型时,类外是实际的定义,所以类内函数参数可以不指定名字 定义成员函数时,其返回值类型必须要与函数原型说明中的返回类型一致。,11,成员函数定义方式二(内联函数): inline 返回类型 函数名(函数参数) 函数体的具体实现 inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,内联函数不能是直接或间接调用自己。 内联函数的声明有显示声明和隐式声明(在类的内部定义成员函数)两种形式。,12,8.2对象的定义和引用,8.2.1 对象的定义 对象的定义格式: 类名 对象名; point op1,op2; 定义了类point的两个对象op1,op2,即opt1和opt2在内存空间中确确实实存在。,13,8.2.2对象的引用 对象的引用是指对象成员(数据成员和成员函数)的引用,其思想和结构体类似定义一个结构体。引用的格式是: 对象名.数据成员; 对象名.成员函数(实参表); 其中的“.”称为对象选择符,简称点运算符。,14,#include class point private: int x,y; public: void setpoint(int xx, int yy) x=xx; y=yy; int getx( ) return x; int gety( ) return y; ;,15,程序运行结果: op1 i=1 op1 j=2 op2 i=3 op2 j=4,void main( ) point op1,op2; int i,j; op1.setpoint(1,2); op2.setpoint(3,4); i=op1.getx(); j=op1.gety(); cout“op1 i=“i“ op1 j=“jendl; i=op2.getx(); j=op2.gety(); cout“op2 i=“i“ op2 j=“jendl; ,仔细想想程序如何运行的!,16,使用对象指针操作对象,格式: 指针名-数据成员 指针名-成员函数 void main( ) point op1,*p; op1.setpoint(1,2); p-setpoint(3,4); coutgetx( )gety( )endl; ,17,8.2.3 对象的赋值 属于同一个类的对象,由于它们的数据类型完全相同,所以可以相互赋值,而不属于同一个类的对象之间是不能直接相互赋值的。一个对象赋值给另一个对象时,所有的数据成员都会逐位拷贝,这两个对象只是数据成员的值相同,彼此仍是独立的,各自都有自己的内存空间。对象间的赋值是通过赋值运算符“=”进行。,18,#include class point public: int x,y; public: void setpoint(int xx, int yy) x=xx; y=yy; void show( ) coutx“ “yendl; ;,19,void main( ) point ob1,ob2; ob1.setpoint(5,6); ob2=ob1; /对象赋值 ob1.show( ); ob2.show( ); ,运行结果: 5 6 5 6,20,设计类方法?(牢记) 1.MyClass.h:设计类 2.MyClass.cpp: 引入类的声名 #include “MyClass.h “ 3.XXX.cpp : 引入类的声名 #include “MyClass.h “,21,例题:设计一个矩形类Rectangle 数据成员: length(私有), width,(私有)和color(公有) 成员函数: (都为公有) SetLengthWidth, GetLengthWidth, GetArea, ShowColor, SetColor 并设计一个主函数来测试你所编写的类。,22,class Rectangle private: double length; double width; public: int color; public: void SetLengthWidth(double l,double w); void GetLengthWidth(double *pl,double *pw); double GetArea( ); void ShowColor( ); bool SetColor(Rectangle r); ;,23,void Rectangle:SetLengthWidth(double l,double w) length=l; width=w; void Rectangle:GetLengthWidth(double *pl,double *pw) *pl=length; *pw=width; double Rectangle:GetArea( ) return length*width; void Rectangle:ShowColor( ) cout“The Object color is“colorendl; ,24,bool Rectangle:SetColor (Rectangle r) if(r.color0) color=r.color; return true; return false; ,25,void main( )/一定要弄清楚执行过程 double x,y; Rectangle r1,r2; r1.SetLengthWidth(10,20); coutr1.GetArea( )endl; r1.GetLengthWidth( ,26,课堂练习: 设计一个钟表类Clock,该类有Hour,Minute,Second三个数据成员分别用来表示时分秒,两个成员函数SetTime, ShowTime分别用来设置时间和显示时间。并设计一个主函数进行测试。,27,8.3构造函数,8.3.1 构造函数的定义和调用 1. 构造函数性质 构造函数被声明为公有成员,用于数据成员的初始化 构造函数的函数名必须与类名相同。 构造函数没有返回值,不能为它定义返回类型,包括void型在内。 对象定义时,编译系统会自动调用构造函数完成对象内存空间的分配和初始化工作。 构造函数是类的成员函数,具有一般成员函数的所有性质,可访问类的所有成员,可以是内联函数,可带有参数表,可带有默认的形参值,还可重载。,28,2. 构造函数的定义形式如下: class MyClass /类内定义 MyClass(函数参数) ; 或者 MyClass: MyClass(函数参数)/类外定义形式 ,29,#include class complex private: double real, imag; /定义复数的实部和虚部 public: complex(double r, double i) real=r; /初始化私有数据成员real和imag imag=i; void disp( ) coutreal“+“imag“i“endl; ;,30,3 . 默认构造函数的形式:类名构造函数名( ) 4. 构造函数的调用 构造函数不能被显示地调用,是在定义对象的同时被自动调用的,其调用的一般格式为: /使用没有参数的构造函数创建对象 (1)类名 对象名; /使用有参数的构造函数创建对象 (2)类名 对象名(实参表);,31,class Rec private: char bookname30; int number; public: Rec( ); void show( ); ; Rec : Rec ( ) strcpy(bookname, “no name”); number=0; ,32,void Rec : show ( ) cout“书名:“booknameendl; cout“编号:“numberendl; void main( ) Rec r1; Rec r2; r1.show(); r2.show(); ,程序的执行结果是: 书名:no name 编号:0 书名:no name 编号:0,Rec( ),Show( ),no name,0,no name,0,33,#include class complex private: double real, imag; public: complex(double r, double i) real=r; imag=i; void disp( ) coutreal“+“imag “i“endl; ;,void main( ) complex obj1(1.2,3.4); complex obj2; obj1.disp(); ,34,8.3.2 带有缺省参数的构造函数 可以将构造函数定义成带缺省参数的值的构造函数,这样,在定义对象时可以不指定实参,用缺省参数值来初始化数据成员。 定义带有缺省参数的构造函数时,类内给出缺省值是多少,在类外定义时就不能再给出缺省值了 。或者类内没有给出,类外定义时可以给出缺省值。,35,#include #include class complex double real,imag; public: complex(double real=0.0, double imag=0.0); double abscomplex(); ; complex:complex(double r, double i) /注意不能写成complex(double real=0.0, double imag=0.0) real=r; imag=i; ,36,double complex:abscomplex( ) double n; n=real*real+imag*imag; return sqrt(n); void main( ) complex ob1; complex ob2(1.1); complex ob3(1.1,2.2); cout“abs of complex ob1=“ob1.abscomplex()endl; cout“abs of complex ob2=“ob2.abscomplex()endl; cout“abs of complex ob3=“ob3.abscomplex()endl; ,程序运行结果: abs of complex ob1=0 abs of complex ob2=1.1 abs of complex ob3=2.45967,37,8.3.3 构造函数的重载 C+允许对构造函数重载,也就是可以定义多个参数不同的构造函数,用多种方法对对象进行初始化。这些构造函数之间通过参数的个数或类型来区分。 构造对象时会根据传递的实参类型和个数自动寻找匹配的构造函数来构造对象。,38,class CMyCls public: CMyCls( ) /第一个构造函数 CMyCls(int n) /第二个构造函数 CMyCls(int a, int b) /第三个构造函数 ; void main( ) CMyCls obj1; /调用哪个构造函数? CMyCls obj2(1); /调用哪个构造函数? CMyCls obj3(1,2); /调用哪个构造函数? ,39,#include class point private: float fx,fy; public: point( ); point(float x); point(float x,float y); void showpoint( ); ;,point:point( ) fx=0.0; fy=0.0; point :point(float x) fx=x; fy=5.5; point :point(float x,float y) fx=x; fy=y; ,40,void point:showpoint( ) coutfx“ “fyendl; void main( ) point p1; point p2(10); point p3(1.1,2.0); p1.showpoint( ); p2.showpoint( ); p3.showpoint( ); ,程序运行结果: 0.0 0.0 10 5.5 1.1 2.0,41,8.3.4 拷贝构造函数 1. 拷贝构造函数 拷贝构造函数是用一个已经存在的对象初始化新对象。可根据自己需要定义拷贝构造函数,也可由系统生成一个缺省的拷贝构造函数。拷贝构造函数参数必须是本类对象的引用。实质是构造函数的重载形式之一 2. 自定义拷贝构造函数 一般形式: 类名(类名& 对象名) ,42,3. 缺省拷贝构造函数 若没有自定义拷贝构造函数,则系统会提供缺省拷贝构造函数,形式是:类名(类名,43,class point private: int x,y; public: point(int a=0,int b=0) x=a; y=b; point(point ,point:point(point ,44,void main( ) point p1(1.1,2.2); point p2(p1); coutp2.getx()“ “p2.gety()endl; f(p2); p2=g( ); coutp2.getx( )“ “p2.gety( )endl; ,45,关于赋值运算符“=” 同类对象之间可用“=”,实现相应的数据成员值拷贝 初始化时,如果类中定义拷贝构造函数,则使用拷贝构造函数实现拷贝功能,否则使用赋值。 class A int x; ; A a1,a2; A b; b=a1; A c=a2;,直接赋值,调用拷贝构造函数,46,8.4析构函数,1. 析构函数的作用 析构函数也是一种特殊的成员函数,也被声明为公有成员,作用是释放分配给对象的内存空间,并做一些善后工作。 2. 析构函数的性质 析构函数的名字必须与类名相同,但在名字的前面要“”。 析构函数没有参数,没有返回值,不能重载,在一个类中只能有一个析构函数。 对象生命结束时,系统会自动调用析构函数完成占用空间的释放和善后工作,将内存空间的使用权交给操作系统。,47,3. 注意的问题 (1)每个类必须有一个析构函数,若没有显示地定义,则系统会自动生成一个缺省的析构函数。 (2)对于大多数类而言,缺省的析构函数就能满足要求,但如果对象在完成操作前需要做内部处理,则应有自定义析构函数。 (3)构造函数和析构函数的常见用法是,在构造函数中用new运算符为对象分配空间,在析构函数中用delete运算符释放空间。 (4)一般会将析构函数声明为虚函数,这将在后面学习。,48,class complex double real,imag; public: complex(double real=0.0, double imag=0.0); complex(); double abscomplex( ); ; complex:complex(double r, double i) cout“constructing“endl; real=r; imag=i; ,49,complex:complex( ) cout“destructing“endl; double complex:abscomplex( ) double n; n=real*real+imag*imag; return sqrt(n); void main( ) complex ob(1.1,2.2); cout“abs of complex ob=“ob.abscomplex()endl; ,程序运行结果如下: constructing abs of complex ob=2.459675 destructing,50,对象创建和释放顺序 对象的创建按顺序创建;对象的被析构顺序与对象建立时的顺序正好相反,即最后构造的对象先被析构,51,class CPerson char *name; public: CPerson(char * pName) name=pName; cout“创建”nameendl; CPerson ( ) cout“释放“nameendl; ; void main( ) CPerson a1(“周星驰”); CPerson a2(“周杰伦”); ,52,class A public: A( )cout“A构造”endl; A( )cout“A析构”endl; ; class B public: B( )cout“B构造”endl; B( )cout“B析构”endl; ; main( ) A a1,a2; B b; ,53,综合举例: 设计一个时间类,要求如下 包含三个数据成员分别为:小时、分和秒 构造函数可以带默认参数 设计拷贝构造函数创建对象 设计获取三个数据成员的函数 设计成员函数可以比较两个时间,54,class CTime int m_h; int m_m; int m_s; public: CTime(int h=12, int m=0, int s=0) m_h = h; m_m = m; m_s = s; CTime(CTime ,55,public: SetTime(int h=12,int m=0,int s=0) m_h = h; m_m = m; m_s = s; int GetH( ) return m_h; int GetM( ) return m_m; int GetS( ) return m_s; bool CompareTime(CTime ,56,void main( ) CTime t1; CTime t2; t2.SetTime(10,25,40);/设置标准时间 bool bIsCurrentTime=false; bIsCurrentTime = t1.CompareTime(t2); if(!bIsCurrentTime)/是否是标准时间 t1.SetTime(t2.GetH( ),t2.GetM( ),t2.GetS( ); CTime t3(t2);/通过t2创建t3 if(t3.CompareTime(t2) t3.SetTime(t2.GetH(),t2.GetM(),t2.GetS(); ,57,数据区,CTime代码区,58,课堂练习: 设计一个电视机类(CTv),包含的私有数据成员有:类别(m_type)、电压(m_voltage)、尺寸(m_size),两个公有成员函数start和stop分别用于启动电视和关闭电视。在类内定义类的构造函数和析构函数,其中构造函数是带默认值参数的函数,来初始化数据成员。定义多个函数用来设置和获取类的私有数据成员。设计主函数测试CTv。,59,8.5组合类,1. 类的组合 类中的数据成员是另一个类的对象,此类称之为组合类。 class Window; class Door ; class Building Window m_window; Door m_door; ;,60,组合类的对象创建过程: 先按照顺序创建各子对象 然后构造组合类本身 组合类的对象析构过程: 先析构本身,再析构子对象,若果有多个子对象,后创建的先析构 构造:先按顺序盖门窗,再盖大楼 析构:先拆大楼,再按反序拆窗门,61,class A int m_a; public: A( )cout“构造A”endl; A( )cout“析构A” endl; ; class B int m_b; A m_ClsA; public: B( )cout“构造B” endl; B( )cout“析构B” endl; ;,main( ) B b; ,程序结果: 构造A 构造B 析构B 析构A,62,class Student public: Student( )cout”construct student.”endl; Student( ) cout”deconstruct student.” endl; ; class Teacher public: Teacher( )cout”construct Teacher.” endl; Teacher( ) cout”deconstruct Teacher.” endl; ;,63,class school public: school( ) cout”construct school.” endl; school( ) cout”deconstruct school.” endl; protected: Student student; Teacher teacher; ; void main( ) school school1; ,64,2、对象成员的初始化 使用对象成员时,既要对包含对象成员的类的对象进行初始化,还要对对象成员进行初始化。 组合类的构造函数的一般形式为: (参数总表):对象成员1(形参表),对象成员2(形参表), 其中,冒号后面的部分称为成员初始化列表,用于完成对组合类中的对象成员的初始化,其语意是:调用对象n所属类的构造函数创建对象n,其参数取自参数总表。,65,#include #include class Point private: float x,y; public: Point(float xx,float yy) cout“point构造函数“endl; ,66,Point(Point ,67,class Distance private: Point p1,p2; double dist; public: Distance(Point a,Point b); double GetDis(void) return dist; ;,68,Distance:Distance(Point a,Point b):p1(a),p2(b) cout“Distance构造函数“endl; double x=double(p1.GetX()-p2.GetX(); double y=double(p1.GetY()-p2.GetY(); dist=sqrt(x*x+y*y); void main( ) Point my1(1,1),my2(4,5); Distance myd(my1,my2); cout“the distance is: “; coutmyd.GetDis()endl; ,程序运行结果: Point构造函数 Point构造函数 Point拷贝构造函数 Point拷贝构造函数 Point拷贝构造函数 Point拷贝构造函数 Distance构造函数 the distance is: 5,69,Distance:Distance(Point ,程序运行结果: Point构造函数 Point构造函数 Point拷贝构造函数 Point拷贝构造函数 Distance构造函数 the distance is: 5,上例修改为:,70,8.6对象数组与对象指针,8.6.1 对象数组 1. 对象数组的声明 对象数组就是指数组的元素是对象。 声明对象数组的一般形式如下: 类名 数组名下表表达式; 例如: myclass oba3; 定义了一个二维对象数组oba,它含有3个myclass类的对象。注意构造函数。,71,2. 对象数组的引用 由于对象数组的元素是对象,所以只能访问其公有成员。引用的一般形式是: 数组名下标.公有数据成员 数组名下标.公有成员函数 例如:oba2.getx( ); 3. 对象数组的赋值 对象数组的赋值是通过对数组中的每一个元素的赋值来实现的。可以给它赋初值,也可以被重新赋值。,72,class exam int x; public: void setx(int n) x=n; int getx() return x; ; void main() exam ob4; for(int i=0;i4;i+) obi.setx(i); for(i=0;i4;i+) cout obi.getx() endl; ,73,4. 对象数组初始化,注意结合构造函数 class A int x,y; public: A( )x=-1; y=-1; A(int a)x=a; y=0; A(int a,int b)x=a; y=b; ; void main( ) A aa3=A(1),A(1,2); ,74,8.6.2 对象指针 1.类的指针变量 类的指针变量是一个用于保存对象在内存中的存储空间首地址的指针变量。 类的指针变量声明的形式如下: 类名 * 指针变量名; 2.对象指针 对象指针指的是一个对象在内存中的首地址。取得对象在内存中地址通过取地址运算符”,75,3.使用对象指针引用对象成员 用对象的指针引用对象成员使用操作符“-”,实质是对象操作。 class A int x; public: void set_x(int a) x=a; void show_x( ) coutxendl; ;,76,void main( ) A *pt,obj; obj.set_x(2); obj.show_x( ); pt = ,77,8.6.3 this指针 class A public : int a; A(int a=0) a=a; ; void main() A a1, a2(5); couta1.aendl; couta2.aendl; ,class A public : int a; A(int a=0) this-a=a; ; void main() A a1, a2(5); couta1.aendl; couta2.aendl; ,78,指针this是系统自动生成的、隐含指向调用的对象。当一个对象生成以后,系统就为这个对象定义了一个this指针,它指向这个对象的地址。也就是说,每一个成员函数都有一个this指针,当对象调用成员函数时,该成员函数的this指针便指向这个对象。这样,当不同的对象调用同一个成员函数时,编译器将根据该成员函数的this指针指向的对象确定引用那个对象的成员函数。成员函数访问类中其他成员的形式为: this-成员变量 或 this-成员函数,79,1、指向当前对象的指针,在类内的成员函数中使用。 2、this指针不能被修改和赋值,是一个常指针。 3、数据成员的访问都隐含地被加上前缀:this-,80,class A int a; public : void f( )coutthisendl; ; void main( ) A a1, a2; cout/通过this找函数入口 ,81,8.6.4 为对象动态分配内存 数组的缺点 ? A a10; 如何解决 ? 堆内存 ? 在程序的运行过程中根据需要而动态分配的一块连续内存,由程序员分配和释放,82,创建堆对象: 类名 *指针名1 = new 类名(构造函数参数); 类名 *指针名2 = new 类名常量表达式; 释放堆对象: delete 指针名1; delete 指针名2;,83,注意问题: 1. new, delete和malloc,free的区别 2. 使用new的好处:动态产生,数量可变 3. 创建过程,84,class A int x; public: A( ) A(int m)x=m; int GetA( )return x; ; void main( ) int* p1 = new int; A *pa1 = new A; A *pa2 = new A(5); coutGetA( )endl;,delete p1; delete pa1; delete pa2; p1 =0; pa1 =0; pa2 = 0; ,85,/动态分配数组大小 main( ) int a15, i, *p; p=a1; cini; int a2i; /X p = a2; p = new inti; /OK ,86,Y=0,m_pa=1000H,5,1000H,class A/注意释放资源 int x; public: A(int m=0) x=m; ; class B int y; A * m_pa; public: B( ) m_pa = new A(5); y=0; B( ) delete m_pa; /没有析构函数会怎么样? ; void main( ) B b1; ,87,8.6.5 对象作为函数的参数 对象作为参数 指针作为参数 引用作为参数,88,class abc int x; public: abc(int xx) x=xx; void setx(int xx) x=xx; int getx( ) return x; void add1(abc obj) x+=obj.x; obj.x+; void add2(abc *p) x+=p-x; p-x+; void add3(abc ,89,void main( ) abc ob1(10),ob2(20), ob3(20), ob4(20); ob1.add1(ob2); ob1.add2( ,90,8.7静态成员,类的静态成员是解决同一个类的不同对象之间数据和函数共享的问题 类的静态数据成员 用static修饰的数据成员称为静态数据成员,一般设置为公有的 所有对象共享,具有静态生存期,静态成员应该在类的任何对象建立之前就存在 必须初始化:类型 类名:静态数据成员=初始值; 访问:类名:静态成员 或 对象.静态成员 静态数据成员的主要用途是定义类的各个对象所公用的数据,91,我们应该如何做? 类内声明,类外初始化 用静态成员函数引用静态数据成员 用类直接引用静态数据成员 class student int studentno; public: static int count; student( ) count+; studentno=count; ,92,void print( ) cout“student“studentno“ “; cout“count=“countendl; ; int student:count=0; void main( ) student s1; s1.print( ); student s2; s2.print( ); ,93,类的静态成员函数 静态成员函数定义(类内使用static修饰,类外不用static修饰) static 成员函数 访问:可以用类,也可以用对象 静态成员函数不属于某个对象,不能访问类中的非静态成员,因为没有this class student static int count; int studentno;,94,public: student( ) count+; studentno=count; ; static void init( ) count=0; static void print( ) cout“count=“countendl; ; int student:count=0; void main( ) student s1; s1.print( ); student s2; s2.print( ); student:print( ); ,95,count,0,s1,s2,4个字节,1,2,全局数据区,堆栈区,student,init,print,1,2,studentno,count=1,代码区,student,count+; studentno=count;,cout“count=“countendl;,studentno,count=2,count=2,程序输出:,96,8.8友元,友元的提出 class cls int x; public: int y; ; void fun(cls obj) obj.x+; obj.y+; ,97,8.8.1 类的作用域 一个标识符在程序正文中有效的区域称为该标识符的作用域。类在程序中的作用域,是类声

温馨提示

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

评论

0/150

提交评论