《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 李小斌 第12-16章 多態(tài)- 標(biāo)準(zhǔn)模板庫(kù)_第1頁(yè)
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 李小斌 第12-16章 多態(tài)- 標(biāo)準(zhǔn)模板庫(kù)_第2頁(yè)
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 李小斌 第12-16章 多態(tài)- 標(biāo)準(zhǔn)模板庫(kù)_第3頁(yè)
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 李小斌 第12-16章 多態(tài)- 標(biāo)準(zhǔn)模板庫(kù)_第4頁(yè)
《C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐》 課件 李小斌 第12-16章 多態(tài)- 標(biāo)準(zhǔn)模板庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩429頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第12章多態(tài)12.1 基類派生類對(duì)象賦值12.2 虛函數(shù)12.3 純虛函數(shù)12.4 虛析構(gòu)函數(shù)12.5 本章小結(jié)111不同類型的數(shù)據(jù)之間可以隱含實(shí)現(xiàn)自動(dòng)轉(zhuǎn)換和賦值,這種現(xiàn)象稱為類型的賦值兼容(見(jiàn)2.3.7)。對(duì)于基類和派生類兩者之間,也存在從派生類對(duì)象向基類對(duì)象的自動(dòng)轉(zhuǎn)換。不過(guò)這需要滿足一定的前提條件:公共繼承。從繼承方式可以看出,只有公共(public)繼承時(shí),基類的所有成員可以在派生類中保持訪問(wèn)屬性不變。而當(dāng)派生類對(duì)象賦值給基類對(duì)象時(shí),相當(dāng)于創(chuàng)建了一個(gè)擁有完整派生類成員數(shù)據(jù)子集的完整基類對(duì)象。而若將基類對(duì)象直接賦給派生類對(duì)象是行不通的,因?yàn)榕缮悓?duì)象中還有許多額外增加的成員數(shù)據(jù),這些數(shù)據(jù)的值并不能在賦值時(shí)確定值。12.1基類派生類對(duì)象賦值22(3)派生類對(duì)象地址可以賦給基類對(duì)象指針(2)派生類對(duì)象可以初始化基類對(duì)象引用。(4)參數(shù)為基類對(duì)象時(shí),均可以按照(1)(2)(3)的原則用派生類對(duì)象傳入。(1)派生類對(duì)象可以賦給基類對(duì)象。301#include<iostream>02usingnamespacestd;0304classPoint05{06private:07intx;08inty;09public:10Point(intx,inty)11{12this->x=x;13this->y=y;14}15voidshow()16{17cout<<"Point:("<<x<<","<<y<<")"<<endl;18}19};21classCircle:publicPoint22{23private:24intr;25public:26Circle(intx,inty,intr):Point(x,y)27{28this->r=r;29}30Circle(Circle&c):Point(c)31{32r=c.r;33}34voidshow()35{36cout<<"Circle:"<<r<<endl;37}38};39例12.1基類派生類對(duì)象賦值兼容示例440intmain()41{42Circlec1(2,3,10);43c1.show();44Circlec2(c1);45c2.show();46Pointp(0,0);47p=c1;48p.show();49Point*pp=&c1;50pp->show();51Point&rp=c1;52rp.show();53return0;54}例12.1基類派生類對(duì)象賦值兼容示例5虛函數(shù)技術(shù)是C++中用于實(shí)現(xiàn)動(dòng)態(tài)多態(tài)的技術(shù)。在基類的成員函數(shù)定義之前加上virtual關(guān)鍵字,則該函數(shù)就成為了一個(gè)虛函數(shù)。當(dāng)定義了一個(gè)虛函數(shù)后,在派生類中可以重定義此函數(shù)(定義一個(gè)和此函數(shù)同名、同參、同返回值的成員函數(shù)),程序運(yùn)行過(guò)程中,可以通過(guò)基類的指針或引用來(lái)指向某個(gè)派生類對(duì)象,在運(yùn)行時(shí),系統(tǒng)將會(huì)自動(dòng)調(diào)用相應(yīng)派生類的成員函數(shù),這就實(shí)現(xiàn)了運(yùn)行時(shí)候的多態(tài)。12.2虛函數(shù)66例12.2虛函數(shù)使用示例01#include<iostream>02usingnamespacestd;0304classShape05{06public:07voidshow()08{09cout<<"Shape"<<endl;10}11virtualvoidarea()12{13cout<<"area=0"<<endl;14}15};

7717classCircle:publicShape18{19private:20constdoublePI=3.14159;21intr;22public:23Circle(intr)24{25this->r=r;26}27voidshow()28{29cout<<"Circle"<<endl;30}31voidarea()32{33cout<<"area="<<PI*r*r<<endl;34}35};

37classSquare:publicShape38{39private:40intlength;41public:42Square(intlength)43{44this->length=length;45}46voidshow()47{48cout<<"Square"<<endl;49}50voidarea()51{52cout<<"area="<<length*length<<endl;53}54};5556intmain()57{58Circlec(5);59Squares(10);60//派生類對(duì)象方法調(diào)用61c.show();62c.area();63s.show();64s.area();65//將派生類對(duì)象賦給基類對(duì)象66Shapeobj=c;67obj.show();68obj.area();69obj=s;70obj.show();71obj.area();8872//將派生類對(duì)象地址賦給基類對(duì)象指針73Shape*pobj=&c;74pobj->show();75pobj->area();76pobj=&s;77pobj->show();78pobj->area();79//將派生類對(duì)象初始化基類對(duì)象引用80Shape&rc=c;81rc.show();82rc.area();83Shape&rs=s;84rs.show();85rs.area();86return0;87}12.3純虛函數(shù)virtual函數(shù)類型函數(shù)名(參數(shù)列表)[const]=0;至少包含一個(gè)純虛函數(shù)的類稱為抽象類,這種類不能直接創(chuàng)建對(duì)象。99例12.3抽象類示例01#include<iostream>02usingnamespacestd;0304classShape05{06public:07voidshow()08{09cout<<"Shape"<<endl;10}11virtualvoidarea()const=0;12};1314classCircle:publicShape15{16private:17constdoublePI=3.14159;18intr;101019public:20Circle(intr)21{22this->r=r;23}24voidshow()25{26cout<<"Circle"<<endl;27}28voidarea()const29{30cout<<"area="<<PI*r*r<<endl;31}32};3334classSquare:publicShape35{36private:37intlength;38public:39Square(intlength)40{41this->length=length;42}43voidshow()44{45cout<<"Square"<<endl;46}47voidarea()const48{49

cout<<"area="<<length*length<<endl;50}51};111153intmain()54{55Circlec(5);56Squares(10);57//將派生類對(duì)象地址賦給基類對(duì)象指針58Shape*pobj=&c;59pobj->show();60pobj->area();61pobj=&s;62pobj->show();63pobj->area();64//將派生類對(duì)象初始化基類對(duì)象引用65Shape&rc=c;66rc.show();67rc.area();68Shape&rs=s;69rs.show();70rs.area();71return0;72}12.4虛析構(gòu)函數(shù)析構(gòu)函數(shù)可以在對(duì)象被從內(nèi)存釋放之前做一些必要的輔助工作。派生類對(duì)象在被釋放時(shí)會(huì)首先調(diào)用自身的構(gòu)造函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù),這和構(gòu)造函數(shù)調(diào)用的順序相反。將基類的析構(gòu)函數(shù)定義成虛擬(virtual)類型,這樣在使用delete釋放基類對(duì)象指針?biāo)赶騼?nèi)存空間(實(shí)際上指向派生類對(duì)象)時(shí),可以同時(shí)調(diào)用派生類析構(gòu)函數(shù)和基類析構(gòu)函數(shù),這樣可以避免內(nèi)存泄露。1212例12.4虛析構(gòu)函數(shù)示例1301#include<iostream>02usingnamespacestd;0304classShape05{06public:07~Shape()08{09cout<<"DestructorShape"<<endl;10}11};1213classCircle:publicShape14{15public:16~Circle()17{18cout<<"DestructorCircle"<<endl;19}2021};1323classPoint24{25public:26virtual~Point()27{28cout<<"DestructorPoint"<<endl;29};30};3132classLine:publicPoint33{34public:35~Line()36{37cout<<"DestructorLine"<<endl;38}39};1441intmain()42{43//創(chuàng)建派生類對(duì)象賦值給派生類對(duì)象指針44Circle*pc=newCircle;45deletepc;46//創(chuàng)建派生類對(duì)象賦值給基類(不含虛析構(gòu)函數(shù))對(duì)象指針47Shape*ps=newCircle;48deleteps;49//創(chuàng)建派生類對(duì)象賦值給基類(含虛析構(gòu)函數(shù))對(duì)象指針50Point*pp=newLine;51deletepp;52return0;53}14編寫(xiě)一個(gè)抽象基類Shape,由它派生出2個(gè)派生類:Square(正方形)、Triangle(三角形)。用虛函數(shù)Area分別計(jì)算幾種圖形面積。寫(xiě)一個(gè)函數(shù)doubletotalarea(shape*s[],intn)。main函數(shù)中讀入2行數(shù)據(jù),依次為1個(gè)正方形和1個(gè)三角形的參數(shù),調(diào)用完totalarea函數(shù)后,輸出結(jié)果。圓周率pi取3.14。思考題1515第13章運(yùn)算符重載13.1實(shí)現(xiàn)基礎(chǔ)

13.2雙目運(yùn)算符重載13.3關(guān)系運(yùn)算符重載13.4單目運(yùn)算符重載13.5賦值運(yùn)算符重載13.6new與delete運(yùn)算符重載1616113.7特殊運(yùn)算符重載13.8類型轉(zhuǎn)換運(yùn)算符13.9輸入輸出運(yùn)算符重載13.10本章小結(jié)13.1實(shí)現(xiàn)基礎(chǔ)172對(duì)運(yùn)算符重載主要有兩種方式實(shí)現(xiàn):(1)利用成員函數(shù)形式實(shí)現(xiàn)運(yùn)算符重載。(2)利用友元函數(shù)形式實(shí)現(xiàn)運(yùn)算符重載。183例13.1:成員函數(shù)實(shí)現(xiàn)向量加法運(yùn)算符重載。#include<iostream>usingnamespacestd;

classVector{private:

intx;

inty;public:

Vector(intx=0,inty=0){

this->x=x;

this->y=y;

}

Vectoradd(Vector&v){

Vectorrv;

rv.x=x+v.x;

rv.y=y+v.y;

returnrv;}Vectoroperator+(Vector&v){Vectorrv;rv.x=x+v.x;rv.y=y+v.y;

returnrv;

}

voidshow()

{

cout<<'('<<x<<','<<y<<')'<<endl;

}};intmain(){

Vectorv1(1,2),v2(3,4),v3,v4;

v3=v1.add(v2);

v4=v1+v2;

v3.show();

v4.show();

return0;}194例13.2:友元函數(shù)實(shí)現(xiàn)向量加法運(yùn)算符重載。#include<iostream>usingnamespacestd;classVector{private:

intx;

inty;public:

Vector(intx=0,inty=0){

this->x=x;

this->y=y;}

voidshow(){

cout<<'('<<x<<','<<y<<')'<<endl;}

//友元形式,加法運(yùn)算符重載函數(shù)實(shí)現(xiàn)向量加法

friendVectoroperator+(Vector&v1,Vector&v2);};Vectoroperator+(Vector&v1,Vector&v2){

Vectorrv;

rv.x=v1.x+v2.x;

rv.y=v1.y+v2.y;

returnrv;}intmain(){

Vectorv1(1,2),v2(3,4),v3;

v3=v1+v2;

v3.show();

return0;}20513.2雙目運(yùn)算符重載對(duì)于算術(shù)雙目運(yùn)算符,包括算術(shù)運(yùn)算符(+,-,*,/,%)的重載均可以參考前一節(jié)中的示例來(lái)實(shí)現(xiàn)。對(duì)于其他雙目運(yùn)算符,比如邏輯運(yùn)算中的(&&,||)或者位運(yùn)算中的(&,|)等均可以采取類似的思路來(lái)實(shí)現(xiàn)。216例13.3:不同類型參數(shù)的算術(shù)運(yùn)算符+重載示例。#include<iostream>usingnamespacestd;classVector{private:

intx;

inty;public:

Vector(intx=0,inty=0){

this->x=x;

this->y=y;

}

voidshow()

{

cout<<'('<<x<<','<<y<<')'<<endl;}

//當(dāng)前對(duì)象與一個(gè)整數(shù)的算術(shù)加法運(yùn)算

Vectoroperator+(intn){

Vectorrv;

rv.x=x+n;

rv.y=y;

returnrv;}

friendVectoroperator+(intn,Vector&v);};Vectoroperator+(intn,Vector&v){

Vectorrv;

rv.x=v.x;

rv.y=v.y+n;

returnrv;}

intmain(){

Vectorv1(1,2),v2;

v2=v1+10;

v2.show();

v2=100+v1;

v2.show();

return0;}227

13.3關(guān)系運(yùn)算符重載C++支持各種關(guān)系運(yùn)算符,包括<、>、<=、>=、==、!=等等,它們可用于比較C++內(nèi)置的數(shù)據(jù)類型??梢杂贸蓡T函數(shù)或友元函數(shù)重載這些關(guān)系運(yùn)算符,重載后的關(guān)系運(yùn)算符可用于比較類的對(duì)象。238

例13.4:向量關(guān)系運(yùn)算符(<)示例#include<iostream>usingnamespacestd;classVector{private:

intx;

inty;public:

Vector(intx=0,inty=0)

{

this->x=x;

this->y=y;

}

//對(duì)象比較

booloperator<(Vector&v)

{

if(x<v.x&&y<v.y)

{

returntrue;}

returnfalse;

}};intmain(){

Vectorv1(1,2),v2(3,4);

if(v1<v2)

{

cout<<"v1islessthanv2"<<endl;

}

else

{

cout<<"v1isnotlessthanv2"<<endl;

}

return0;}24913.4單目運(yùn)算符重載單目運(yùn)算符包括自增(++),自減(--),負(fù)號(hào)(-),邏輯非(!)運(yùn)算符幾種,其中自增和自減運(yùn)算符還包括運(yùn)算符的前置和后置兩種情況。前置自增(++),前置自減(--),負(fù)號(hào)(-),以及邏輯非(!)的運(yùn)算符重載類似,而后置自增(++)以及后置自減(--)情況稍有不同。2510例13.5:單目運(yùn)算符重載示例。Vector(intx=0,inty=0){this->x=x;this->y=y;}voidshow(){cout<<"("<<x<<","<<y<<")"<<endl;}//前置++運(yùn)算Vector&operator++(){x++;y++;return*this;}//后置++運(yùn)算Vectoroperator++(int){Vectorv(*this);x++;y++;returnv;}//前置-運(yùn)算Vector&operator-(){x=-x;y=-y;return(*this);}//前置!運(yùn)算

Vector&operator!(){x=-x;return(*this);}Vectorv1(1,2),v2;cout<<"v1=";v1.show();cout<<"v2=++v1"<<endl;v2=++v1;//調(diào)用前置++運(yùn)算cout<<"v1=";v1.show();cout<<"v2=";v2.show();cout<<"v2=v1++"<<endl;v2=v1++;//調(diào)用后置++運(yùn)算cout<<"v1=";v1.show();cout<<"v2=";v2.show();cout<<"v2=-v1"<<endl;v2=-v1;//調(diào)用前置-運(yùn)算

cout<<"v1=";v1.show();cout<<"v2=";v2.show();cout<<"v2=!v1"<<endl;v2=!v1;//調(diào)用前置!運(yùn)算cout<<"v1=";v1.show();cout<<"v2=";v2.show();112613.5賦值運(yùn)算符重載類在建立后,會(huì)有默認(rèn)的賦值運(yùn)算函數(shù),也就是進(jìn)行同類對(duì)象之間的賦值,但這種賦值只是對(duì)應(yīng)數(shù)據(jù)成員之間的淺拷貝,對(duì)于涉及到指針指向的更多被分配的內(nèi)存(使用new運(yùn)算符分配的堆區(qū)內(nèi)存),并不能自動(dòng)進(jìn)行動(dòng)態(tài)分配內(nèi)存后拷貝,這個(gè)問(wèn)題和默認(rèn)的拷貝構(gòu)造函數(shù)類似。賦值運(yùn)算符=可以被重載,可以拓展對(duì)象被賦值的范圍,或者修改默認(rèn)賦值運(yùn)算中的淺拷貝帶來(lái)的問(wèn)題,比如內(nèi)存重復(fù)釋放(見(jiàn)10.5)。12例13.6

賦值運(yùn)算符重載示例。classmyString{private:intlen;char*pstr;voidcopyString(constchar*srcString){pstr=newchar[len];char*mypc=pstr;for(inti=0;srcString[i]!='\0';i++,mypc++){*mypc=srcString[i];}*mypc='\0';}public:myString(){len=0;pstr=NULL;}voidshowString(){cout<<pstr<<endl;}voidoperator=(constchar*srcString){cout<<"overloadedfunction(1)"<<endl;len=0;for(inti=0;srcString[i]!='\0';i++,len++);copyString(srcString);}voidoperator=(constmyString&obj){cout<<"overloadedfunction(2)"<<endl;len=obj.len;copyString(obj.pstr);}~myString(){delete[]pstr;}};intmain(){myStringobj1,obj2;obj1="IloveC++";//調(diào)用重載函數(shù)(1)obj1.showString();obj2=obj1;//調(diào)用重載函數(shù)(2)obj2.showString();return0;}1313.6new與delete運(yùn)算符重載在C++中動(dòng)態(tài)內(nèi)存申請(qǐng)使用new運(yùn)算符,動(dòng)態(tài)內(nèi)存釋放使用delete運(yùn)算符。在使用new運(yùn)算符時(shí),系統(tǒng)首先需要分配合適的內(nèi)存,然后調(diào)用類的構(gòu)造函數(shù)。使用delete運(yùn)算符時(shí),系統(tǒng)首先調(diào)用類的析構(gòu)函數(shù),然后釋放對(duì)象所占用的內(nèi)存。14【例13.7】new和delete運(yùn)算符重載。//全局new函數(shù)重載void*operatornew(size_tlen){

cout<<"globalnew"<<endl;

void*ptr=malloc(len);

returnptr;}//全局delete函數(shù)重載voidoperatordelete(void*ptr){

cout<<"globaldelete"<<endl;

if(ptr!=NULL){

free(ptr);

}}classmyString{public:

intlen;

myString(intl)

{

len=l;}//類內(nèi)new函數(shù)重載void*operatornew(size_tl){cout<<"classnew"<<endl;

void*ptr=malloc(l);

returnptr;

}

//類內(nèi)delete函數(shù)重載

voidoperatordelete(void*ptr)

{

cout<<"classdelete"<<endl;

if(ptr!=NULL){

free(ptr);

}}

voidshow()

{

cout<<"myStringlen:"<<len<<endl;}

~myString(){

cout<<"Destruction"<<endl;

}};intmain(){

//調(diào)用全局new和delete函數(shù)

int*pi=newint(100);

cout<<"int:"<<*pi<<endl;

deletepi;

//調(diào)用類內(nèi)new和delete函數(shù)

myString*pobj=newmyString(200);

pobj->show();

deletepobj;3013.7特殊運(yùn)算符重載C++中還存在一些可以進(jìn)行運(yùn)算符重載的特殊運(yùn)算符,比如(),->,逗號(hào),[]等。31

13.7.1()函數(shù)調(diào)用運(yùn)算符函數(shù)調(diào)用運(yùn)算符()可以被重載成可以調(diào)用多種參數(shù)的函數(shù)調(diào)用。這種形式可以把對(duì)象當(dāng)作函數(shù)的形式來(lái)使用,有時(shí)也稱為函數(shù)對(duì)象或仿函數(shù)。例13.8()函數(shù)調(diào)用重載示例。32classScreen{private:intx;inty;public:Screen(intx,inty){this->x=x;this->y=y;}//無(wú)參的()重載函數(shù)voidoperator()(){cout<<"x="<<x<<",y="<<y<<endl;}//有參的()重載函數(shù)voidoperator()(intz){cout<<"x="<<x+z/2<<",y="<<y+z/2<<endl;}};intmain(){Screenobj(1080,900);obj();//調(diào)用無(wú)參的()重載函數(shù)obj(1000);//調(diào)用有參的()重載函數(shù)return0;}3313.7.2->成員訪問(wèn)運(yùn)算符成員訪問(wèn)運(yùn)算符->可以作為類的成員函數(shù)被重載,重載后,類在形式上具有了指針的功能,該函數(shù)內(nèi)部需要返回一個(gè)指針。例13.9

->成員訪問(wèn)運(yùn)算符重載示例。34structPixel{intx;inty;};classScreen{private:Pixel*origin;public:Screen(intx,inty){origin=newPixel;origin->x=x;origin->y=y;}//->運(yùn)算符重載Pixel*operator->(){returnorigin;}

~Screen(){deleteorigin;cout<<"Destruction"<<endl;}};intmain(){Screenobj(1000,2000);cout<<"x="<<obj->x<<",y="<<obj->y<<endl;return0;}3513.7.3[]下標(biāo)訪問(wèn)運(yùn)算符下標(biāo)訪問(wèn)運(yùn)算符[]的重載可以訪問(wèn)類內(nèi)數(shù)組中的元素,使用該運(yùn)算符重載可以克服C++中一般數(shù)組下標(biāo)訪問(wèn)可能會(huì)越界的問(wèn)題,通過(guò)對(duì)該運(yùn)算符的重載,可以為自定義的數(shù)據(jù)提供安全的數(shù)組訪問(wèn)。例13.10

下標(biāo)訪問(wèn)運(yùn)算符重載示例。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐3621classmyString{private:intlen;char*pstr;public:myString(constchar*str){for(len=0;str[len]!='\0';len++);pstr=newchar[len];for(inti=0;i<len;i++){pstr[i]=str[i];}pstr[len]='\0';}//下標(biāo)訪問(wèn)運(yùn)算符[]的重載charoperator[](intindex){if(index>len||index<0){returnpstr[0];}returnpstr[index];}voidshow(){cout<<pstr<<endl;}

~myString(){

if(len)

{

delete[]pstr;}

}};intmain(){

myStringobj("IloveC++");

obj.show();

cout<<obj[100]<<'\t'<<obj[3]<<'\t'<<obj[100]<<endl;

return0;}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐372213.8類型轉(zhuǎn)換運(yùn)算符用戶自定義類的有時(shí)需要向其他類型轉(zhuǎn)換,或者將其他類型轉(zhuǎn)換為用戶自定義的類,這就需要使用兩種方法,一種是其他類型向當(dāng)前類轉(zhuǎn)換的轉(zhuǎn)換構(gòu)造函數(shù),另一種是當(dāng)前類向其他類型轉(zhuǎn)換的類型轉(zhuǎn)換運(yùn)算符重載。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2313.8.1轉(zhuǎn)換構(gòu)造函數(shù):其他類型向類轉(zhuǎn)換通過(guò)轉(zhuǎn)換構(gòu)造函數(shù),可以將基礎(chǔ)數(shù)據(jù)類型或其他類類型轉(zhuǎn)換為當(dāng)前類類型,從而實(shí)現(xiàn)其他類型向當(dāng)前類的轉(zhuǎn)換,這種功能的實(shí)現(xiàn)依賴于只有一個(gè)參數(shù)的構(gòu)造函數(shù)。

例13.11

轉(zhuǎn)換構(gòu)造函數(shù)示例。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐24classVector{private:

intx;

inty;public:

Vector(){

x=y=-1;

}

//顯式轉(zhuǎn)換

explicitVector(inti)

{

x=i;

y=0;

}

//隱式轉(zhuǎn)換

Vector(charc)

{

x=y=c;

}

voidshow()

{

cout<<"("<<x<<","<<y<<")"<<endl;

}};intmain(){

Vectorv;

v.show();

v=static_cast<Vector>(3);//必須顯式轉(zhuǎn)換

v.show();

v='z';//支持隱式轉(zhuǎn)換

v.show();

return0;}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2513.8.2類型轉(zhuǎn)換運(yùn)算符:類向其他類型轉(zhuǎn)換類型轉(zhuǎn)換函數(shù)可以將當(dāng)前類轉(zhuǎn)換為其他類類型,一般是轉(zhuǎn)換為基礎(chǔ)數(shù)據(jù)類型,此時(shí)可以定義一個(gè)類型重載函數(shù),語(yǔ)法形式如下: operator類型名()const { 轉(zhuǎn)換功能; return類型值; } 該函數(shù)無(wú)需返回值類型定義,直接返回對(duì)應(yīng)類型的值即可。例13.12

類型轉(zhuǎn)換運(yùn)算符重載示例。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐26classVector{private:intx;inty;public:Vector(){x=y=-1;}//將當(dāng)前類類型轉(zhuǎn)換為int類型operatorint()const{returnx;}};intmain(){Vectorv;inti=3+v;cout<<i<<endl;return0;}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2713.9輸入輸出運(yùn)算符重載>>運(yùn)算符的重載形式為: istream&operator>>(istream&is,類名&對(duì)象名) { 實(shí)現(xiàn)輸入功能; returnis; } <<運(yùn)算符的重載形式為: ostream&operator<<(ostream&os,類名&對(duì)象名) { 實(shí)現(xiàn)輸出功能; returnos; }

例13.13

輸入輸入運(yùn)算符重載示例。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐28classmyString{private:intlen;char*pstr;public:myString(){len=0;pstr=NULL;}//重載=運(yùn)算符voidoperator=(constchar*str){if(len){delete[]pstr;}for(len=0;str[len]!='\0';len++);pstr=newchar[len];for(inti=0;i<len;i++){pstr[i]=str[i];}pstr[len]='\0';}~myString(){if(len){

delete[]pstr;}}

//重載>>運(yùn)算符

friendistream&operator>>(istream&is,myString&obj);

//重載<<運(yùn)算符

friendostream&operator<<(ostream&os,myString&obj);};istream&operator>>(istream&is,myString&obj){

chartemp[80];

cin.getline(temp,80);

obj=temp;

returnis;}ostream&operator<<(ostream&os,myString&obj){

os<<obj.pstr<<endl;

returnos;}intmain(){

myStringobj1,obj2;

cin>>obj1>>obj2;

cout<<"Yourinput:"<<endl;

cout<<obj1<<obj2;

return0;}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2913.10本章小結(jié)本章介紹了運(yùn)算符重載技術(shù)。運(yùn)算符重載可以將現(xiàn)有的各類運(yùn)算符作用到自定義的類中,從而增強(qiáng)類的功能及提高使用類的便捷性。在實(shí)現(xiàn)運(yùn)算符重載時(shí),可以使用成員函數(shù)或者友元函數(shù)兩種方式實(shí)現(xiàn),大部分運(yùn)算符重載均可以使用這兩種方式實(shí)現(xiàn),但有部分運(yùn)算符只能使用某一種方式實(shí)現(xiàn)。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐4530

思考題1.定義一個(gè)復(fù)數(shù)類Complex,要求滿足如下條件:(1)兩個(gè)私有浮點(diǎn)成員,分別表示實(shí)部和虛部;(2)利用成員函數(shù)重載實(shí)現(xiàn)“+”運(yùn)算。并編寫(xiě)一個(gè)測(cè)試程序。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐第14章

文件

114.1文件文本14.2二進(jìn)制文本14.3文件隨機(jī)訪問(wèn)14.4應(yīng)用14.5本章小結(jié)C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2第14章 文件

文件是存儲(chǔ)在外部在外部存儲(chǔ)設(shè)備上的數(shù)據(jù)集合。外部存儲(chǔ)包括磁盤(pán)、硬盤(pán)、U盤(pán)、光盤(pán)等各類介質(zhì),和內(nèi)存不同,外存可以在斷電之后長(zhǎng)久保存數(shù)據(jù)。從程序設(shè)計(jì)的角度來(lái)看,可以將文件分成文本文件和二進(jìn)制文件兩大類,C++中文件進(jìn)行讀寫(xiě)操作時(shí)是基于文件為輸入輸出對(duì)象的文件流來(lái)進(jìn)行的。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐3第14章 文件

合計(jì)有三個(gè)類:(1)ifstream類,輸入文件流類,用于從文件輸入數(shù)據(jù)到內(nèi)存。(2)ofstream類,輸出文件流類,用于從內(nèi)存輸出數(shù)據(jù)到文件。(3)fstream類,輸入/輸出文件流類,具備上述兩個(gè)類的功能。在使用上述類的時(shí)候,頭文件需要包含fstream。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐4第14章 文件

對(duì)某個(gè)文件的操作總體上可以分為四個(gè)步驟:步驟1:建立文件流對(duì)象??梢曰谇笆龅娜齻€(gè)類(ifstream,ofstream,fstream)定義相應(yīng)的文件流對(duì)象。步驟2:打開(kāi)文件并和文件流對(duì)象關(guān)聯(lián),(1)(2)兩步可以合并。利用文件流類中定義的文件打開(kāi)函數(shù)打開(kāi)文件,文件打開(kāi)函數(shù)open的語(yǔ)法形式:voidopen(文件名,打開(kāi)方式);其中打開(kāi)方式可以選擇或組合表下表中的值。打開(kāi)方式 含義ios::in 以輸入方式打開(kāi)文件ios::out 以輸出方式打開(kāi)文件ios::binary 以二進(jìn)制方式打開(kāi)文件,無(wú)此方式則默認(rèn)以文本文件方式打開(kāi)ios::app 以輸出方式打開(kāi)文件,并將初始輸出位置設(shè)置在末尾ios::ate 打開(kāi)文件,并指向文件末尾ios::trunc 打開(kāi)文件,若文件不存在,創(chuàng)建新文件;若文件存在,文件內(nèi)容清空。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐5第14章 文件

打開(kāi)方式可以通過(guò)位或“|”運(yùn)算符組合表中的打開(kāi)方式,比如ios::in|ios::binary表示以二進(jìn)制輸入方式打開(kāi)文件,ios::out|ios::binary表示已二進(jìn)制輸出方式打開(kāi)文件等。打開(kāi)操作之后可以用is_open()函數(shù)判斷是否成功打開(kāi)文件,若為0則表示打開(kāi)失敗,此時(shí)后續(xù)的對(duì)文件的操作都無(wú)法正常進(jìn)行。步驟3:讀寫(xiě)文件。對(duì)于文本文件可以采取類似于cin和cout中讀寫(xiě)數(shù)據(jù)的方式進(jìn)行,比如流的插入運(yùn)算符“<<”,流的提取運(yùn)算符“>>”,put,get,getline等均可以使用。對(duì)于二進(jìn)制文件可以使用文件流中的read和write函數(shù)進(jìn)行。文件讀寫(xiě)時(shí),系統(tǒng)中會(huì)設(shè)置一個(gè)表示當(dāng)前文件讀寫(xiě)的位置標(biāo)志,每一次讀寫(xiě)相應(yīng)長(zhǎng)度數(shù)據(jù)時(shí),該位置會(huì)自動(dòng)向后移動(dòng)。在文件隨機(jī)訪問(wèn)(見(jiàn)14.3)時(shí),也可以調(diào)整該位置標(biāo)志從而可以更靈活地檢索數(shù)據(jù)。當(dāng)文件位置標(biāo)志移動(dòng)到文件末尾(文件結(jié)束符占有1個(gè)字節(jié),值為-1)時(shí),文件流對(duì)象的成員函數(shù)eof為非0,表示文件結(jié)束。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐614.1

文本文件

文本文件又稱ASCII文件或字符文件,文件中每一個(gè)字節(jié)表示一個(gè)ASCII碼,各類文本編輯器(如Windows系統(tǒng)中記事本軟件,Vim、Emacs等)編輯保存的文件,C++源代碼(.cpp)等均是文本文件。文本文件一般可以直接用各類文本編輯器直接打開(kāi)查看。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐714.1文本文件14.1.1寫(xiě)文本文件14.1.2讀文本文件16//利用流插入運(yùn)算符輸出整數(shù)17for(inti=0;i<=N;i++)18{19outputfile<<i*100<<'\t';20}21outputfile<<endl;22//利用put函數(shù)輸出字符23for(inti=0;i<=N;i++)24{25outputfile.put('a'+i);26outputfile.put('\t');27}28outputfile.close();29return0;30}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐8【例】文本文件輸出。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405intmain()06{07constintN=5;08ofstreamoutputfile;09outputfile.open("d:\\test.txt",ios::out);10//判斷文件是否成功打開(kāi)11if(!outputfile.is_open())12{13cout<<"openfileerror"<<endl;14return1;15}當(dāng)以輸出文本形式打開(kāi)文本文件時(shí),可以使用流的插入運(yùn)算符“<<”或put函數(shù)對(duì)輸出文件流進(jìn)行寫(xiě)操作。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐9程序運(yùn)行后,控制臺(tái)沒(méi)有輸出,需要用文本編輯軟件(比如windows中的記事本)打開(kāi)d:\test.txt文件。其中可以看到16//利用流提取運(yùn)算符讀取整數(shù)17inttmp;18for(inti=0;i<=N;i++)19{20inputfile>>tmp;21cout<<tmp<<'\t';22}23//利用get函數(shù)輸入字符24charc;25for(inti=0;i<=N+7;i++)26{27inputfile.get(c);28cout<<c;29}30inputfile.close();31return0;32}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐10【例】文本文件輸入示例:讀取上一個(gè)程序生成的test.txt文件。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405intmain()06{07constintN=5;08ifstreaminputfile;09inputfile.open("d:\\test.txt",ios::in);10//判斷文件是否成功打開(kāi)11if(!inputfile.is_open())12{13cout<<"openfileerror"<<endl;14return1;15}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐11C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐1214.2二進(jìn)制文件

二進(jìn)制文件是將數(shù)據(jù)按照內(nèi)存中的存儲(chǔ)格式直接輸出到外部存儲(chǔ)設(shè)備中,一般不能直接用文本編輯器打開(kāi)查看數(shù)據(jù)的文件,比如C++的目標(biāo)文件(.obj)或可執(zhí)行文件(.exe)等均為二進(jìn)制文件。二進(jìn)制文件一般需要能解析其內(nèi)部具體結(jié)構(gòu)的軟件來(lái)打開(kāi)查看,比如windows系統(tǒng)下的圖像文件(后綴為bmp)可以用畫(huà)圖軟件來(lái)打開(kāi)。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐1314.2二進(jìn)制文件14.2.1寫(xiě)二進(jìn)制文件14.2.2讀二進(jìn)制文件

C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐1414.2.1

寫(xiě)二進(jìn)制文件

二進(jìn)制數(shù)據(jù)輸出到文件可以用輸出文件流對(duì)象的write函數(shù)實(shí)現(xiàn):ofstream&write(constchar*buffer,intn);第一個(gè)參數(shù)表示將要輸出的二進(jìn)制數(shù)據(jù)在內(nèi)存中的起始位置,該位置需要轉(zhuǎn)化為字符指針表示,這里的參數(shù)用const修飾,也就是在輸出過(guò)程中不會(huì)修改內(nèi)存的數(shù)據(jù)。第二個(gè)參數(shù)表示輸出的二進(jìn)制數(shù)據(jù)的的長(zhǎng)度(字節(jié)數(shù))。16//定義文件流對(duì)象17ofstreamoutputfile;18outputfile.open("d:\\test.dat",ios::out|ios::binary);19//判斷文件是否成功打開(kāi)20if(!outputfile.is_open())21{22cout<<"openfileerror"<<endl;23return1;24}25//利用write方法輸出結(jié)構(gòu)體26outputfile.write((char*)&stu1,sizeof(stu1));27outputfile.write((char*)&stu2,sizeof(stu2));28//關(guān)閉文件29outputfile.close();30return0;31}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐15【例】二進(jìn)制文件輸出示例。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405structStudent06{07charname[10];08intage;09floatscore;10};1112intmain()13{14Studentstu1={"Zhang",20,90.5};15Studentstu2={"Li",19,95.5};C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐16運(yùn)行結(jié)果:運(yùn)行后在e盤(pán)上生成了test.dat文件,該文件不能直接打開(kāi)查看,需要用下一節(jié)的程序打開(kāi)查看結(jié)果。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐1714.2.2

讀二進(jìn)制文件

二進(jìn)制文件輸入數(shù)據(jù)可以用輸入文件流對(duì)象的read函數(shù)實(shí)現(xiàn):ofstream&read(char*buffer,intn);第一個(gè)參數(shù)表示將要從二進(jìn)制文件讀取的數(shù)據(jù)存放在內(nèi)存中的起始位置,該位置需要轉(zhuǎn)化為字符指針表示。第二個(gè)參數(shù)表示讀取的二進(jìn)制數(shù)據(jù)的的長(zhǎng)度(字節(jié)數(shù))。16ifstreaminputfile;17inputfile.open("d:\\test.dat",ios::in|ios::binary);18//判斷文件是否成功打開(kāi)19if(!inputfile.is_open())20{21cout<<"openfileerror"<<endl;22return1;23}24//利用read方法讀取結(jié)構(gòu)體25inputfile.read((char*)&stu,sizeof(stu));26cout<<<<'\t'<<stu.age<<'\t'<<stu.score<<endl;27inputfile.read((char*)&stu,sizeof(stu));28cout<<<<'\t'<<stu.age<<'\t'<<stu.score<<endl;29//關(guān)閉文件30inputfile.close();31return0;32}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐18【例】二進(jìn)制文件讀取示例。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405structStudent06{07charname[10];08intage;09floatscore;10};1112intmain()13{14Studentstu;15//定義文件流對(duì)象C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐19C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2014.3

文件隨機(jī)訪問(wèn)

文件讀寫(xiě)時(shí),系統(tǒng)中會(huì)設(shè)置一個(gè)表示當(dāng)前文件讀寫(xiě)位置(數(shù)值)。先前的文件讀寫(xiě)均是從文件頭部開(kāi)始按順序進(jìn)行的,每讀寫(xiě)長(zhǎng)度n的單元,則該文件讀寫(xiě)位置將向前移動(dòng)n,比如讀寫(xiě)一個(gè)字符c,則文件讀寫(xiě)位置向前移動(dòng)1,讀寫(xiě)一個(gè)結(jié)構(gòu)體變量x,則文件讀寫(xiě)位置向前移動(dòng)sizeof(x)。如果需要對(duì)文件中的某些特定位置的數(shù)據(jù)進(jìn)行讀寫(xiě)操作,則需要定位到文件中的具體位置。我們可以使用相關(guān)的文件隨機(jī)(不固定位置的操作)訪問(wèn)函數(shù)對(duì)文件讀寫(xiě)位置進(jìn)行設(shè)置來(lái)達(dá)到對(duì)文件的隨機(jī)操作,如下表所示。成員函數(shù) 功能tellg() 對(duì)于輸入文件,獲得當(dāng)前文件讀位置seekg(pos) 對(duì)于輸入文件,設(shè)置讀位置到pos位置seekg(offset,dir) 對(duì)于輸入文件,設(shè)置讀位置。參數(shù)dir為以下三者之一:ios::beg文件開(kāi)始ios::cur當(dāng)前位置ios::end文件末尾參數(shù)offset為偏移量(以dir為參考位置)tellp() 對(duì)于輸出文件,獲得當(dāng)前文件寫(xiě)位置seekp(pos) 對(duì)于輸出文件,設(shè)置寫(xiě)位置到pos位置seekp(offset,dir) 對(duì)于輸出文件,設(shè)置寫(xiě)位置。參數(shù)參考先前的seekg(offset,dir)的參數(shù)說(shuō)明。C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2114.3.1

隨機(jī)訪問(wèn)本文件

隨機(jī)訪問(wèn)文本文件的讀寫(xiě)位置以字符(字節(jié))為單位自動(dòng)移動(dòng),在寫(xiě)操作時(shí),如果用流的插入運(yùn)算符“<<”,則向前移動(dòng)右操作數(shù)的字節(jié)數(shù),用put函數(shù)操作則向前移動(dòng)一個(gè)字節(jié)數(shù)。讀操作時(shí),如果用流的提取運(yùn)算符“>>”,則向前移動(dòng)右操作數(shù)的字節(jié)數(shù),用get函數(shù)操作則向前移動(dòng)一個(gè)字節(jié)數(shù)。15outputfile<<"helloworld"<<endl;16outputfile.close();17//以隨機(jī)方式訪問(wèn)并讀入文本文件18ifstreaminputfile;19inputfile.open("d:\\test.txt",ios::in);20if(!inputfile.is_open())21{22cout<<"openfileerror"<<endl;23return1;24}25cout<<inputfile.tellg()<<endl;26charc[80];27inputfile.seekg(6,ios::beg);//讀入距離文件開(kāi)始偏移6個(gè)字符的位置28cout<<inputfile.tellg()<<endl;29inputfile>>c;30cout<<inputfile.tellg()<<endl;31cout<<c<<endl;32inputfile.close();33return0;34}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐22【例】隨機(jī)訪問(wèn)文本文件示例。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405intmain()06{07//生成一個(gè)包含helloworld字符串的文本文件08ofstreamoutputfile;09outputfile.open("d:\\test.txt",ios::out);10if(!outputfile.is_open())11{12cout<<"openfileerror"<<endl;13return1;14}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐23C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2414.3.2

隨機(jī)訪問(wèn)二進(jìn)制文件

隨機(jī)訪問(wèn)二進(jìn)制文件的讀寫(xiě)位置以read或write中第二個(gè)參數(shù)(字節(jié)數(shù))自動(dòng)移動(dòng)。12intmain()13{14//寫(xiě)入文件15Studentstu1={"Zhang",20,90.5};16Studentstu2={"Li",19,95.5};17ofstreamoutputfile;18outputfile.open("d:\\test.dat",ios::out|ios::binary);19if(!outputfile.is_open())20{21cout<<"openfileerror"<<endl;22return1;23}24outputfile.write((char*)&stu1,sizeof(stu1));25outputfile.write((char*)&stu2,sizeof(stu2));26outputfile.close();27//以隨機(jī)方式讀入文件28Studentstu;29ifstreaminputfile;30inputfile.open("d:\\test.dat",ios::in|ios::binary);C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐25【例】隨機(jī)訪問(wèn)二進(jìn)制文件示例。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405structStudent06{07charname[10];08intage;09floatscore;10};11C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐2631if(!inputfile.is_open())32{33cout<<"openfileerror"<<endl;34return1;35}36cout<<inputfile.tellg()<<endl;37inputfile.seekg(sizeof(stu),ios::cur);38cout<<inputfile.tellg()<<endl;39inputfile.read((char*)&stu,sizeof(stu));40cout<<inputfile.tellg()<<endl;41cout<<<<'\t'<<stu.age<<'\t'<<stu.score<<endl;42inputfile.close();43return0;44}16ofstreamoutputfile;17outputfile.open("d:\\test1.txt",ios::out);18if(!outputfile.is_open())19{20cout<<"openfileerror"<<endl;21return1;22}23//從輸入文件依次讀取字符轉(zhuǎn)換后輸出24charch;25while(!inputfile.eof())26{27inputfile.get(ch);28if(ch>='a'&&ch<='z')29{30ch=ch-'a'+'A';31}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐27【例】將一個(gè)文本文件中字符轉(zhuǎn)化為大寫(xiě)輸出到另外一個(gè)文本文件。程序代碼:01#include<iostream>02#include<fstream>03usingnamespacestd;0405intmain()06{07//打開(kāi)輸入文件08ifstreaminputfile;09inputfile.open("d:\\test.txt",ios::in);10if(!inputfile.is_open())11{12cout<<"openfileerror"<<endl;13return1;14}15//打開(kāi)輸出文件C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐28【例】將一個(gè)文本文件中字符轉(zhuǎn)化為大寫(xiě)輸出到另外一個(gè)文本文件。32outputfile.put(ch);33}34//關(guān)閉兩個(gè)文件35inputfile.close();36outputfile.close();37return0;38}運(yùn)行結(jié)果:用文本編輯軟件(記事本)編輯保存test.txt文件,文件內(nèi)容:helloThisisatestfile.程序運(yùn)行后,生成test1.txt文件,文件內(nèi)容:HELLOTHISISATESTFILE..11//生成初始文件12voidgenerateFile()13{14constintN=5;15Studentstu[N]={{"Zhao",20,90.5}16,{"Qian",19,95.5}17,{"Sun",21,76}18,{"Li",22,80}19,{"Zhou",20,78}};20ofstreamoutputfile;21outputfile.open("d:\\test.dat",ios::out|ios::binary);22if(!outputfile.is_open())23{24cout<<"openfileerror"<<endl;25return;26}C++程序設(shè)計(jì)及項(xiàng)目實(shí)踐29【例】將一個(gè)二進(jìn)制的學(xué)生文件冒泡排序后輸出到另外一個(gè)二進(jìn)制文件。程序代碼:01#include<

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論