版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第七章多態(tài)性(polymorphism)7.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性7.2、多態(tài)的思考方式7.3、函數(shù)重載7.4、運(yùn)算符重載7.5、虛函數(shù)綜合訓(xùn)練17.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性1、多態(tài)性的概念多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵技術(shù)之一,若程序設(shè)計(jì)語言不支持多態(tài)性,不能稱為面向?qū)ο蟮恼Z言多態(tài)性就是不同(成員)函數(shù)使用同一個(gè)函數(shù)名,即同樣的接口實(shí)現(xiàn)不同的操作擴(kuò)展:多態(tài)性指不同類的對(duì)象對(duì)同一消息作出不同響應(yīng)有繼承關(guān)系運(yùn)算符重載7.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性2、聯(lián)編多態(tài)性的實(shí)現(xiàn)與聯(lián)編這一個(gè)概念有關(guān)一個(gè)源程序經(jīng)過編譯,連接,成為可執(zhí)行文件的過程是把可執(zhí)行代碼聯(lián)編(或稱裝配)在一起的過程
也就是一個(gè)程序自身彼此關(guān)聯(lián)的過程7.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性舉例#include<iostream.h>
classPoint
{
public:
Point(doublei,doublej){x=i;y=j;}
doubleArea()const{return0.0;}
private:
doublex,y;
};
classRectangle:publicPoint
{
public:
Rectangle(doublei,doublej,doublek,doublel);
doubleArea()const{returnw*h;}
private:
doublew,h;
};7.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性Rectangle::Rectangle(doublei,doublej,doublek,doublel)
:Point(i,j)
{
w=k;h=l;
}
voidfun(Point&s)//外部函數(shù)
{
cout<<s.Area()<<endl;
}
voidmain()
{
Rectanglerec(3.0,5.2,15.0,25.0);
fun(rec);
}
調(diào)用哪個(gè)Area函數(shù)?上述聯(lián)編過程存在問題,沒有按我們的期望進(jìn)行聯(lián)編體會(huì)聯(lián)編的含義不同對(duì)象point、rectangle具有相同接口Area()體會(huì)多態(tài)性的含義參數(shù)改為:
Rectangle&s如果Point派生:
Circle7.1、編譯時(shí)的多態(tài)性與運(yùn)行時(shí)的多態(tài)性3、靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編根據(jù)聯(lián)編所執(zhí)行的階段分為:靜態(tài)聯(lián)編:在編譯階段進(jìn)行聯(lián)編,速度快、效率高,但不靈活(含義?)動(dòng)態(tài)聯(lián)編:在程序運(yùn)行階段進(jìn)行聯(lián)編,即直到程序運(yùn)行時(shí)在確定調(diào)用哪個(gè)函數(shù),靈活性、可維護(hù)性在C++中,編譯時(shí)的多態(tài)性是通過函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的,運(yùn)行時(shí)的多態(tài)性是通過繼承和虛函數(shù)來實(shí)現(xiàn)的7.2、多態(tài)的思考方式多態(tài)性允許程序員通過向一個(gè)對(duì)象發(fā)送消息來完成一系列動(dòng)作,無需涉及軟件系統(tǒng)如何實(shí)現(xiàn)這些動(dòng)作Area()Area()Rectangle對(duì)象Point對(duì)象發(fā)送消息(調(diào)用)Area()繼承7.2、多態(tài)的思考方式舉例實(shí)現(xiàn)一個(gè)計(jì)算機(jī)繪圖的程序:
假設(shè)有一個(gè)Cricle類,一個(gè)Square類。每個(gè)類都是一個(gè)Shape,并且都有一個(gè)成員函數(shù)Draw(),該函數(shù)負(fù)責(zé)將不同的圖形顯示在屏幕上7.2、多態(tài)的思考方式程序的偽代碼如下:
#include<iostream.h>
enum
ShapeType{SHAPE,CIRCLE,SQUARE};//將圖形形狀定
//義為枚舉類型
classShape
{
public:
Shape()
{
type=SHAPE;
}
ShapeTypetype;
voiddraw(){}//Shape不是具體的圖形,draw()什么也不做
};7.2、多態(tài)的思考方式classCircle:publicShape//定義Circle類
{
public:
Circle()
{
type=CIRCLE;//覆蓋剛賦值的type
}
voiddraw()
{
cout<<“drawcircle”<<endl;//……完成Circle圖形的繪制
}
};
7.2、多態(tài)的思考方式classSquare:publicShape//定義Square類
{
public:
Square()
{
type=SQUARE
}
voiddraw()
{
cout<<"drawSquare"<<endl;//完成Square的繪制工作
}
//….
};
7.2、多態(tài)的思考方式voiddrawShape(Shape&s)//圖形繪制的外部函數(shù)
{
//…
switch(s.type)//判斷對(duì)象的type,決定調(diào)用哪個(gè)draw()函數(shù)
{
caseCIRCLE:
s.Circle::draw();break;
caseSQUARE
s.Square::draw();break;
//…
}
}
7.2、多態(tài)的思考方式分析在一個(gè)繪圖程序中,類似的圖形成員不止兩個(gè),都要進(jìn)行類似的處理。而且還可能會(huì)增加新的圖形類,例如要增加一個(gè)Traingle類,我們需要對(duì)drawType函數(shù)進(jìn)行修改,使它能夠支持新增加的類型,這樣應(yīng)用程序的維護(hù)量很大,面向?qū)ο蟮膬?yōu)越性被遏制,又回到面向過程程序設(shè)計(jì)的老路上去了。我們可以使用多態(tài)機(jī)制來必免使用上述的代碼。7.3、函數(shù)重載函數(shù)重載:用同一個(gè)名字訪問一組相關(guān)的函數(shù)。也就是說,能使用戶為某一類操作取一個(gè)通用的名字,而由編譯程序來選擇具體由哪個(gè)函數(shù)來執(zhí)行;意義:因而有助于解決程序的復(fù)雜性問題。7.3、函數(shù)重載#include<iostream.h>
voidprint(intn)//定義函數(shù)print
{cout<<n<<endl;}
voidprint(constchar*str)//重載函數(shù)print
{cout<<str<<endl;}
intmain()
{
print(4);//調(diào)用voidprint(intn)
print("helloworld");//調(diào)用voidprint(constchar*)
return0;
}7.3、函數(shù)重載對(duì)于重載函數(shù),編譯程序能夠通過參數(shù)選擇具體由哪個(gè)函數(shù)來執(zhí)行。在類中,普通成員函數(shù)和構(gòu)造函數(shù)都可以重載,特別是構(gòu)造函數(shù)的重載(它提供了多種初始化方式)給用戶以更大的靈活性在基類和派生類中的函數(shù)重載有兩種情況:一種是函數(shù)參數(shù)有所差別的重載。另一種是函數(shù)所帶的參數(shù)完全相同,只是它們屬于不同的類(基類和派生類)??梢允褂脤?duì)象名加以區(qū)分和使用”類名::”加以區(qū)分7.4、運(yùn)算符重載1、運(yùn)算符重載的基本概念2、成員運(yùn)算符重載3、友元運(yùn)算符重載4、值返回和引用返回5、增量運(yùn)算符的重載6、轉(zhuǎn)換運(yùn)算符重載7、賦值運(yùn)算符重載7.4、運(yùn)算符重載1、運(yùn)算符重載的基本概念定義:賦予已有的運(yùn)算符多重含義。
C++中通過重新定義運(yùn)算符,使它能夠用于特定類的對(duì)象執(zhí)行特定的功能。這樣就增強(qiáng)了C++語言的擴(kuò)充能力用途:運(yùn)算符重載所定義的操作通常作用在一個(gè)類上,來執(zhí)行對(duì)這個(gè)對(duì)象的運(yùn)算目的:使C++代碼更直觀,易讀。
例如:4+5就比add(4,5)更加直觀7.4、運(yùn)算符重載語法:
類型[類名::]operator重載的運(yùn)算符(參數(shù))
{
函數(shù)相關(guān)操作
}
[]表示可選的;在運(yùn)算符重載時(shí)如果有類名,就是成員運(yùn)算符函數(shù),否則就是友元運(yùn)算符函數(shù)。7.4、運(yùn)算符重載#include<iostream.h>
classInteger//大寫
{
public:
Integer(inti=0)
{
val=i;
}
Integeroperator+(constInteger&a)//重載運(yùn)算符+
{
returnInteger(val+a.val);
}
voidprint()const
{
cout<<“value=”<<val<<endl;
}
private:
intval;
};生成、返回匿名對(duì)象誰的val相加?7.4、運(yùn)算符重載voidmain()
{
Integera(5),b(3),c;
cout<<"objecta";
a.print();
cout<<"objectb";
b.print();
c=a+b;
cout<<"objectc";
c.print();
}
程序運(yùn)行結(jié)果:objectavalue=5objectbvalue=3objectcvalue=8相當(dāng)于”a.+”,調(diào)用a的成員函數(shù)+因?yàn)榇颂幍?本質(zhì)上是單目運(yùn)算符,形式上為雙目,與之前保持不變也是靜態(tài)聯(lián)編7.4、運(yùn)算符重載分析:
上例中為Integer重載了運(yùn)算符“+”,使“+”能夠使用于Integer類的對(duì)象。運(yùn)算符重載是通過編寫函數(shù)定義實(shí)現(xiàn)的。函數(shù)定義包括函數(shù)首部和函數(shù)體,但是函數(shù)名是由關(guān)鍵字operator和其后的要重載的運(yùn)算符號(hào)組成7.4、運(yùn)算符重載在C++中:幾乎所有的運(yùn)算符都可用作重載,包括:
算術(shù)運(yùn)算符:+,-,*,/,%,++,――
位操作運(yùn)算符:&,|,~,^,<<,>>
邏輯運(yùn)算符:!,&&,||
比較運(yùn)算符:>,<,>=,<=,==,!=
賦值運(yùn)算符:=,+=,-=,*=,/=,%=,&=,|=,<<=,>>=
其他運(yùn)算符:[],(),->,new,delete,new[],delete[],->*,甚至int等注意:1、運(yùn)算符是在C++系統(tǒng)內(nèi)部定義的,它們的運(yùn)算順序、優(yōu)先級(jí)、目數(shù)在重載過程中都不改變2、有一些運(yùn)算符是不能重載的,例如:
.,.*,::,?:,#,##
7.4、運(yùn)算符重載唯一的三目運(yùn)算符7.4、運(yùn)算符重載2、成員運(yùn)算符重載運(yùn)算符重載包括兩種形式:成員函數(shù)重載和友元運(yùn)
算符重載成員函數(shù)重載:將運(yùn)算符重載函數(shù)定義為類中的成員函數(shù)友元運(yùn)算符重載:將運(yùn)算符重載函數(shù)定義為類中的友元函數(shù)7.4、運(yùn)算符重載成員運(yùn)算符函數(shù)聲明和定義的格式如下:
聲明的格式:
classX{
…
typeoperator@(參數(shù)表);
};
定義的格式:
TypeX::operator@(參數(shù)表)
{
函數(shù)體
}
其中type是函數(shù)的返回類型,@是要重載的運(yùn)算符也可以寫成內(nèi)聯(lián)形式7.4、運(yùn)算符重載#include<iostream.h>
classthree_d
{
private:
intx; //x坐標(biāo)
inty; //y坐標(biāo)
intz; //z坐標(biāo)
public:
three_d(inti,intj,intk); //構(gòu)造函數(shù)
three_d(); //默認(rèn)構(gòu)造函數(shù)
three_doperator+(three_dc);//成員方式重載+運(yùn)算符
voidshow(); //顯示結(jié)果
};
7.4、運(yùn)算符重載three_d::three_d(inti,intj,intk)//構(gòu)造函數(shù)
{
x=i; //給x賦值
y=j; //給y賦值
z=k; //給z賦值
}
three_d::three_d()//默認(rèn)構(gòu)造函數(shù)
{
x=0; //初始化x
y=0; //初始化y
z=0; //初始化z
}
7.4、運(yùn)算符重載//重載+三維坐標(biāo)的相加使用成員運(yùn)算符重載
three_dthree_d::operator+(three_dc)
{
three_dtmp; //定義臨時(shí)變量
tmp.x=x+c.x; //取得x坐標(biāo)
tmp.y=y+c.y; //取得y坐標(biāo)
tmp.z=z+c.z; //取得z坐標(biāo)
returntmp; //返回
}
//顯示坐標(biāo)
voidthree_d::show()
{
cout<<“x=”<<x<<“y=”<<y<<“z=”<<z<<endl;
//顯示x,y,z坐標(biāo)
}如何實(shí)現(xiàn)局部對(duì)象的返回?訪問權(quán)限?7.4、運(yùn)算符重載//主函數(shù)
intmain()
{
three_dob1,ob2(10,11,12),ob3(11,21,31);//定義3個(gè)對(duì)象
cout<<"-------ob1,ob2.ob3-------\n";
ob1.show(); //顯示第一個(gè)對(duì)象
ob2.show(); //顯示第二個(gè)對(duì)象
ob3.show(); //顯示第三個(gè)對(duì)象
ob1=ob2+ob3; //利用重載+
cout<<"-----ob1=ob2+ob3,--------\n";
ob1.show(); //顯示第一個(gè)對(duì)象
return0;
}
7.4、運(yùn)算符重載3、友元運(yùn)算符重載運(yùn)算符聲明的格式:
classX{
…
friendtypeoperator@(參數(shù)表);
};定義的格式:
Typeoperator@(參數(shù)表)
{
函數(shù)體
}其中type是函數(shù)的返回類型,@是要重載的運(yùn)算符7.4、運(yùn)算符重載成員運(yùn)算符函數(shù)與友元運(yùn)算符函數(shù)的區(qū)別友元運(yùn)算符函數(shù):(1)不屬于任何類對(duì)象;(2)它沒有this指針;(3)若重載的是雙目運(yùn)算符,則參數(shù)表中有兩個(gè)操作數(shù),如果重載的是單目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù)。成員運(yùn)算符函數(shù):(1)屬于一個(gè)類對(duì)象;(2)它有this指針;(3)若重載的是雙目運(yùn)算符,則參數(shù)表中有一個(gè)操作數(shù),如果重載的是單目運(yùn)算符,則參數(shù)表中沒有操作數(shù)(隱含this)為什么成員運(yùn)算符函數(shù)少一個(gè)參數(shù)?7.4、運(yùn)算符重載#include<iostream.h>
classthree_d
//定義類
{
private:
intx;
//x坐標(biāo)
inty;
//y坐標(biāo)
intz; //z坐標(biāo)
public:
three_d(inti,intj,intk); //構(gòu)造函數(shù)
three_d(); //默認(rèn)構(gòu)造函數(shù)
friendthree_doperator+(three_dc,three_dd);
//重載+使用友元
voidshow(); //顯示結(jié)果
};
7.4、運(yùn)算符重載three_d::three_d(inti,intj,intk)//構(gòu)造函數(shù)
{
x=i; //給x賦值
y=j; //給y賦值
z=k; //給z賦值
}
three_d::three_d()//默認(rèn)構(gòu)造函數(shù)
{
x=0; //初始化x
y=0; //初始化y
z=0; //初始化z
}
7.4、運(yùn)算符重載//重載+三維坐標(biāo)的相加使用友元
three_doperator+(three_dc,three_dd)
{
three_dtmp; //定義臨時(shí)變量
tmp.x=c.x+d.x; //取得x坐標(biāo)
tmp.y=c.y+d.y; //取得y坐標(biāo)
tmp.z=c.z+d.z; //取得z坐標(biāo)
returntmp; //返回
}
//顯示坐標(biāo)
voidthree_d::show()
{
cout<<"x="<<x<<"y="<<y<<"z="<<z<<endl;
//顯示x,y,z坐標(biāo)
}
7.4、運(yùn)算符重載//主函數(shù)
intmain()
{
three_dob1,ob2(10,11,12),ob3(11,21,31);//定義3個(gè)對(duì)象
cout<<"-------ob1,ob2.ob3-------\n";
ob1.show(); //顯示第一個(gè)對(duì)象
ob2.show(); //顯示第二個(gè)對(duì)象
ob3.show(); //顯示第三個(gè)對(duì)象
ob1=ob2+ob3; //利用重載+
cout<<"-----ob1=ob2+ob3,--------\n";
ob1.show(); //顯示第一個(gè)對(duì)象
return0;
}
7.4、運(yùn)算符重載4、值返回和引用返回運(yùn)算符重載過程中有兩種情況:
(1)返回值的類型是值類型;
(2)返回值的類型是引用;
這兩者有什么區(qū)別呢?看下面的例子:把對(duì)象的(數(shù)據(jù)成員)值返回把對(duì)象本身返回7.4、運(yùn)算符重載#include<iostream.h>
classRMB{
public:
RMB(unsignedintd,unsignedintc);//構(gòu)造函數(shù)
friendRMBoperator+(RMB&,RMB&);//重載+
friendRMB&operator++(RMB&);//重載++
voiddisplay()
{
cout<<(yuan+f/100.0)<<endl;
}
protected:
unsignedintyuan;
unsignedintf;
};
能否定義為成員運(yùn)算符函數(shù):RMBoperator+(RMB&,RMB&);7.4、運(yùn)算符重載RMB::RMB(unsignedintd,unsignedintc)//構(gòu)造函數(shù)
{
yuan=d;
f=c;
while(f>=100)//規(guī)整人民幣單位,分不超過100
{
yuan++;
f-=100;
}
}
RMB
operator+(RMB&s1,RMB&s2)//兩個(gè)不同數(shù)目的人民幣相加
{
unsignedintf=s1.f+s2.f;
unsignedintyuan=s1.yuan+s2.yuan;
RMBresult(yuan,f);//使用構(gòu)造函數(shù)規(guī)整相加后的結(jié)果
returnresult;//返回值
}7.4、運(yùn)算符重載RMB&operator++(RMB&s)//定義重載運(yùn)算符++
{
s.f++;
if(s.f>=100)
{
s.f-=100;
s.yuan++;
}
returns;//返回引用
}
voidmain(){//主函數(shù)
RMBd1(1,60);
RMBd2(2,50);
RMBd3(0,0);
d3=d1+d2;
++d3;
d3.display();
}程序運(yùn)行結(jié)果:4.117.4、運(yùn)算符重載7.4、運(yùn)算符重載7.4、運(yùn)算符重載采用值返回或引用返回的原則:
1、是否改變自身(或者實(shí)參是否改變)
2、局部對(duì)象不能返回引用
3、返回引用的函數(shù)名可以做左值
作左值的例子:#include<iostream.h>
classCA
{
public:
CA(intx=0,inty=0):a(x),b(y){};
inta,b;
CA&operator+=(constCA&rhs)
{
this->a+=rhs.a;
this->b+=rhs.b;
return*this;
}
CAoperator+(constCA&rhs)
{
intx=a+rhs.a;
inty=a+rhs.b;
CAret(x,y);
returnret;
}This->可省略嗎?作左值的例子:
voiddisp()
{
cout<<a<<“”<<b<<endl;
}
};
voidmain()
{
CAc_one(1,1),c_two(2,2),c_three;
c_three=c_one+c_two;
c_three+=c_two;//!!
c_three.disp();
(c_three+=c_two)=c_one; //把c_one的值賦給c_three
c_three.disp();
}
作左值的例子:理解(1)兩個(gè)函數(shù)沒有返回值行不行?(2)返回對(duì)象和返回引用存在區(qū)別運(yùn)算符重載函數(shù)一般需要返回對(duì)象或引用根據(jù)需要決定根據(jù)實(shí)現(xiàn)決定7.4、運(yùn)算符重載運(yùn)算符重載的注意事項(xiàng)(比較成員、友元運(yùn)算符函數(shù))(1)對(duì)于二元運(yùn)算符,成員運(yùn)算符函數(shù)帶一個(gè)參數(shù),而友元運(yùn)算符函數(shù)帶兩個(gè)參數(shù);對(duì)于一元運(yùn)算符,成員運(yùn)算符函數(shù)不帶參數(shù),而友元運(yùn)算符帶一個(gè)參數(shù)(2)C++的大部分運(yùn)算符既可以聲明為成員運(yùn)算符函數(shù),又可以聲明為友元運(yùn)算符函數(shù),具體選擇哪一種情況,主要取決于實(shí)際情況和程序員的習(xí)慣7.4、運(yùn)算符重載(3)當(dāng)運(yùn)算符函數(shù)是一個(gè)成員函數(shù)時(shí),最左邊的操作數(shù)(或者只有左邊的操作數(shù))必須是運(yùn)算符類的一個(gè)對(duì)象(或者是該類的一個(gè)引用)。如果左邊的操作數(shù)必須是一個(gè)不同類的對(duì)象或者是一個(gè)內(nèi)部類的對(duì)象,該運(yùn)算符函數(shù)必須作為一個(gè)友元函數(shù)實(shí)現(xiàn)(4)在重載運(yùn)算符()、[]、->或者任何賦值運(yùn)算符時(shí),運(yùn)算符重載函數(shù)必須聲明為類的一個(gè)成員(5)編譯程序?qū)\(yùn)算符重載選擇,遵循著函數(shù)重載的選擇。當(dāng)遇到不很明顯的運(yùn)算符時(shí),編譯程序?qū)⑷ふ覅?shù)匹配的運(yùn)算符函數(shù)系統(tǒng)已定義的類7.4、運(yùn)算符重載(6)重新定義運(yùn)算符,不改變?cè)\(yùn)算符的優(yōu)先級(jí)和結(jié)合性。并且運(yùn)算符重載后,也不改變運(yùn)算符的語法結(jié)構(gòu),即單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載為雙目運(yùn)算符(7)不可臆造新的運(yùn)算符。必須把重載運(yùn)算符限制在C++語言中已經(jīng)有的運(yùn)算符范圍允許重載的運(yùn)算符中(8)重載運(yùn)算符的含義必須清楚;重載運(yùn)算符不能有二義性7.4、運(yùn)算符重載5、增量運(yùn)算符的重載(減量運(yùn)算法類似)#include<iostream.h>
classInteger{//Integer類聲明
intvalue;
public:
Integer(intx)
{
value=x;
}
Integer&operator++();//前置增量運(yùn)算符
Integeroperator++(int);//后置增量運(yùn)算符
friend
ostream&operator<<(ostream&,constInteger&);//重載<<運(yùn)算符
};原因:對(duì)對(duì)象進(jìn)行++內(nèi)部類新功能:輸出對(duì)象雙目運(yùn)算符兩個(gè):前綴、后綴要不要參數(shù):?要不要返回:?返回引用和對(duì)象的區(qū)別:?可以是成員,也可是友元7.4、運(yùn)算符重載Integer&Integer::operator++()//定義前置增量運(yùn)算符重載函數(shù)
{
value++;//先增量
return*this;//返回原有對(duì)象
}
IntegerInteger::operator++(int)//定義后置增量運(yùn)算符重載函數(shù)
{
Integertemp(value);//臨時(shí)對(duì)象保存原有對(duì)象值
value++;//原有對(duì)象增量修改
returntemp;
}
有this指針I(yè)nt
aaa也行7.4、運(yùn)算符重載ostream&operator<<(ostream&output,constInteger&a)//定義<<運(yùn)算符
{
output<<"Thevalueis"<<a.value;
returnoutput;
}
intmain()
{
Integera(20);
cout<<a<<endl;
cout<<(a++)<<endl;
cout<<a<<endl;
cout<<(++a)<<endl;
return0;
}Cout<<“Thevalueis”<<a.value;程序輸出結(jié)果:Thevalueis20Thevalueis20Thevalueis21Thevalueis22要不要返回:?能不能定義為成員函數(shù)?7.4、運(yùn)算符重載在C++中,前置增量運(yùn)算符和后置增量運(yùn)算符的意義是不同的:
使用前置增量時(shí),對(duì)對(duì)象進(jìn)行增量修改,然后再返回該對(duì)象。所以前置增量運(yùn)算符操作時(shí),參數(shù)與返回的是同一對(duì)象。
使用后置增量時(shí),必須在增量返回之前返
回原有的對(duì)象值。后置增量操作返回的是原有對(duì)象值,不是原有對(duì)象,原有對(duì)象已經(jīng)被增量修改。7.4、運(yùn)算符重載6、轉(zhuǎn)換運(yùn)算符重載賦值、計(jì)算、給函數(shù)傳值以及從函數(shù)返回值都可能會(huì)進(jìn)行類型轉(zhuǎn)換對(duì)于內(nèi)部數(shù)據(jù)類型,編譯器知道如何轉(zhuǎn)換類型。程序員可以用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符實(shí)現(xiàn)內(nèi)部類型之間的轉(zhuǎn)換對(duì)于用戶自定義數(shù)據(jù)類型,可以使用以下兩種途徑實(shí)現(xiàn)類型轉(zhuǎn)換:
(1)通過構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換
(2)通過類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換7.4、運(yùn)算符重載#include<iostream.h>
classInteger{//Integer
public:
Integer(inti);//類型轉(zhuǎn)換構(gòu)造函數(shù)
friendostream&operator<<(ostream&,constInteger&);//重載<<運(yùn)算符
private:
intvalue;
};
通過構(gòu)造函數(shù)進(jìn)行類型轉(zhuǎn)換:
實(shí)現(xiàn)整型數(shù)
對(duì)象的轉(zhuǎn)換7.4、運(yùn)算符重載Integer::Integer(inti)//定義類型轉(zhuǎn)換函數(shù)
{
cout<<"Typeconvertconstructor"<<endl;
value=i;
}
ostream&operator<<(ostream&output,constInteger&a)
{
output<<"Integervalue="<<a.value;
returnoutput;
}
7.4、運(yùn)算符重載voidmain()
{
Integera=Integer(3);//顯式調(diào)用類型轉(zhuǎn)換構(gòu)造函數(shù)
cout<<a<<endl;
Integerb=6;//隱式調(diào)用類型轉(zhuǎn)換構(gòu)造函數(shù)
cout<<b<<endl;
}
程序運(yùn)行結(jié)果:TypeconvertconstructorIntegervalue=3TypeconvertconstructorIntegervalue=67.4、運(yùn)算符重載#include<iostream.h>
classInteger{//Integer類聲明
public:
Integer(inti=0);//類型轉(zhuǎn)換構(gòu)造函數(shù)
friendostream&operator<<(ostream&,constInteger&);
//重載<<運(yùn)算符
operatorint();//重載類型轉(zhuǎn)換運(yùn)算符
private:
intvalue;
};類型轉(zhuǎn)換函數(shù)進(jìn)行類型轉(zhuǎn)換含義:它原來就是類型轉(zhuǎn)換運(yùn)算符現(xiàn)在是新含義的類型轉(zhuǎn)換運(yùn)算符沒有返回類型、參數(shù)7.4、運(yùn)算符重載Integer::Integer(intx)
{
cout<<"Integerconstructor"<<endl;
value=x;
}
Integer::operator
int()
{
cout<<"Typechangedtoint"<<endl;
returnvalue;
}
7.4、運(yùn)算符重載ostream&operator<<(ostream&output,constInteger&a)
{
output<<“Integervalue=”<<a.value;
returnoutput;
}
voidmain()
{
Integera(5),b(3),c;
cout<<a<<endl;
cout<<int(a)*2<<endl;//顯式轉(zhuǎn)換
c=a+b;
//隱式轉(zhuǎn)換
cout<<c<<endl;
}7.4、運(yùn)算符重載程序運(yùn)行結(jié)果:
Integerconstructor
Integerconstructor
Integerconstructor
Integervalue=5
Typechangedtoint
10
Typechangedtoint
Typechangedtoint
Integerconstructor
Integervalue=8
構(gòu)造了什么對(duì)象?7.4、運(yùn)算符重載類型轉(zhuǎn)換函數(shù)聲明的一般格式為:
operator類型名();
(1)類型轉(zhuǎn)換運(yùn)算符將對(duì)象轉(zhuǎn)換成類型名規(guī)定的類型。轉(zhuǎn)換形式就像強(qiáng)制類型轉(zhuǎn)換一樣。
(2)如果沒有重載類型轉(zhuǎn)換運(yùn)算符,直接使用強(qiáng)制轉(zhuǎn)換是不行的。因?yàn)閺?qiáng)制轉(zhuǎn)換運(yùn)算符只能對(duì)基本數(shù)據(jù)類型進(jìn)行操作,對(duì)自定義類型的操作沒有定義
(3)沒有返回類型,因?yàn)轭愋兔痛砹怂姆祷仡愋?,故返回類型顯得多余。7.4、運(yùn)算符重載重載類型轉(zhuǎn)換運(yùn)算符的注意事項(xiàng):(1)類型轉(zhuǎn)換運(yùn)算符重載函數(shù)只能定義為類的成員函數(shù),不能定義為類的友元函數(shù)(2)類型轉(zhuǎn)換運(yùn)算符重載函數(shù)既沒有參數(shù),也沒有返回類型(3)類型轉(zhuǎn)換運(yùn)算符重載函數(shù)中必須把目的類型的數(shù)據(jù)做為函數(shù)的返回值(4)一個(gè)類可以定義多個(gè)類型的類型轉(zhuǎn)換函數(shù),C++編譯器根據(jù)操作數(shù)的類型自動(dòng)選擇一個(gè)合適的類型轉(zhuǎn)函數(shù)與之匹配,在可能出現(xiàn)歧義的情況下,必須顯式地使用相應(yīng)類型的類型轉(zhuǎn)換函數(shù)進(jìn)行轉(zhuǎn)換7.4、運(yùn)算符重載7、賦值運(yùn)算符重載一般情況,用于類的對(duì)象的運(yùn)算符必須重載但是賦值運(yùn)算符(=)無需重載就可以用于每一個(gè)類。在不提供重載的賦值運(yùn)算符時(shí),賦值運(yùn)算符的默認(rèn)行為是復(fù)制對(duì)象的數(shù)據(jù)成員,比如前例通常情況下,默認(rèn)的賦值運(yùn)算符操作是能勝任工作但有些應(yīng)用中,僅使用默認(rèn)的賦值運(yùn)算符的操作不夠,還需要根據(jù)用戶的情況對(duì)賦值運(yùn)算符進(jìn)行重載。
有時(shí)使用默認(rèn)的賦值運(yùn)算符會(huì)出現(xiàn)不能正常工作的情況,此時(shí),程序員必須自己實(shí)現(xiàn)賦值運(yùn)算符重載。7.4、運(yùn)算符重載#include<iostream.h>
#include<string.h>
#include<assert.h>
classString//大寫
{
public:
String(constchar*s)
{
ptr=newchar[strlen(s)+1];
assert(ptr!=0);//確保內(nèi)存分配成功
strcpy(ptr,s);
len=strlen(s);
}
7.4、運(yùn)算符重載~String()
{
delete[]ptr;
}
friendostream&operator<<(ostream&output,constString&s);//重載<<運(yùn)算符
private:
char*ptr;
int
len;
};
ostream&operator<<(ostream&output,constString&s)//重載<<運(yùn)算符
{
output<<s.ptr;
returnoutput;
}7.4、運(yùn)算符重載voidmain()
{
Strings1("test1");
{
Strings2("test2");
s2=s1;
cout<<"s2:"<<s2<<endl;
}
cout<<"s1:"<<s1<<endl;
}
賦的什么值?7.4、運(yùn)算符重載上述程序雖然能夠正確編譯,但是該程序運(yùn)行時(shí)會(huì)發(fā)生指針錯(cuò)誤。
因?yàn)槲覀儧]有為String類重載賦值運(yùn)算符,當(dāng)程序執(zhí)行到語句s2=s1時(shí),使用默認(rèn)的賦值運(yùn)算符操作,將對(duì)象s1的數(shù)據(jù)成員逐個(gè)拷貝到對(duì)象s2中。此時(shí)s2和s1中的指針成員ptr指向同一塊內(nèi)存空間。當(dāng)s2的生存期(main()函數(shù)內(nèi)層的一對(duì)花括號(hào)間)結(jié)束時(shí),編譯器調(diào)用析構(gòu)函數(shù)將這一內(nèi)存空間回收。此時(shí),盡管對(duì)象s1的成員ptr存在,但其指向的空間卻無法訪問了7.4、運(yùn)算符重載#include<iostream.h>
#include<assert.h>
#include<string.h>
classString//大寫
{
public:
String(constchar*s)
{
ptr=newchar[strlen(s)+1];
assert(ptr!=0);//確保內(nèi)存分配成功
strcpy(ptr,s);
len=strlen(s);
}7.4、運(yùn)算符重載~String()
{
delete[]ptr;
}
voiddisp(){cout<<ptr<<endl;};
String&operator=(constString&s)
{
cout<<"oveload"<<endl;
if(ptr)delete[]ptr;
ptr=newchar[strlen(s.ptr)+1];
strcpy(ptr,s.ptr);
len=strlen(s.ptr);
return*this;
}
7.4、運(yùn)算符重載private:
char*ptr;
int
len;
};
voidmain()
{
Strings1("test1");
Strings2=s1;
s2.disp();
s2=s1;
s2.disp();
}
修改主函數(shù):voidmain()
{
Strings1("test1");
Strings2("test2");
s2.disp();
s2=s1;
s2.disp();
}7.4、運(yùn)算符重載賦值運(yùn)算符重載的注意事項(xiàng):(1)類的賦值運(yùn)算符"="只能定義為類的成員函數(shù),不能定義為類的友元函數(shù)(2)C++編譯器默認(rèn)為每個(gè)類重載了賦值運(yùn)算符"=",其默認(rèn)行為是復(fù)制對(duì)象的數(shù)據(jù)成員。但有時(shí)程序員必須自己實(shí)現(xiàn)賦值運(yùn)算符重載,否則會(huì)出現(xiàn)錯(cuò)誤(3)重載賦值運(yùn)算符"="時(shí),賦值運(yùn)算符函數(shù)的返回類型應(yīng)是類的引用,這與賦值的語義相匹配。因?yàn)镃++中要求賦值表達(dá)式左邊的表達(dá)式是左值(4)賦值運(yùn)算符可以被重載,但重載了的運(yùn)算符函數(shù)operator
=()不能被繼承,所有都不能繼承7.5、虛函數(shù)1、引入派生類后的對(duì)象指針2、虛函數(shù)定義3、虛函數(shù)和重載函數(shù)的關(guān)系4、純虛函數(shù)和抽象類動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)的多態(tài)不同類的對(duì)象對(duì)同一消息作出不同響應(yīng)便于程序擴(kuò)充7.5、虛函數(shù)1、引入派生類后的對(duì)象指針公有派生類的對(duì)象可以作為其基類的對(duì)象處理比如:基類
Point,派生類Rectangle、Circle
函數(shù)voidfun(Point&s)但是,反過來是不行的,基類的對(duì)象不能自動(dòng)成為派生類的對(duì)象總結(jié):派生類對(duì)象也是基類對(duì)象,可以實(shí)現(xiàn)一般性處理(在公有派生時(shí))7.5、虛函數(shù)通常通過將派生類對(duì)象指針轉(zhuǎn)換為基類指針來實(shí)現(xiàn)一般性處理舉例:例7.15通俗地講:可以用基類指針指向一個(gè)派生類的對(duì)象(在公有派生時(shí))隱式轉(zhuǎn)換7.5、虛函數(shù)引入派生類指針后,對(duì)象指針的注意事項(xiàng):1、對(duì)于public繼承,總是可以將派生類指針賦給基類指針1,因?yàn)榕缮悓?duì)象也是基類對(duì)象?;愔羔樦?看到"派生類對(duì)象的基類部分。編譯器進(jìn)行派生類指針向基類指針的隱式轉(zhuǎn)換見上例2、反之,因?yàn)榘鸦愔羔樦苯淤x給派生類指針蘊(yùn)含著危險(xiǎn)性,所以編譯器不允許這么做,也不執(zhí)行隱式類型轉(zhuǎn)換
即:不能用派生類指針指向基類對(duì)象7.5、虛函數(shù)3、聲明為指向基類的指針,當(dāng)它指向公有派生類對(duì)象時(shí),只能用它來訪問派生類中從基類繼承來的成員,不能訪問派生類中定義的成員。因?yàn)榫幾g器認(rèn)為該指針指向的是基類對(duì)象4、對(duì)于private繼承,不允許將聲明為指向基類對(duì)象的指針指向它的派生類的對(duì)象7.5、虛函數(shù)2、虛函數(shù)定義虛函數(shù)就是在基類中被關(guān)鍵字virtual說明,并在派生類中重新定義的函數(shù)在派生類中重新定義時(shí),其函數(shù)原型,包括返回類型、函數(shù)名、參數(shù)個(gè)數(shù)與參數(shù)類型的順序,都必須與基類中的原型完全相同7.5、虛函數(shù)#include<iostream.h>
classparent{
protected:
charversion;
public:
parent()
{
version='A'; }
virtualvoidprint()//定義虛函數(shù)print()
{
cout<<"\nTheparent.version"<<version;
}
};
7.5、虛函數(shù)classderived1:publicparent{
private:
intinfo;
public:
derived1(intnumber)
{
info=number;
version='1';
}
voidprint()//重新定義虛函數(shù)print()
{
cout<<"\nThederived1info:"<<info
<<"version"<<version;
}
};省略“:parent()”7.5、虛函數(shù)intmain()
{
parentob,*op;//聲明了基類的對(duì)象和指針
op=&ob;
op->print();//通過基類指針調(diào)用基類的parent的print()
derived1d1(3);
op=&d1;
op->print();//通過基類指針調(diào)用派生類的derived1的print()——多態(tài)
return0;
}程序中語句op->print();出現(xiàn)了兩次,由于op指向的對(duì)象不同,每次出現(xiàn)都執(zhí)行了print()的不同的版本。程序運(yùn)行的結(jié)果為:
Theparent.VersionA
Thederived1info:3version17.5、虛函數(shù)虛函數(shù)定義與使用的注意事項(xiàng):1、只有類的成員函數(shù)才能聲明為虛函數(shù),因?yàn)樘摵瘮?shù)僅適用于有繼承關(guān)系的類對(duì)象,普通函數(shù)不能聲明為虛函數(shù)2、在派生類中對(duì)基類聲明的虛函數(shù)進(jìn)行重定義時(shí),關(guān)鍵字virtual可以寫也可以不寫3、不能把靜態(tài)成員函數(shù)聲明為虛函數(shù),因?yàn)殪o態(tài)成員函數(shù)不屬于某個(gè)對(duì)象,而虛函數(shù)是通過對(duì)象指針或引用來調(diào)用的7.5、虛函數(shù)4、構(gòu)造函數(shù)不能是虛函數(shù),因?yàn)閳?zhí)行構(gòu)造函數(shù)時(shí),對(duì)象還沒有實(shí)例化。但析構(gòu)函數(shù)可以是虛函數(shù)5、在派生類中重定義虛函數(shù)時(shí),函數(shù)的原型必須與基類中的函數(shù)原型完全相同6、定義了虛函數(shù)后,我們通過使用基類指針或引用指明派生類對(duì)象并使用該指針或引用來調(diào)用虛函數(shù)的方式來實(shí)現(xiàn)動(dòng)態(tài)關(guān)聯(lián)。
雖然可以使用對(duì)象名和點(diǎn)運(yùn)算符的方式來調(diào)用虛函數(shù),但是這種調(diào)用是在編譯時(shí)進(jìn)行的靜態(tài)關(guān)聯(lián),它沒有充分利用虛函數(shù)的特性7.5、虛函數(shù)3、虛函數(shù)和重載函數(shù)的關(guān)系在派生類中重新定義基類的虛函數(shù)是函數(shù)重載另一種形式,但它不同于一般的函數(shù)重載(1)當(dāng)普通的函數(shù)重載時(shí),其函數(shù)的參數(shù)或參數(shù)類型必須有所不同,函數(shù)的返回類型也可以不同;
但是,當(dāng)重載一個(gè)虛函數(shù)時(shí),也就是說在派生類中重新定義虛函數(shù)時(shí),要求函數(shù)名、返回類型、參數(shù)個(gè)數(shù)、參數(shù)的類型和順序與基類中的虛函數(shù)原型完全相同(2)多態(tài)的實(shí)現(xiàn)不同7.5、虛函數(shù)4、純虛函數(shù)和抽象類純虛函數(shù)是一個(gè)在基類中說明的虛函數(shù),它在該基類中沒有定義,但要求在它的派生類中定義自己的版本,或重新說明為純虛函數(shù)純虛函數(shù)的一般形式如下:
virtualtypefunc_name(參數(shù)表)=0;
這里,type是函數(shù)的返回類型,func_name是函數(shù)名,此形式與一般的虛函數(shù)的形式相同,只是在后面多了“=0”
7.5、虛函數(shù)#include<iostream.h>
classcircle{//聲明類circle
protected:
intr;//圓的半徑
public:
voidsetr(intx)//設(shè)定圓的半徑
{r=x; }
virtualvoidshow()=0;//定義純虛函數(shù)show()
};
//聲明派生類area——從circle類派生
classarea:publiccircle{
public:
voidshow()//重新定義虛函數(shù)show()
{cout<<"areais"<<3.14*r*r<<endl; }
};7.5、虛函數(shù)//聲明派生類perimeter——從circle類派生
classperimeter:publiccircle{//周長
public:
voidshow() //重新定義虛函數(shù)show()
{
cout<<"perimeteris"<<2*3.14*r<<endl;
}
};
voidmain()
{
circle*ptr;//聲明基類circle指針
areaob1;//聲明派生類area對(duì)象
perimeterob2;//聲明派生類perimeter對(duì)象7.5、虛函數(shù)
ob1.setr(10);//調(diào)用基類的方法設(shè)定對(duì)象的屬性
ob2.setr(10);//調(diào)用基類的方法設(shè)定對(duì)象的屬性
ptr=&ob1;//初始化基類指針
ptr->show();//多態(tài):指向基類的指針調(diào)用area類的成員函數(shù)
ptr=&ob2;
ptr->show();//多態(tài):指向基類的指針調(diào)用perimeter類的成員函數(shù)
}7.5、虛函數(shù)
在以上的例子中,circle是一個(gè)基類,它表示一個(gè)圓。從它可以派生出面積類area和周長類perimeter。
顯然,基類中定義的show()函數(shù)是沒有任何意義的,它只是用來提供派生類使用的公共接口,所以程序中將其定義為純虛函數(shù),但在派生類中,則根據(jù)它們自己的需要,具體地重新定義虛函數(shù)。編程過程中常常有這樣的情況,設(shè)計(jì)的基類是一個(gè)很抽象的概念,如形狀。其中計(jì)算面積的成員函數(shù)不能夠完全實(shí)現(xiàn),只能聲明為純虛函數(shù),而不必要定義函數(shù)體。7.5、虛函數(shù)含有純虛函數(shù)的被稱為抽象類:
classshape{//抽象類
virtualfloatarea()=0;//純虛函數(shù)
};設(shè)計(jì)抽象類的目的是為了多態(tài)地使用它的成員函數(shù);
對(duì)于抽象類是不能實(shí)例化的。必須通過繼承得到派生類后,在派生類中對(duì)純虛函數(shù)進(jìn)行了定義,再獲得派生類的對(duì)象7.5、虛函數(shù)抽象類和純虛函數(shù)的使用總結(jié):1、抽象類只能用作其他類的基類,不能實(shí)例化,必須通過繼承得到派生類后,在派生類中對(duì)純虛函數(shù)進(jìn)行了定義,再獲得派生類的對(duì)象2、抽象類中至少包含一個(gè)未定義功能的純虛函數(shù)設(shè)計(jì)抽象類的目的是為了多態(tài)地使用它的成員函數(shù)3、因?yàn)槌橄箢惒荒鼙硎揪唧w的類型,因此,抽象類不能用作參數(shù)類型、函數(shù)返回類型或進(jìn)行顯示類型轉(zhuǎn)換的類型。一般聲明為抽象類的指針或引用,該指針指向它的派生類,從而實(shí)現(xiàn)多態(tài)性7.5、虛函數(shù)4、純虛函數(shù)是在基類中聲明的虛函數(shù),并不在基類中進(jìn)行定義。如果在派生類中,并沒有對(duì)其抽象基類中的純虛函數(shù)進(jìn)行定義,則該虛函數(shù)在派生類中仍為純虛函數(shù),而該派生類也是一個(gè)抽象類5、在抽象基類中除了聲明純虛函數(shù)以外,還可以定義普通成員函數(shù)和虛函數(shù)??梢酝ㄟ^派生類的對(duì)象來訪問它們本章小結(jié)本章介紹了C++中關(guān)于多態(tài)性機(jī)制的相關(guān)知識(shí)。多態(tài)性使得程序內(nèi)需設(shè)計(jì)和實(shí)現(xiàn)易于擴(kuò)展和維護(hù),程序可以對(duì)層次中所有現(xiàn)有類的對(duì)象進(jìn)行一般性處理。多態(tài)性是通過虛函數(shù)機(jī)制來實(shí)現(xiàn)的,我們對(duì)虛函數(shù)的定義,使用進(jìn)行了詳細(xì)的介紹。同時(shí)介紹了抽象類和純虛函數(shù)在實(shí)際設(shè)計(jì)中的作用,并結(jié)合具體的例子介紹了抽象類和純虛函數(shù)的定義和使用。
運(yùn)算符重載在一定程度上提高了程序的可讀性,本章我們對(duì)運(yùn)算符重載的定義和使用進(jìn)行了介紹,并結(jié)合例子說明了幾種常用運(yùn)算符重載的實(shí)現(xiàn)。正確的使用運(yùn)算符可以增加程序的可讀性,但不合理的或過度的使用運(yùn)算符重載會(huì)使程序語義不清且難以閱讀。綜合訓(xùn)練1題目:
利用虛函數(shù)實(shí)現(xiàn)的多態(tài)性來求四種幾何圖形的面積之和。這四種幾何圖形是:三角形、矩形、正方形和圓。
幾何圖形的類型可以通過構(gòu)造函數(shù)或通過成員函數(shù)來設(shè)置綜合訓(xùn)練1分析:1、定義一個(gè)包含兩個(gè)虛函數(shù)的類:
class
Shape{
public:
virtual
float
Area(
void)
=0;//求面積
virtual
void
Setdata(float
,float
=0)
=0;//設(shè)置圖形數(shù)據(jù)
};因?yàn)镾hape的形狀是抽象的,無法計(jì)算面積和設(shè)置形狀數(shù)據(jù)綜合訓(xùn)練12、定義一個(gè)計(jì)算面積之和的類,該類中定義一個(gè)指向基類Shape的指針數(shù)組,其元素分別指向由基類Shape派生出的不同的幾何圖形類,并完成求出所有幾何圖形面積之和,以及設(shè)置參數(shù)的函數(shù)。為什么定義指針數(shù)組?綜合訓(xùn)練1classShape{
public:
virtualfloatArea(void)=0; //虛函數(shù)
virtualvoidSetdata(float,float=0)=0;//虛函數(shù)
};
classTriangle:publicShape{
floatW,H; //三角形邊長為W,高為H
public:
Triangle(floatw=0,floath=0)
{W=w;H=h;}
floatArea(void) //定義虛函數(shù)
{returnW*H/2;}
voidSetdata(float
w,floath=0)//定義虛函數(shù)
{
W=w;H=h;
}
};綜合訓(xùn)練1classRectangle:publicShape{
floatW,H; //矩形邊長為W,高為H
public:
Rectangle(floatw=0,floath=0){W=w;H=h;}
floatArea(void)//定義虛函數(shù)
{
returnW*H;
}
voidSetdata(float
w,floath=0)//定義虛函數(shù)
{
W=w;H=h;
}
};
綜合訓(xùn)練1classSquare:publicShape{
floatS;//正方形邊長S
public:
Square(floata=0)
{
S=a;
}
floatArea(void)//定義虛函數(shù)
{
returnS*S;
}
voidSetdata(floatw,floath=0)//定義虛函數(shù)
{
S=w;
}
};綜合訓(xùn)練1classCircle:publicShape{
floatR;//圓的半徑為R
public:
Circle(floatr=0)
{
R=r;
}
floatArea(void)//定義虛函數(shù)
{
return3.1415926*R*R;
}
voidSetdata(floatw,floath=0)//定義虛函數(shù)
{
R=w;
}
};綜合訓(xùn)練1classCompute{
Shape**s;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年陜西客運(yùn)資格證考試實(shí)際操作試題答案
- 2024年張家口客運(yùn)從業(yè)資格證考試題庫
- 2024年松原客運(yùn)從業(yè)資格證考試一點(diǎn)通
- 2024年連云港小型客運(yùn)從業(yè)資格證考試培訓(xùn)試題和答案
- 2024年荷澤小型客運(yùn)從業(yè)資格證考試
- 人教部編版六年級(jí)語文上冊(cè)《語文園地四》精美課件
- 玻璃采購與專業(yè)安裝一體化協(xié)議模板
- 第三章導(dǎo)數(shù)及其應(yīng)用(原題版)
- 幼兒園幼小銜接教育活動(dòng)總結(jié)
- 教師資格考試高級(jí)中學(xué)音樂面試試題及解答參考
- 平臺(tái)分銷返傭合作協(xié)議
- 中國城市行政代碼
- 低纖維蛋白原血癥的護(hù)理查房
- 數(shù)學(xué)4教材介紹
- 全國大學(xué)生職業(yè)生涯規(guī)劃大賽
- 肩關(guān)節(jié)鏡術(shù)的健康宣教
- 關(guān)于學(xué)校安全保衛(wèi)工作存在的問題及對(duì)策
- 2024年廣西鋁業(yè)集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 2024年西藏開發(fā)投資集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 愛校主題班會(huì)課件
- 黑龍江省哈爾濱市南崗區(qū)2023-2024學(xué)年九年級(jí)上學(xué)期期末語文試題
評(píng)論
0/150
提交評(píng)論