




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6 6讲讲 多态性多态性(2)(2)2本讲主要内容本讲主要内容什么是多态性什么是多态性应用虚函数实现多态性应用虚函数实现多态性纯虚函数与抽象类纯虚函数与抽象类创建和调用运算符函数创建和调用运算符函数3创建和调用运算符函数创建和调用运算符函数41.运算符重载的需要性运算符重载的需要性 C+认为认为用户定义的数据类型用户定义的数据类型就像就像基本数据类型基本数据类型int和和char一样有效。一样有效。运算符运算符(如(如+、-、*、/)是为基本数据类型定义的,)是为基本数据类型定义的,为什么不允许为什么不允许用于用于用户自己定义的类型呢?用户自己定义的类型呢? 5例如:例如:class A
2、public : A ( int x ) a = x ; /.;A a ( 5 ) , b ( 10 ) , c ;c = a + b ; /类对象也应能运算类对象也应能运算 62. 怎样进行运算符重载怎样进行运算符重载运算符运算符是在是在C+系统内部定义的,系统内部定义的,具有特定的具有特定的语法规则,如参数说明,运算顺序,优先级语法规则,如参数说明,运算顺序,优先级别别等。等。重载运算符时,要注意该重载运算符的运算顺重载运算符时,要注意该重载运算符的运算顺序和优先级别不变。序和优先级别不变。7如下例:如下例:class A public : A ( int n ) /. operator
3、+ ( A& , A&) /. operator * ( A& , A&) /. / .;A a = 5 , b = 6 ; c = 7 , d = 8 , e;e = a + b * c + d ; /即即 ( a + ( b * c ) + d )8运算符重载运算符重载 “语法修饰语法修饰”有了运算符,编程就显得方便。例如,对于直有了运算符,编程就显得方便。例如,对于直角三角形斜边长度公式角三角形斜边长度公式c = ,用函数用函数化的格式表示:化的格式表示: c = sqrt ( add ( mult ( a , a ) , mult ( b , b ) )
4、 ) ;用运算符的格式表示:用运算符的格式表示: c = sqrt ( a * a + b * b ) ;22ba 9重载的形式重载的形式运算符是函数运算符是函数,除了运算顺序和优先级别不能,除了运算顺序和优先级别不能更改外,参数和返回类型是可以重新说明的,更改外,参数和返回类型是可以重新说明的,即可以重载。即可以重载。重载的形式是:重载的形式是: 返回类型返回类型 operator 运算符号(参数说明);运算符号(参数说明);10例如:例如: A类对象的加法:类对象的加法:class A ;int operator + ( A& , A& ) ; /两个两个A A类对象参加运
5、算,返回类对象参加运算,返回intint型值型值 11运算符重载的方式运算符重载的方式运算符重载是通过建立运算符函数运算符重载是通过建立运算符函数operator()来实现来实现的。的。运算符函数运算符函数operator( )定义了重载的运算符将要进定义了重载的运算符将要进行的操作,行的操作,这种操作通常作用在一个类上这种操作通常作用在一个类上。运算符函数通常有两种:运算符函数通常有两种:类成员运算符函数类成员运算符函数类的友元运算符函数类的友元运算符函数讲义上还介绍了运算符的重载第三种方式:讲义上还介绍了运算符的重载第三种方式:作为类外的普通函数(很少使用)作为类外的普通函数(很少使用)1
6、23. 建立类成员运算符函数建立类成员运算符函数成员运算符函数的一般声明格式:成员运算符函数的一般声明格式:class A /. 返回值类型返回值类型 operator C+运算符运算符(参数表参数表); /.;返回值类型返回值类型 类名类名:operator C+运算符运算符(参数表参数表) 定义将要重载的定义将要重载的C+运算符的操作运算符的操作 13通过成员函数实现运算符的重载通过成员函数实现运算符的重载【例4-1】 通过重载运算符通过重载运算符“”,实现日期类对象,实现日期类对象的的“”比较运算。比较运算。说明:本例以成员函数的方式进行运算符说明:本例以成员函数的方式进行运算符“”的重
7、的重载。载。#include using namespace std;class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date);比较运算符比较运算符“”的重载的重载关键字关键字operator函数名是函数名是: operatorCDate:CDate(int nYear, int nMonth, int nDay)m_nYear =
8、 nYear;m_nMonth = nMonth;m_nDay = nDay;int CDate:GetYear()return m_nYear;int CDate:GetMonth()return m_nMonth;int CDate:GetDay()return m_nDay;bool CDate:operator(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nY
9、ear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;int main() CDate date1(1992, 3, 18), date2(1992, 4, 5);if (date1 date2) coutdate1早于早于date2n;elsecoutdate1不早于不早于date2n;return 0; 运算符函数的隐式调用。也可以写成:运算符函数的隐式调用。也可以写成:if(date1.operator(date2) /显式调用显式调用date1是左操作数是左操作数
10、 date2是右操作数是右操作数比较运算是双目运算,比较运算是双目运算,为什么只有一个参数?为什么只有一个参数?请思考。请思考。因为成员运算符函数,参数中隐含的有一个因为成员运算符函数,参数中隐含的有一个thisthis指针,所以对于双目算符,类成员运算符函数有指针,所以对于双目算符,类成员运算符函数有一个参数。一个参数。当成员函数重载双目算符时,有一个参数没有被当成员函数重载双目算符时,有一个参数没有被显式地传递给成员运算符函数显式地传递给成员运算符函数, ,该参数是通过该参数是通过thisthis指针隐含地传递给函数的。指针隐含地传递给函数的。 17例如例如bool CDate:opera
11、tor(CDate date) if(m_nYear date.m_nYear)return true;if(m_nYear = date.m_nYear) & (m_nMonth date.m_nMonth)return true;if(m_nYear = date.m_nYear) & (m_nMonth = date.m_nMonth) & (m_nDay date.m_nDay)return true;return false;bool CDate:operatorm_nYear m_nYear = date.m_nYear) & (this- m_nM
12、onth m_nYear = date.m_nYear) & (this- m_nMonth = date.m_nMonth) & (this- m_nDay date.m_nDay)return true;return false;18例如例如调用时:调用时:if (date1 date2) 相当于:相当于:if(date1.operator(date2)并相当于:并相当于:if(date1.operator(&date1,date2)194. 建立友元运算符函数建立友元运算符函数 友元运算符函数的声明格式:友元运算符函数的声明格式:class A / friend
13、返回值类型返回值类型 operator c+运算符运算符(参数表参数表);返回值类型返回值类型 operator c+运算符运算符(参数表参数表) 定义将要重载的定义将要重载的c+运算符的操作运算符的操作 20通过友元函数实现运算符的重载通过友元函数实现运算符的重载【例4-1补充】 通过重载运算符通过重载运算符“”,实现日期类,实现日期类对象的对象的“”比较运算。比较运算。说明:本例以友元函数的方式进行运算符说明:本例以友元函数的方式进行运算符“”的重的重载。载。/Person.hclass CDate friend bool operator(CDate date1,CDate date2)
14、;/Person.cppbool operator(CDate date1,CDate date2)if(date1.m_nYear date2.m_nYear)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth date2.m_nMonth)return true;if(date1.m_nYear = date2.m_nYear) & (date1.m_nMonth = date2.m_nMonth) & (date1.m_nDay date2.m_nDay)return true;retur
15、n false;22注意注意 在在Visual C+6.0)环境中调试该程序,这时会出现与友元运算符重载)环境中调试该程序,这时会出现与友元运算符重载函数有关的编译错误函数有关的编译错误“不能访问类的私有成员不能访问类的私有成员”。即所声明的友元函。即所声明的友元函数不为编译器数不为编译器“认可认可”。为了消除为了消除VC6.0中的这种问题,将中的这种问题,将Person.h文件中的语句文件中的语句#include using namespace std;修改成为:修改成为:#include #include 将将main函数所在文件中的语句函数所在文件中的语句#include using n
16、amespace std;修改成为:修改成为: #include 程序在程序在Visual C+6.0编译环境下可以正常编译。编译环境下可以正常编译。 235.成员运算符函数和成员运算符函数和友员运算符函数的比较友员运算符函数的比较 对于双目运算符而言,成员运算符函数带有对于双目运算符而言,成员运算符函数带有一个参数,而友元运算符函数带有两个参数;一个参数,而友元运算符函数带有两个参数;双目运算符一般可以被重载为成员运算符函双目运算符一般可以被重载为成员运算符函数或友元运算符函数,但一种情况(一般数数或友元运算符函数,但一种情况(一般数据类型据类型+ +对象)必须用友元运算符函数。对象)必须用
17、友元运算符函数。 24可以声明为成员运可以声明为成员运算符函数算符函数#include class nclass int x,y; public: nclass ( int i = 0 , int j = 0 ) x = i ; y = j ; void show() cout x “,” y endl ; friend nclass operator + ( nclass ob, int m) ; friend nclass operator + ( int m , nclass ob ) ; ;nclass operator +( nclass ob, point m) nclass w;
18、 w.x=ob.x+m; w.y=ob.y+m; return w ;nclass operator +( point m ,nclass ob) nclass w ; w.x= m +ob.x ; w.y=m + ob.y ; return w ;不可以声明为成员不可以声明为成员运算符函数运算符函数25void main() nclass ob1(10,20),ob2; ob2=ob1+30; /隐式调用隐式调用 ob2.show(); ob2= operator +( ob1, 30); /显式调用显式调用 ob2=50+ob1; /隐式调用隐式调用 ob2.show(); ob2= op
19、erator +( 50, ob1); /显式调用显式调用26分析分析ob=ob+200;由于对象由于对象ob是运算符是运算符“+”的左操作数,所以的左操作数,所以它调用了它调用了“+”运算符重载函数;运算符重载函数;ob=300+ob;未能工作的原因是运算符的左操作数是一个整未能工作的原因是运算符的左操作数是一个整数,整数是内部数据类型,它不能产生对一数,整数是内部数据类型,它不能产生对一个类成员函数的调用。个类成员函数的调用。27解决方法解决方法使用友元函数来重载运算符使用友元函数来重载运算符“+”,就能消除由就能消除由于运算符于运算符“+”的左操作数是内部数据类型而的左操作数是内部数据类
20、型而带来的问题。带来的问题。这样这样,两个参数都显式地传递给运算符函数。两个参数都显式地传递给运算符函数。结论:用友元运算符函数来重载运算符结论:用友元运算符函数来重载运算符“+”(或其他双目运算符)就使得内部数据类型(或其他双目运算符)就使得内部数据类型能够出现在运算符的左边。能够出现在运算符的左边。28说明说明C+的大部分运算符既可以被重载为成员运算符函的大部分运算符既可以被重载为成员运算符函数也可以被重载为友元运算符函数。数也可以被重载为友元运算符函数。友元算符函数可增加重载运算符的灵活性。成员友元算符函数可增加重载运算符的灵活性。成员函数重载运算符可以最大程度地保持程序的封装函数重载运
21、算符可以最大程度地保持程序的封装性。性。一般说来,对于一目运算符用成员函数重载较好,一般说来,对于一目运算符用成员函数重载较好,对于二目算符用友元算符函数重载恰当。对于二目算符用友元算符函数重载恰当。 29如果一个运算符的操作需要修改类对象的状态,如果一个运算符的操作需要修改类对象的状态,则选择成员运算符函数较好;则选择成员运算符函数较好;如运算符所需的操作数(第一个操作数)希望有如运算符所需的操作数(第一个操作数)希望有隐式类型转换,则必须选择友元运算符函数。隐式类型转换,则必须选择友元运算符函数。 30【例例4-2】 通过友元运算符重载函数实现字通过友元运算符重载函数实现字符串常量与日期类
22、对象的比较。符串常量与日期类对象的比较。【分析分析】对于对于左操作数左操作数是基本数据类型,而是基本数据类型,而右操作右操作数数是类对象的情况,例如,将某一字符串常量是类对象的情况,例如,将某一字符串常量“1992.12.18”与某一日期类对象进行比较,就不与某一日期类对象进行比较,就不能使用成员运算符重载函数来实现,其原因在于:能使用成员运算符重载函数来实现,其原因在于: 这时这时左操作数不是类对象,不能调用类的成员函数左操作数不是类对象,不能调用类的成员函数。在这种情况下,需要通过友元函数来实现运算符在这种情况下,需要通过友元函数来实现运算符的重载。的重载。 #include #inclu
23、de class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear, int nMonth, int nDay);int GetYear();int GetMonth();int GetDay();bool operator(CDate date); friend bool operator(const char* strDate, CDate &date); ; 通过友元函数进行比较运算通过友元函数进行比较运算符符的重载的重载这里做了修改(针对这里做了修改(针对VC 6.0编译环境)编译环境)32bool
24、 operator(const char* strDate, CDate &date)char strYear5, strMonth3, strDay3;int nYear, nMonth, nDay;strncpy(strYear, strDate, 4); strYear4 = 0;strncpy(strMonth, strDate+5, 2);strMonth2 = 0;strncpy(strDay, strDate+8, 2);strDay2 = 0;nYear = atoi(strYear);nMonth = atoi(strMonth);nDay = atoi(strDay
25、);if(nYear date.m_nYear)return true;if(nYear = date.m_nYear) & (nMonth date.m_nMonth)return true;if(nYear = date.m_nYear) & (nMonth = date.m_nMonth) &(nDay date.m_nDay)return true;return false;33int main()CDate date1(1992, 3, 5), date2(1993, 4, 8);if(date1 date2)coutdate1的日期早于的日期早于date2e
26、ndl;elsecoutdate1的日期不早于的日期不早于date2;CDate date3(1992, 12, 29); if(1992.12.19 date3)coutdate3的日期值晚于:的日期值晚于:1992.12.19endl;elsecoutdate3的日期值不晚于:的日期值不晚于:1992.12.19endl;return 0; 调用成员运算符重载函数:调用成员运算符重载函数:bool operator(CDate date);调用友元运算符重载函数:调用友元运算符重载函数:bool operator(const char* strDate, CDate &date);
27、346. 通过类外的普通函数实现运算符通过类外的普通函数实现运算符的重载的重载【例4-3】重载运算符重载运算符“+”,实现复数的相加。,实现复数的相加。【分析分析】首先定义复数类首先定义复数类CComplex。考虑到。考虑到要使用类外的普通函数来处理复数类内部的要使用类外的普通函数来处理复数类内部的数据,故将数据放在公有域中声明。数据,故将数据放在公有域中声明。 这样仅仅为了重载运算符,明显破坏了类的这样仅仅为了重载运算符,明显破坏了类的封装性,是很不常见的情形。因为我们有更封装性,是很不常见的情形。因为我们有更合适的解决问题的办法,没有必要合适的解决问题的办法,没有必要“牺牲牺牲”类的封装性
28、。类的封装性。#include using namespace std;class CComplex public:double m_real;double m_imag;CComplex(double real = 0.0, double imag = 0.0)m_real = real;m_imag = imag;CComplex operator+(const CComplex &complex1, const CComplex &complex2)CComplex temp;temp.m_real = complex1.m_real + complex2.m_real;
29、temp.m_imag = complex1.m_imag + complex2.m_imag;return temp;int main()CComplex complex1(1.2, 2.4), complex2(3.3, 4.4), complex3, complex4;complex3 = complex1 + complex2; coutcomplex3.m_real=complex3.m_real complex3.m_imag=complex3.m_imagendl;complex4 = operator+(complex1, complex2); coutcomplex4.m_r
30、eal=complex4.m_real complex4.m_imag=complex4.m_imagendl;return 0;运算符重载函数的隐式调用运算符重载函数的隐式调用运算符重载函数的显式调用运算符重载函数的显式调用387. 单目运算符的重载单目运算符的重载“+”和和“-”w自增运算符自增运算符“+”和自减运算符和自减运算符“-”都是只都是只有一个操作数的单目运算符。有一个操作数的单目运算符。w下面设计一个坐标点类下面设计一个坐标点类CPoint,使用,使用“+”完成完成CPoint类对象的自增运算。类对象的自增运算。【例例4-4】使用成员运算符重载函数实现使用成员运算符重载函数实现
31、CPoint类的自增运算符类的自增运算符“+”的重载。的重载。#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x “,” m_y endl ; CPoint operator +( ) ;CPoint CPoint : operator +( ) +m_x; /先增量 +m_y; /先增量 return *this ; /再返回原对象“+” 运算符的重载运算符的重载前缀方式前缀方式v
32、oid main() CPoint point1(100, 100), point2; point1.show( ); point2 =+point1; /隐式调用,像使用基本类型一样书写 point2.show(); point1.operator + ( ); /显式调用,类的成员函数调用格式 point1.show(); 运算结果符合前缀运算结果符合前缀方式方式前缀方式实现了,后前缀方式实现了,后缀方式怎样实现?缀方式怎样实现?41【例例4-4补充补充】使用成员运算符重载函数实现使用成员运算符重载函数实现CPoint类的自增运算符类的自增运算符“+”的后缀方式的重的后缀方式的重载。载。【
33、分析分析】前缀方式和后缀方式的区别在于运算当中,是前缀方式和后缀方式的区别在于运算当中,是“先先变变”还是还是“先用先用”。使用时:+ point1 /前缀方式定义时: point1.operator+(); /成员运算符函数使用时: point1 + /后缀方式定义时: point1.operator+(); /成员运算符函数很显然,在一个类里面出现两个完全一样的成员函数是无法很显然,在一个类里面出现两个完全一样的成员函数是无法区分的,那么为了区分开,在后缀方式的定义中加入一个区分的,那么为了区分开,在后缀方式的定义中加入一个参数。参数。42+和和-重载重载在在C+中,编译器通过在运算符函数
34、参数表中是否插中,编译器通过在运算符函数参数表中是否插入关键字入关键字int来区分来区分+或或- - 是前缀方式还是后缀方是前缀方式还是后缀方式。式。+ point1 /前缀方式前缀方式(前面已讲)point1.operator+(); /成员运算符函数point1 + /后缀方式后缀方式 point1.operator + ( int ); /成员运算符函数调用时,参数int一般被传值0。 43#include using namespace std;class CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i
35、; m_y = j ; void show() cout m_x , m_y endl ; CPoint operator +(); /前缀方式前缀方式 CPoint operator +( int i); /后缀方式后缀方式;44CPoint CPoint:operator +( ) +m_x; /先增量先增量 +m_y; /先增量先增量 return *this ; /再返回原对象再返回原对象CPoint CPoint:operator +( int i) CPoint temp(*this); /先将原对象的值保存先将原对象的值保存 m_x+; m_y+; /改变原对象改变原对象 ret
36、urn temp; /返回原对象旧值返回原对象旧值 45void main() CPoint point1(100, 100), point2; point1.show(); /point2 =+point1; point2 = point1+; point2.show(); /point1.operator+(); point1.operator+(1); point1.show(); 46【例例4-5】基于基于CPoint类,使用友元函数重载类,使用友元函数重载前缀自增运算符和后缀自增运算符。前缀自增运算符和后缀自增运算符。#include using namespace std;clas
37、s CPoint int m_x, m_y; public: CPoint( int i=0 , int j=0 ) m_x = i ; m_y = j ; void show() cout m_x , m_y 访问)、访问)、“:”、“.-”、“?:”、“.*”(成员指针逆向引用运算符)(成员指针逆向引用运算符)这五个运算符不能重载,也不能创造新的运算符。这五个运算符不能重载,也不能创造新的运算符。51运算符重载时的要求运算符重载时的要求运算符重载时,应该满足以下两个条件:运算符重载时,应该满足以下两个条件:不能改变运算符的初始含义;不能改变运算符的初始含义;不能改变运算符的参数数目,但是可
38、以有不能改变运算符的参数数目,但是可以有选择地省略某个操作数。选择地省略某个操作数。但可以实现运算符重载函数的重载(为同一个但可以实现运算符重载函数的重载(为同一个运算符定义几个运算符重载函数来进行不运算符定义几个运算符重载函数来进行不同的操作)同的操作)52总结:运算符重载的局限性与优点总结:运算符重载的局限性与优点 不能继承;(不能声明为虚函数)不能继承;(不能声明为虚函数)一般对象之间的运算局限于数据成员是非指针类一般对象之间的运算局限于数据成员是非指针类型;型;运算符重载与相同功能的成员函数或友元函数相运算符重载与相同功能的成员函数或友元函数相比,在隐式调用时更简洁,这是运算符重载的最
39、比,在隐式调用时更简洁,这是运算符重载的最明显的优点。明显的优点。 538.8.赋值运算符赋值运算符“= =”的重载的重载 只要是用户定义了类或结构,都应能进行赋值运算,只要是用户定义了类或结构,都应能进行赋值运算,这也是继承了这也是继承了C语言:语言: struct S int a , b ; ;S m , n ;m = n ; /C语言允许这样赋值语言允许这样赋值 54数组例外数组例外但是数组名不能赋值,一个数组名代表一个数但是数组名不能赋值,一个数组名代表一个数据类型的集合,实质上是一个常量指针,所据类型的集合,实质上是一个常量指针,所以它不能:以它不能: int a5;int b =
40、3, 5, 7, 9, 11 ;a = b ; /error 55拷贝构造函数和赋值运算符拷贝构造函数和赋值运算符对于任何类,像拷贝构造函数一样,对于任何类,像拷贝构造函数一样,C+C+也提供默认也提供默认的赋值运算符函数,但是要区别拷贝构造函数和的赋值运算符函数,但是要区别拷贝构造函数和赋值运算符:赋值运算符: void fn ( MyClass& mc ) MyClass newMC = mc ; /这是拷贝构造函数 newMC = mc ; /这是赋值运算符56区别区别当拷贝构造函数执行时,当拷贝构造函数执行时,newMC对象还不存在,拷对象还不存在,拷贝构造函数起初始化的作用。
41、贝构造函数起初始化的作用。当赋值运算符在当赋值运算符在newMC上执行时,它已经是一个上执行时,它已经是一个MyClass对象。对象。通常,缺省的赋值运算符函数是能够胜任工作的。但通常,缺省的赋值运算符函数是能够胜任工作的。但是在某些情况下,如类中有指针类型时,使用缺省是在某些情况下,如类中有指针类型时,使用缺省的赋值运算符函数会产生错误。即存在指针悬挂的的赋值运算符函数会产生错误。即存在指针悬挂的问题。问题。 57补充例题补充例题#include #include class string char *ptr; public: string ( char *s ) ptr =new charstrlen(s)+1; strcpy(ptr,s); string () delete ptr ; void print () cout ptr endl ; ;void main() stri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 穿刺实训室管理制度
- 烘焙vip群管理制度
- 劳务队进场管理制度
- 软件测试组管理制度
- 核心概念2025年系统分析师试题及答案
- 会计学原理试题及答案a
- 2025年网络规划设计师职业技能提升试题及答案
- 街道办事考试题库及答案
- 深圳外贸笔试题目及答案
- 关于音程乐理的试题及答案
- 2024年不动产登记代理人《地籍调查》考试题库大全(含真题、典型题)
- 提高锅炉热能利用率QC小组
- 《公路工程预算定额》(JTGT3832-2018)
- 【高分复习笔记】李加明《保险学》笔记和习题(含考研真题)详解
- 合同到期不续签的模板
- 气压传动课件 项目五任务一 压印设备延时阀回路搭建与调试
- 红色背景课件模板
- 2005室外给水管道附属构筑物阀门井05S502
- 露天煤矿智能集控员职业技能竞赛理论考试题库(含答案)
- 语文- 必修下册文言文挖空练习 (教师版 )
- 北京市《配电室安全管理规范》(DB11T 527-2021)地方标准
评论
0/150
提交评论