版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++与面向对象方法学
Jin.1主要内容:C++简介C++与面向对象方法学2一、C++简介CandC++C++是在C的基础上发展而来,是带类的C语言。BjarneStroustrup:20世纪80年代初期发明并实现了C++。最初被称作“CwithClasses”。C++是具有国际标准的编程语言,通常称作ANSI/ISOC++。
C语言支持结构化程序设计,C++语言支持面向对象程序设计。3根据EffectiveC++第三版第一条款的描述,现在C++由以下四个“子语言”组成:1、C子语言。C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。2、面向对象的C++(ObjectiveC++)。C++语言原本不具备面向对象的设计功能,然而随着面向对象编程的概念的提出以及如Java等语言的发展成熟,C++语言也开发出了支持面向对象功能的版本,现在编程者常用的VC++就是一种面向对象的语言。3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。4、STL(C++标准模板库,StandardTemplateLibrary)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的native代码低些,但是其安全性与规范性使它大受欢迎。42.DevelopmentofC++第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。
53.ApplicationofC++操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性是用C++写的。Microsoft:WindowsXPWindowsNT(NT4and2000)Windows9x(95,98,Me)MicrosoftOffice(Word,Excel,Access,PowerPoint,Outlook)InternetExplorer(includingOutlookExpress)VisualStudioSQLAdobe:Photoshop,ImageReady,
Illustrator,
Acrobat,.....
网络游戏,B,......64.WhatisC++?4.1C++的HelloWorld程序#include<iostream>
intmain(){
printf("Hello,world!\n");
return0;
}#include<iostream.h>
intmain(void)//(intargc,char*argv[]){
cout<<"Hello,world!"<<endl;
return0;}
7C++的函数特征//头文件hello.h#ifndefHELLO_H#defineHELLO_Hchar*hello(char*);#endif//源文件hello.cpp#include“hello.h”char*hello(char*name){ char*value=newchar[9+strlen(name)];sprintf(value,”hello,%s”,name);returnvalue;}//源文件main.cpp#include“hello.h”main(){ cout<<hello(“world”);}8ANSI-C++的标头档与名称空间-现代样式标头文件在新版ANSI-C++支持「现代样式标头文件」(Modern-StyleHeaders)和名称空间(Namespaces),可以使用全新方式来含括标头文件和使用C++语言的标准函式库(C++StandardLibrary)。在ANSI-C++标准函式库提供现代样式标头文件,新样式的标头文件不需.h扩展名,因为它并不是指文件名称,而是一个标识符,如下所示:#include<iostream>9ANSI-C++的标头档与名称空间-现代样式标头文件C++标准函式库常用的标头档说明,如下表所示:ANSI-C++标头档说明<exception>、<stdexcept>例外处理的相关类别<fstream>C++档案处理的相关函数<iomanip>格式化串流数据的相关函数<iostream>基本输出与输入的相关函数<limits>定义不同计算机系统数值数据型态的范围<string>字符串处理的类别10ANSI-C++的标头档与名称空间-现代样式标头文件C++标准函数库定义的类别与函数属于名为std的名称空间,而不是全域范围。名称空间(Namespaces)是声明一个区域范围,以便区域化名称来避免名称冲突的问题。换句话说,标准输出类别cout的全名应该加上名称空间std::cout,如下所示:std::cout<<"第一个C++程序\n";11ANSI-C++的标头档与名称空间-现代样式标头文件不过,为了和旧版C++程序兼容,如下所示:cout<<"第一个C++程序\n";上述程序代码并没有使用std名称空间,此时,我们需要在程序开头指定使用std名称空间,如下所示:#include<iostream>usingnamespacestd;上述usingnamespace指引指令使用名称空间std,表示将std视为全域范围,此时,就不需要在cout前加上std::。12C++语言新增的数据型态-说明C++语言支持C语言的所有数据型态,在ANSI-C++还新增bool和wchar_t数据型态,如下表所示:数据型态字节说明bool1布尔值,只有2种值true或falsewchar_t2宽字符,用来储存两字节的字符13C++语言新增的数据型态-数据型态wchar_t(说明)数据型态wchar_t声明的变量是用来储存宽字符,在指定变量值时,字符前需要加上「L」符号来表示是宽字符,如下所示:wchar_tch=L'a';上述程序代码指定变量ch值是宽字符'a',事实上,它的值和char型态并没有不同,因为ANSI字码的前255字符和Unicode是相同的。不只如此,「L」符号也可以用来表示wchar_t的Unicode字符串,如下所示:wchar_t*str=L"UnicodeString";
14C++语言新增的数据型态-C++语言的变量声明与初值C++语言不同于C语言只能在程序区块的开始声明变量,C++语言允许在程序代码的任何位置,有需要时即可声明变量。在声明变量后,指定初始变量值的方法,除了使用指定叙述,也可以在括号中指定初值,其语法如下所示:数据型态变量名称(初值);程序代码是在声明变量时,指定其初值,例如:声明整数a,如下所示:inta(10);intb=20;15C++语言的输出与输入C++语言提供全新标准输出与输入串流(Streams)来取代C语言的标准输出和输入函数scanf()和printf(),在<iostream>头文件定义两种标准串流,如下所示:cin:标准输入串流。cout:标准输出串流。C++语言的cin和cout串流对象的字头为「c」字符,表示是「控制台」(Console),in/out表示输入与输出。在C++程序含括<iostream>标头档,就可以使用cin和cout对象来输入和输出数据。16运算符new和delete是C++新增的运算符,提供了存储的动态分配和释放功能。有以下的几个优点:new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。自动地返回正确的指针类型,不用进行强制指针类型转换。可以用new对分配的对象进行初始化。例int*p; p=newint[10];
delete[]p;4.2动态内存分配和释放
17C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。C++中使用inline内联函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。
inlineintmax(inta,intb) {return(a>b)?a:b;}4.3inlinefunction18使用内联函数的限制在内联函数中不能定义任何静态变量。内联函数中不能有复杂的流程控制语句。内联函数不能是递归的。内联函数中不能说明数组。194.4函数原型
C++要求函数“先定义,后使用”。
[存储类型]函数类型函数名(<参数表>)可否“先声明,后使用,再定义”?函数原型是对函数的引用性声明。函数原型将函数的声明和使用分离开来,使程序的书写格式结构清楚,重点突出,便于安排。
格式:返回类型函数名(形式参数表);20#include<iostream.h>intfactorial(intn){ intz,i; z=1; for(i=1;i<=n;i++) z=z*i; returnz;}voidmain(){ intx; x=factorial(5)+factorial(4); cout<<”5!+4!=”<<x<<endl;}#include<iostream.h>intfactorial(intn); //函数原型语句voidmain(){ cout<<”5!+4!=”<<factorial(5)+factorial(4)<<endl;}intfactorial(intn){ intz,i; z=1; for(i=1;i<=n;i++) z=z*i; returnz;}21注:1、函数原型中无函数体部分。2、以分号;作为结束标志。3、函数原型必须和函数定义完全一致,即函数的参数个数、参数类型、返回值类型都必须一致。4、函数原型中形式参数的名字可写可不写。4.4函数原型22例:intmax(intx,inty){if(x>=y)returnx;elsereturny;}此函数定义所对应的函数原型为:intmax(int,int);4.2函数原型23函数的调用和参数传递缺省参数。函数的形式参数表中,若给若干个形式参数规定了默认值,则称这些参数为默认参数,又称可选参数。例:intf(inta,charb,charc=’z’,intd=100);4.4引用类型24函数调用时,若不给出默认参数所对应的实在参数,则实在参数取默认值。例12:
f(3,’a’,’b’)f(3,’a’,’b’,100)f(3,’a’)f(3,’a’,’z’,100)25参数传递与引用类型。按值传递按地址传递按引用传递26例:交换两个整数变量的值。#include<iostream.h>voidexch(int*x,int*y){ intz; z=*x; *x=*y; *y=z;}voidmain(){ inta=3,b=5; exch(&a,&b); cout<<"a="<<a<<",b="<<b<<endl;}对于复杂的程序,使用指针容易出错,程序也难以读懂。在C++中,对于上述情况可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。27C++语言通过取地址运算符“&”引入了一种新的数据类型—“引用类型”。
格式如下:
类型&变量,或:类型&变量。
一个引用类型的变量,简称为一个引用;格式中“类型”称为引用的基类型。如int&是对int类型的引用类型,float&是对float类型的引用类型。
4.5引用类型28voidAdd(int*a)
{
*a++;
}
//调用时则使用Add(&x);voidAdd(int&a)
{
a++;
}
//调用时则使用Add(x);例:交换两个整数变量的值。#include<iostream.h>voidexch(int&x,int&y){ intz; z=x; x=y; y=z;}voidmain(){ inta=3,b=5; exch(a,b); cout<<"a="<<a<<",b="<<b<<endl;}29独立引用是对变量的引用。在定义引用之前必须先定义被引用的变量。
intk; int&k_adr=k;(或int&k_adr=k;)对k的操作和对k_adr的操作对变量的影响是完全相同的。指向变量的指针也可以看作变量的别名。指针变量的值可改变,引用只能与一个变量关联。4.5引用类型30const参数、const返回值与const函数(一)const参数1、出现在函数参数中的const表示在函数体中不能对这个参数做修改。2、const通常用来限制函数的指针参数、引用参数和数组参数。如:intstrcmp(constchar*str1,constchar*str2);31(二)const返回值
1、函数返回值为const,只有用在函数值为引用类型的情况。2、const返回值的函数调用不能放在赋值号的左边。如:constint&min(int&,int&);则:min(a,b)=4;(×)32(三)const函数1、在函数头后面加上const,表示这个函数是一个只读函数。2、const函数通常作为类的成员函数,表示此函数不能改变类对象的成员变量的值。如:voidprintmessage(char*msg)const;33允许定义同名的函数。函数重载的条件:重载的函数必须在形式参数的数量或类型上与其它同名函数有所不同。4.6函数重载与函数模板34例:☆longadd(longa,longb){returna+b;}☆longadd(doublea,doubleb){returna+b;}☆longadd(floata,floatb){returna+b;}两点注意:(1)重载函数的区分是以函数参数来进行的,而不是用函数的返回值来区分不同的函数,所以参数表完全相同而返回值不同的两个同名函数不能重载。(2)不能让功能不同的函数进行重载。35函数模板:让具有类似功能而参数不同的函数使用相同的名字,提高程序代码的可复用性。
格式:template<模板形参表>函数定义4.6函数重载与函数模板36对应的函数模板:template<classType>Typemax(Typed1,Typed2){if(d1>d2)returnd1;returnd2;}注:<classType>表示Type这个符号可以被任一种具体数据类型所取代。例:
intmax(int
x,inty){if(x>y)returnx;returny;}floatmax(floatx,floaty){if(x>y)returnx;returny;}longmax(longx,longy){if(x>y)returnx;returny;}doublemax(doublex,doubley){if(x>y)returnx;returny;}intmax(int,int);charmax(char,char);char*max(char*str1,char*str2);37类:是对具有相同数据和相同操作的一组相似对象的定义,类是对具有相同属性和行为的一个或多个对象的描述。
定义格式:class类名{
类定义体};classRectangle{public: floatwidth,height; floatArea() {returnwidth*height;} floatPerimeter() {return2*(width+height);}}类与对象381.1实例:实例就是由某个特定的类所描述的一个具体的对象。如:Rectanglerect;则:rect是类Rectangle的一个对象。rect含有两个数据成员:width和height;含有两个函数成员:Area和Perimeter。
W=rect.width; A=rect.Area();391.2成员的访问控制:类成员的访问权限
pubilc:公用访问权限;成员可以为任意函数所访问。
protected:保护访问权限;成员只能为该类的成员函数以及该类的派生类中的成员函数所访问。private:私有访问权限;成员只能为该类的成员函数所访问。40例:classRectangle{private:floatwidth,height;public:floatArea(){returnwidth*height;}floatPerimeter(){return2*(width+height);}}Rectanglerect;rect.width=45;(×)rect.height=54.2;(×)cout<<rect.Area();cout<<rect.Perimeter();41classRectangle{private:floatwidth,height;public:voidSetWidth(floatnewWidth){width=newWidth;}voidSetHeight(floatnewHeigh){heigh=newHeigh;}floatArea(){returnwidth*height;}floatPerimeter(){return2*(width+height);}}可以通过公有的函数成员来访问私有成员。如:Rectanglerect;则:rect.SetWidth(45);rect.SetHeight(54.2);42确定成员访问权限的方法:1、类的数据成员一般不公开。2、表示类的接口的函数成员一般定义为公有。3、表示类的实现的函数成员一般定义为保护的或私有的。431.3.构造函数与析构函数定义构造函数:对类中的数据成员进行初始化;在对象被创建时由系统自动调用。析构函数:释放对象空间;在对象被释放时由系统自动调用。44特性1、构造函数与析构函数都是类的成员函数。2、构造函数的名字和类名相同;析构函数的名字则由类名前加上符号~。3、构造函数与析构函数都没有返回值类型。4、构造函数与析构函数一般定义为类的公有成员。45两点注意如果一个类没有定义构造函数,则系统将为类自动生成一个默认构造函数。如果一个类定义了构造函数,则系统将不再生成默认构造函数。46classClock
{
public:
Clock(intNewH,intNewM,intNewS);//构造函数
voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();
private:
intHour,Minute,Second;
};Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}intmain(){Clockc(0,0,0);c.ShowTime();}47析构函数:在对象的生命期结束时由系统自动调用的函数。1、析构函数的参数表为空;2、析构函数没有返回值;3、析构函数的名字是类名前加~;4、析构函数一般为公有成员函数;5、析构函数不能重载。 ~clock();481.4消息消息就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。通常,一个消息由下述3部分组成:接收消息的对象;消息选择符(也称为消息名);零个或多个变元。
例:c.ShowTime();491.5方法-成员函数方法就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方法。在C++语言中把方法称为成员函数。501.6.属性(attribute) 属性就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。在C++语言中把属性称为数据成员.512派生与继承在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。面向对象软件技术中把类组成一个层次结构的系统(类等级):一个类的上层可以有父类,下层可以有子类。这种层次结构系统的一个重要性质是继承性,一个类直接继承其父类的全部描述(数据和操作)。继承具有传递性。52派生类的定义格式classDerived:Base{Derived的成员定义};两点说明1、基类所有的数据成员和函数成员都自动成为派生类的数据成员和函数成员。2、一个类既可以是基类,也可以是派生类。53示例:classBase{private:inti,j;public:voidSetIJ(int,int);voidGetij(int&,int&);};classDerived:Base{private: intk;public: voidSetK(int); intGetK();};54基类成员对派生类的可见性:1、派生类的成员函数可以直接访问基类的公有和保护成员。2、派生类的成员函数不能直接访问基类的私有成员。(只能通过基类的公有或保护成员函数来进行访问)553.封装(encapsulation)
封装也就是信息隐藏,通过封装对外界隐藏了对象的实现细节。使用一个对象的时候,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。对象具有封装性的条件如下:(1)有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。(2)有确定的接口(即协议)。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。(3)受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。564.多态性(polymorphism)
多态性就是多种表现形式,具体来说,可以用“一个对外接口,多个内在实现方法”表示。C++中,多态性是通过虚函数实现的。保留字:virtual在C++中,当一个派生类对象的地址给一个基类指针后,基类指针只能访问所属类的成员函数,不能访问到该派生类对象中与基类成员函数相同的成员函数;
在C++中,把基类和派生类的相同函数定义为虚函数,就能通过基类指针可以调用任一派生类中的虚函数。通过调用基类的虚函数实际上能够调用一组虚函数中任一虚函数的技术称为多态性。57classA{
public:virtualvoidtest(){cout<<"aaa"<<endl;}};
classB:publicA
{
public:
voidtest(){cout<<"bbb"<<endl;}};
voidmain()
{Ccc; A*p=&cc;
p->test();
}classC:publicB
{public:
voidtest(){cout<<"ccc"<<endl;}
};
58纯虚函数抽象类:Abstractclass-只能用于被继承不能用于创建对象的类。在父类中无法确定具体实现的成员函数成为纯虚函数。纯虚函数只有声明,没有具体的定义。定义:virtual返回值类型函数名称(参数表)=0;595.重载(overloading)1)函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字;2)运算符重载是指同一个运算符可以施加于不同类型的操作数上面。60运算符重载运算符重载:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载通过运算符重载函数来实现。1、运算符重载函数的定义格式(1)单目运算符类型operator单目运算符(参数)函数体(2)双目运算符类型operator双目运算符(参数1,参数2)函数体如:Aoperator++(A&x){….}Aoperator+(A&x,A&y){….}612、运算符重载函数的调用格式(1)单目运算符☆operator单目运算符(实参)☆单目运算符实参如:operator++(x)或++x(2)双目运算符☆operator双目运算符(实参1,实参2)☆实参1双目运算符实参2如:operator+(x,y)或x+y62运算符重载示例:ComplexAdd(constComplex&a,constComplex&b);Complexoperator+(constComplex&a,constComplex&b);调用方式:
Complexa,b,c;…c=Add(a,b);//用普通函数c=a+b;//用运算符+63!不能被重载的运算符在C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。(1)不能改变C++内部数据类型(如int,float等)的运算符。(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。(3)不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
64类模板类模板是一种规范描述prescription。规定了如何创建一个类而且在这样的类中有一个或多个类型或值被参数化。类模板如何定义?65假设我们想定义一个类来支持队列queue的机制队列是一个专门用于对象集合的数据结构对象被加入到队列的尾部而从队列的顶部被删除队列的行为被称为先进先出firstinfirstout或FIFO。classQueue{public: Queue(); ~Queue();
Type&remove(); voidadd(constType&); boolis_empty(); boolis_full(); private://....};如何适应不同的数据类型???66一种方法是简单地使用蛮力程序员拷贝整个Queue类的实现并修改它使其能够在其他类型上进行工作。由于类名不能被重载所以必须对每一个实现给予惟一的名字。C++为自动生成类类型提供了模板机制。可以用类模板为每个特殊类型的队列自动生成Queue。template<classType>classQueue{public:Queue();~Queue();Type&remove();voidadd(constType&);boolis_empty();boolis_full();private://....};Queue<int>qi;Queue<complex<double>>qc;Queue<string>qs;说明示例(非标准严格定义)!!!67template<classT>
classQueueItem;类模板Queue本身提供了前面描述的公有接口以及一对数据成员front和back类。模板Queue被实现为一个链表类模板QueueItem表示Queue链表的一个节点,加入到队列中的每一项都被存储在一个QueueItem对象中。QueueItem对象含有一对数据成员value和next。value的实际类型随Queue实例的变化而变化,next是指向队列中下一个QueueItem对象的链接。68#ifndefQUEUE_H#defineQUEUE_H//QueueItem的声明template<classT>classQueueItem;template<classType>classQueue{public: Queue():front(0),back(0){} ~Queue(); Type&remove(); voidadd(constType&); boolis_empty()const{ returnfront==0;}private: QueueItem<Type>*front; QueueItem<Type>*back;};#endif69STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),并包括一些工具类如auto_ptr。采用模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
4.7STL(StandardTemplateLibrary,标准模板库)70算法算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。<algorithm>由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。<numeric>只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。<functional>中则定义了一些模板类,用以声明函数对象。71容器
STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。允许我们重复利用已有的实现构造自己的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024知名品牌服装销售代理授权合同
- 《楼宇电气控制线路》课件
- 二零二五年度海洋船舶防腐蚀涂装项目承包合同4篇
- 二零二五年度金融产品代理销售合同模板12篇
- 二零二五年度高端公寓承包装修施工合同8篇
- 二零二五年度毛竹种植基地与竹炭生产企业合作合同4篇
- 班组“三违”行为及其危害
- 宜宾酒王二零二五年度800亿控量保价进口代理合同2篇
- 综合机械化采煤工艺培训课件
- 二零二五年度公共文化设施建设承包合同补充协议3篇
- 全过程造价咨询项目保密及廉政执业措施
- 定制柜子保修合同协议书
- GB/T 712-2011船舶及海洋工程用结构钢
- GB/T 26846-2011电动自行车用电机和控制器的引出线及接插件
- GB/T 18015.1-1999数字通信用对绞或星绞多芯对称电缆第1部分:总规范
- 院医学实习请假审批表
- 2020-2021学年青岛版五年级上册期末考试数学试卷(1)1
- 导师指导记录表
- 七年级数学家长会课件
- 陕西省安康市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 陕西省渭南市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
评论
0/150
提交评论