類和動態(tài)內(nèi)存分配_第1頁
類和動態(tài)內(nèi)存分配_第2頁
類和動態(tài)內(nèi)存分配_第3頁
類和動態(tài)內(nèi)存分配_第4頁
類和動態(tài)內(nèi)存分配_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

類和動態(tài)內(nèi)存分配第一頁,共五十八頁,編輯于2023年,星期一提要本章介紹對類使用動態(tài)分配技術(shù),以及由此引起的問題的處理。動態(tài)內(nèi)存的使用將影響構(gòu)造函數(shù),析構(gòu)函數(shù)的設(shè)計和操作符的重載第二頁,共五十八頁,編輯于2023年,星期一12.1動態(tài)內(nèi)存和類一個使用動態(tài)內(nèi)存的例子classStringBad{private:char*str;//pointertostringintlen;//lengthofstringstaticintnum_strings;//numberofobjectspublic:StringBad(constchar*s);//constructorStringBad();//defaultconstructor~StringBad();//destructor//friendfunction friendstd::ostream&operator<<(std::ostream&os,constStringBad&st);};第三頁,共五十八頁,編輯于2023年,星期一以下是其實現(xiàn)(stringbad.cpp)靜態(tài)類成員的初始化intStringBad::num_strings=0;

///注意:靜態(tài)類成員位于靜態(tài)存儲區(qū),并不是類對象的組成部分;在類聲明中聲明,不可初始化(靜態(tài)const整型或枚舉除外除外);在類方法實現(xiàn)文件中初始化。使用類型名和定義域限制操作符,不用關(guān)鍵字static。第四頁,共五十八頁,編輯于2023年,星期一然后是構(gòu)造函數(shù)StringBad::StringBad(constchar*s){len=std::strlen(s);//setsizestr=newchar[len+1];//allotstoragestd::strcpy(str,s);//initializepointernum_strings++;//setobjectcountcout<<num_strings<<":\""<<str<<"\"objectcreated\n";//ForYourInformation}注意:字符串并沒有保存在對象中,而是在單獨的堆內(nèi)存中。對象中存儲字符串的地址。第五頁,共五十八頁,編輯于2023年,星期一析構(gòu)函數(shù)StringBad::~StringBad()//necessarydestructor{cout<<"\""<<str<<"\"objectdeleted,";//FYI--num_strings;//requiredcout<<num_strings<<"left\n";//FYIdelete[]str;//required}此處析構(gòu)函數(shù)是必須的。在構(gòu)造函數(shù)中用new分配內(nèi)存,必須在析構(gòu)函數(shù)中用delete釋放內(nèi)存第六頁,共五十八頁,編輯于2023年,星期一文件vegnews.cpp是使用上述類的主程序。其中定義了兩個函數(shù):一個傳引用作參數(shù),一個傳值作參數(shù)voidcallme1(StringBad&rsb){cout<<"Stringpassedbyreference:\n";cout<<"\""<<rsb<<"\"\n";}voidcallme2(StringBadsb){cout<<"Stringpassedbyvalue:\n";cout<<"\""<<sb<<"\"\n";}第七頁,共五十八頁,編輯于2023年,星期一1:"CeleryStalksatMidnight"objectcreated2:"LettucePrey"objectcreated3:"SpinachLeavesBowlforDollars"objectcreatedheadline1:CeleryStalksatMidnightheadline2:LettucePreysports:SpinachLeavesBowlforDollarsStringpassedbyreference:"CeleryStalksatMidnight"headline1:CeleryStalksatMidnightStringpassedbyvalue:"LettucePrey""LettucePrey"objectdeleted,2leftheadline2:葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺第八頁,共五十八頁,編輯于2023年,星期一Initializeoneobjecttoanother:sailor:SpinachLeavesBowlforDollarsAssignoneobjecttoanother:3:"C++"defaultobjectcreatedknot:CeleryStalksatMidnightEndofmain()"CeleryStalksatMidnight"objectdeleted,2left"SpinachLeavesBowlforDollars"objectdeleted,1left"葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺?objectdeleted,0left未處理的異常:System.NullReferenceException:未將對象引用設(shè)置到對象的實例。

atdelete[](Void*)atStringBad.__dtor(StringBad*)ind:\temp\test2\strngbad.cpp:line37atmain()ind:\temp\test2\vegnews.cpp:line39第九頁,共五十八頁,編輯于2023年,星期一"C++"objectdeleted,-1left"葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺F"objectdeleted,-2left未處理的異常:System.NullReferenceException:未將對象引用設(shè)置到對象的實例。

atdelete[](Void*)atStringBad.__dtor(StringBad*)ind:\temp\test2\strngbad.cpp:line37at__CxxCallUnwindDtor(IntPtr,Void*)atmain()ind:\temp\test2\vegnews.cpp:line39第十頁,共五十八頁,編輯于2023年,星期一跟蹤程序的執(zhí)行過程,當(dāng)函數(shù)callme2調(diào)用時發(fā)生了析構(gòu)函數(shù)的調(diào)用。析構(gòu)函數(shù)的delete語句釋放了實際參數(shù)headline對象的成員headline.str指向的內(nèi)存,并使靜態(tài)成員的計數(shù)減一:cout<<"\""<<str<<"\"objectdeleted,";--num_strings;//requiredcout<<num_strings<<"left\n";//FYIdelete[]str;注意:當(dāng)以對象為實參傳遞給函數(shù)時,函數(shù)中要拷貝對象的副本,即創(chuàng)建一個臨時對象;該函數(shù)結(jié)束時臨時對象消失,析構(gòu)函數(shù)被調(diào)用。第十一頁,共五十八頁,編輯于2023年,星期一分析程序:復(fù)制構(gòu)造函數(shù)程序中沒有給出復(fù)制構(gòu)造函數(shù),但卻使用了復(fù)制構(gòu)造函數(shù):當(dāng)用一個對象初始化一個新建對象時StringBadsailor=sports;StringBadsailor(sports);函數(shù)按值傳遞對象或返回對象時callme2(headline2);第十二頁,共五十八頁,編輯于2023年,星期一此時使用了默認(rèn)的復(fù)制構(gòu)造函數(shù),即按值依次復(fù)制對象的非靜態(tài)變量成員。該復(fù)制構(gòu)造函數(shù)的原型如下:Stringbad(constStringbad&sb);它執(zhí)行的是淺拷貝,即復(fù)制成員的值。對于

StringBadsailor=sports;

相當(dāng)于sailor.str=sports.str即兩個指針值相同,它們指向了同一塊內(nèi)存另外,默認(rèn)復(fù)制構(gòu)造函數(shù)不會對靜態(tài)成員有改變,所以計數(shù)不增加。第十三頁,共五十八頁,編輯于2023年,星期一注意1:如果類中有這樣的靜態(tài)成員,當(dāng)創(chuàng)建對象時其值發(fā)生改變,必須提供顯式的復(fù)制構(gòu)造函數(shù)注意2:如果類中有用new初始化的指針成員,應(yīng)該提供顯式的復(fù)制構(gòu)造函數(shù),以實現(xiàn)深拷貝StringBad::StringBad(constStringBad&sb){num_strings++;//handlestaticmemberupdatelen=sb.len;//samelengthstr=newchar[len+1];//allotspacestd::strcpy(str,sb.str);//copystringtonewlocation}第十四頁,共五十八頁,編輯于2023年,星期一分析程序:賦值操作符程序中允許對類對象賦值,是因為c++自動為類重載了賦值操作符。如StringBadknot;knot=headline1;使用了下面的自動重載的操作符Stringbad&Stringbad::operator=(constStringbad&);默認(rèn)賦值操作符的實現(xiàn)方式與默認(rèn)拷貝相似,也是對成員進(jìn)行逐個復(fù)制,但不影響靜態(tài)數(shù)據(jù)成員第十五頁,共五十八頁,編輯于2023年,星期一由于knot=headline1;

賦值操作符作了如下的工作:knot.str=headline1.str;同樣是兩個指針指向了同一塊內(nèi)存。對象knot的析構(gòu)函數(shù)調(diào)用在先,釋放了指針指向的內(nèi)存;當(dāng)對象headline1的析構(gòu)函數(shù)被調(diào)用時試圖釋放已經(jīng)釋放的內(nèi)存導(dǎo)致錯誤。第十六頁,共五十八頁,編輯于2023年,星期一解決該問題的方法是提供賦值操作符的重載,實現(xiàn)深拷貝。重載賦值操作符應(yīng)具有如下功能:由于被賦值的對象在創(chuàng)建時已經(jīng)分配了內(nèi)存,所以函數(shù)使用前應(yīng)該先釋放它;函數(shù)要避免自身賦值,否則賦值前的釋放內(nèi)存操作會破壞對象的內(nèi)容;函數(shù)返回一個指向?qū)ο蟮囊?,這樣可以實現(xiàn)連續(xù)賦值操作。第十七頁,共五十八頁,編輯于2023年,星期一重載的操作符如下StringBad&StringBad::operator=(constStringBad&sb){if(this==&sb)return*this;delete[]str;len=sb.len;str=newchar[len+1];std::strcpy(str,sb.str);return*this;}第十八頁,共五十八頁,編輯于2023年,星期一改進(jìn)后的字符串類增加復(fù)制構(gòu)造函數(shù)和賦值操作符添加必要的功能1.修訂默認(rèn)構(gòu)造函數(shù):構(gòu)建一個空字符串String::String()//defaultconstructor{len=0;str=newchar[1];//為何不是newchar?str[0]='\0';//defaultstringnum_strings++;}第十九頁,共五十八頁,編輯于2023年,星期一2.比較成員函數(shù):比較字符串的前后順序booloperator<(constString&st1,constString&st2){//若st1中的字符排在st2之前,則返回truereturn(std::strcmp(st1.str,st2.str)<0);}booloperator>(constString&st1,constString&st2){//利用已經(jīng)重載的操作符

returnst2.str<st1.str;}booloperator==(constString&st1,constString&st2){//所有字符相同返回truereturn(std::strcmp(st1.str,st2.str)==0);}第二十頁,共五十八頁,編輯于2023年,星期一比較操作符都被設(shè)置為友元,有利于C字符串與對象的比較,例如,name是一個對象

if(“Smith”==name)可以轉(zhuǎn)換為

if(operator==(“Smith”,name))

再由一個構(gòu)造函數(shù)將“Smith”轉(zhuǎn)換為類類型從而進(jìn)行函數(shù)的調(diào)用3.重載下標(biāo)運算符

[]運算符的一個操作數(shù)位于括號前,一個操作數(shù)位于兩個括號之間。

char&String::operator[](inti){returnstr[i];}第二十一頁,共五十八頁,編輯于2023年,星期一//這個方法可以為對象的特定元素賦值Stringname(“johnsmith”);name[0]=‘J’;name[5]=‘S’;但是非const成員不能被const對象使用,所以還要定義一個const函數(shù)constchar&String::operator[](inti)const{returnstr[i];}第二十二頁,共五十八頁,編輯于2023年,星期一4.靜態(tài)類成員函數(shù)//staticfunction

staticintHowMany();//staticmethodintString::HowMany(){returnnum_strings;}靜態(tài)類成員函數(shù)的作用:不能通過對象調(diào)用它,它也只能訪問靜態(tài)數(shù)據(jù)成員聲明為公有,則可以由作用域操作符調(diào)用它:Intcount=String::HowMany();第二十三頁,共五十八頁,編輯于2023年,星期一5.再增加一個賦值操作符String&String::operator=(constchar*s){delete[]str;len=std::strlen(s);str=newchar[len+1];std::strcpy(str,s);return*this;}通過這個方法可以用字符串對對象賦值第二十四頁,共五十八頁,編輯于2023年,星期一6.重載輸出輸入操作符ostream&

operator<<(ostream&os,constString&st){os<<st.str;returnos;}istream&

operator>>(istream&is,String&st){chartemp[String::CINLIM];is.get(temp,String::CINLIM);if(is)st=temp;while(is&&is.get()!='\n')continue;returnis;}第二十五頁,共五十八頁,編輯于2023年,星期一小結(jié):構(gòu)造函數(shù)中使用new構(gòu)造函數(shù)中使用new初始化指針成員,則析構(gòu)函數(shù)重要使用delete;new和delete須兼容;如果有多個構(gòu)造函數(shù),必須以同樣方式使用new,也可以將指針成員初始化為0;應(yīng)定義復(fù)制構(gòu)造函數(shù),實現(xiàn)深拷貝,其中還要注意更新受影響的靜態(tài)成員;應(yīng)定義賦值操作符,實現(xiàn)深拷貝。第二十六頁,共五十八頁,編輯于2023年,星期一有關(guān)函數(shù)返回對象的總結(jié)返回指向const對象的引用對象引用作函數(shù)參數(shù)是為提高效率,不用復(fù)制對象,const表示不可改動實參如果函數(shù)要返回傳遞給它的對象,也可以通過傳引用提高效率。constVector

&Max(constVector&v1,constVector&v2){return(v1.magval>v2.magval?V1:v2);}此例中可以返回對象,但要調(diào)用復(fù)制構(gòu)造函數(shù),降低效率。const與參數(shù)對應(yīng)。第二十七頁,共五十八頁,編輯于2023年,星期一返回指向非const對象的引用常用于重載賦值操作符和與流對象一起用的<<、>>操作符。ostream&operator<<(ostream&os,constString&st)

必須返回ostream&,以便實現(xiàn)連續(xù)輸出。不能返回對象,因ostream沒有公有的復(fù)制構(gòu)造函數(shù)。也不能是const,因為流對象的值在改變。String&String::operator=(constString&st)可以返回對象或引用,都可起到連續(xù)賦值作用,但返回引用效率高。第二十八頁,共五十八頁,編輯于2023年,星期一返回對象如果函數(shù)中要返回的是個局部對象,則不能返回引用,因為返回時該對象已消失,引用指向的對象將不存在。例如重載的算術(shù)運算符VectorVector::operator+

(constVector&b)const { returnVector(x+b.x,y+b.y); }第二十九頁,共五十八頁,編輯于2023年,星期一返回const對象前面的operator+允許以下操作Vectorstep1(50,40);Vectorstep2(38,77);Vectortotal;total=step1+step2;step1+step2=total;if(step1+step2=step1)

cout<<“step2=0.”解決方法:將operator+的類型聲明為const對象第三十頁,共五十八頁,編輯于2023年,星期一指向?qū)ο蟮闹羔樤贑++中,經(jīng)常使用指向?qū)ο蟮闹羔?,下面的例子演示了這種用法。(sayings2.cpp)可以使用普通的指針方法來使用對象指針,例如

String*shortest=&sayings[0];//initializeto//firstobject

String*first=&sayings[0];第三十一頁,共五十八頁,編輯于2023年,星期一之后便可以利用指針間接訪問if(sayings[i].length()<shortest->length())或者對指針解除引用if(sayings[i]<*first)第三十二頁,共五十八頁,編輯于2023年,星期一使用new初始化對象如果className是類,value的類型為typeName,則語句className*pclass=newclassName(value);將調(diào)用構(gòu)造函數(shù)className(typeName);例如String*pst=newString(“Hello.”);將調(diào)用String(constchar*s);而String*pst=newString;將調(diào)用默認(rèn)構(gòu)造函數(shù)String();第三十三頁,共五十八頁,編輯于2023年,星期一一個特殊情況String*favorite=

newString(sayings[choice]);所給的參數(shù)是一個本類對象的名字,則調(diào)用的是復(fù)制構(gòu)造函數(shù)String(constString&);//copyconstructor第三十四頁,共五十八頁,編輯于2023年,星期一剛才的例子中在兩個層次上使用了new和delete操作符:一是為創(chuàng)建每一個對象包含的字符串分配存儲空間,這是在構(gòu)造函數(shù)中進(jìn)行的,需要在析構(gòu)函數(shù)中釋放該空間String::String(constchar*s)//constructStringfrom//Cstring{len=std::strlen(s);//setsize

str=newchar[len+1];//allotstorage

std::strcpy(str,s);//initializepointer

num_strings++;//setobjectcount}第三十五頁,共五十八頁,編輯于2023年,星期一String::~String(){--num_strings;delete[]str;}第二個層次是為類對象分配空間,保存的是類對象的成員str指針值和字符串的長度值len

String*favorite=newString(sayings[choice]);cout<<"Myfavoritesaying:\n"<<*favorite<<endl;deletefavorite;第三十六頁,共五十八頁,編輯于2023年,星期一保存對象的空間不會由析構(gòu)函數(shù)釋放,需要用delete釋放它:只釋放存放str和len的空間,而不會釋放保存字符串的空間析構(gòu)函數(shù)的調(diào)用有以下幾種情況:如果對象是自動變量,則執(zhí)行完定義該對象的程序塊時調(diào)用如果對象是靜態(tài)的(靜態(tài),外部,靜態(tài)外部的),則在程序結(jié)束時調(diào)用如果對象是由new創(chuàng)建的,則當(dāng)顯式地使用delete時調(diào)用析構(gòu)函數(shù)第三十七頁,共五十八頁,編輯于2023年,星期一classAct{…};Actnice;//外部對象intmain(){ Act*pt=newAct;//動態(tài)對象

… { Actmyact;//自動對象

… }/////////////////////////調(diào)用myact的析構(gòu)函數(shù)

deletept;/////////調(diào)用(*pt)的析構(gòu)函數(shù)…}////////////////調(diào)用nice的析構(gòu)函數(shù)第三十八頁,共五十八頁,編輯于2023年,星期一使用new為對象分配空間的機(jī)制比較復(fù)雜:String*mystring=newString(“hellobaby.”);1、為對象分配內(nèi)存2、調(diào)用類構(gòu)造函數(shù)為“hellobaby.”分配空間,并將字符串復(fù)制到分配的空間中str:len:(對象地址:2400)Hellobaby.\0(字符串地址:2000)第三十九頁,共五十八頁,編輯于2023年,星期一將字符串的地址值賦給str,將字符串的長度值賦給len,并且更新mun_strings3、創(chuàng)建指針變量mystring,將新對象的地址賦給變量mystringstr:2000len:11(對象地址:2400)指針值:2400(變量地址:2800)第四十頁,共五十八頁,編輯于2023年,星期一布局new操作符通常情況,new負(fù)責(zé)在堆中找一個足以滿足要求的內(nèi)存塊;new還有一種變體稱為布局new操作符,允許指定要使用的位置。通過布局new可以設(shè)置內(nèi)存管理規(guī)程,或處理通過特定地址訪問的硬件。使用布局new需要頭文件<new>,且要指定new的參數(shù)。第四十一頁,共五十八頁,編輯于2023年,星期一#include<new>Structchaff{ chardross[20]; intslag;};charbuffer1[50];charbuffer2[500];intmain(){ chaff*p1,*p2; int*p3,*p4; p1=newchaff;p3=newint[20]; p2=new(buffer1)chaff; p4=new(buffer2)int[20];}第四十二頁,共五十八頁,編輯于2023年,星期一看一個例子。從中可以知道pd2通過布局new放在了buffer中,而pd1被放在很遠(yuǎn)的堆中第二個常規(guī)new查找一個新的內(nèi)存塊,而第二個布局new分配的位置與第一次一樣。說明布局new使用傳遞給它的地址,它不跟蹤內(nèi)存單元已被使用。操作符delete只能用于釋放常規(guī)操作符new分配的堆內(nèi)存,本例中的buffer是靜態(tài)內(nèi)存,不能使用delete來釋放。第四十三頁,共五十八頁,編輯于2023年,星期一第四十四頁,共五十八頁,編輯于2023年,星期一布局new用于對象看一個使用布局new創(chuàng)建對象的例子(placenew1.cpp)程序存在兩個問題:pc1和pc3均由布局new創(chuàng)建,后者創(chuàng)建時會覆蓋前者的內(nèi)存。如果對象中的成員是由new來動態(tài)分配的,會引發(fā)問題(布局new使用指定位置,而創(chuàng)建成員的new要查找空閑位置)。將delete用于pc2和pc4時會自動調(diào)用它們指向的對象的析構(gòu)函數(shù);delete用于buffer時釋放常規(guī)new創(chuàng)建的整個內(nèi)存塊,不會調(diào)用在其中創(chuàng)建的對象(由布局new創(chuàng)建)的析構(gòu)函數(shù)。第四十五頁,共五十八頁,編輯于2023年,星期一解決第一個問題的方法是程序員來控制為布局new提供不同的地址,例如pc1=new(buffer)JustTesting;

pc3=new(buffer+sizeof(JustTesting))JustTesting("BetterIdea",6);解決第二個問題的方法是顯式地調(diào)用由布局new創(chuàng)建對象的析構(gòu)函數(shù)pc3->~JustTesting();//destroyobjectpointed//tobypc3pc1->~JustTesting();//destroyobjectpointed//tobypc1需要注意,以創(chuàng)建對象相反的順序刪除之,并且刪除完對象之后再釋放所在的緩沖區(qū)。第四十六頁,共五十八頁,編輯于2023年,星期一12.2隊列模擬問題:一家銀行想在一家超市中建立ATM機(jī),超市擔(dān)心排隊會影響其經(jīng)營。編程模擬ATM對超市造成的影響。使用隊列描述排隊顧客:隊列中的項為顧客。假設(shè),1/3的顧客1分鐘接受服務(wù),1/3為2分鐘,另外1/3為3分鐘;顧客的到達(dá)時間隨機(jī),但每小時到達(dá)的顧客數(shù)恒定。第四十七頁,共五十八頁,編輯于2023年,星期一設(shè)計隊列類,應(yīng)有如下特征:存儲有序項序列容納的項目數(shù)有一定限制能夠創(chuàng)建空隊列能夠判斷隊列為空或為滿可以從隊尾添加項可以從隊首刪除項能夠確定隊列中的項目數(shù)第四十八頁,共五十八頁,編輯于2023年,星期一隊列類的接口:classQueue{ enum{Q_SIZE=10};public:Queue(intqs=Q_SIZE);//createqueuewithaqslimit~Queue();boolisempty()const;boolisfull()const;intqueuecount()const;boolenqueue(constItem&item);//additemtoendbooldequeue(Item&item);//removeitemfromfront};第四十九頁,共五十八頁,編輯于2023年,星期一隊列數(shù)據(jù)的表示使用鏈表表示。鏈表由節(jié)點構(gòu)成,每個節(jié)點中保存相應(yīng)信息以及指向下一個節(jié)點的指針,隊尾的指針通常指向NULL。structNode{ Itemitem; structNode*next;};此外還要有鏈表的起始位置,末尾位置,可存儲的最大項數(shù)以及當(dāng)前存儲的項數(shù)??梢匀缦略O(shè)計隊列類的數(shù)據(jù)成員:第五十頁,共五十八頁,編輯于2023年,星期一classQueue{private://classscopedefinitions//NodeisanestedstructuredefinitionlocaltothisclassstructNode{Itemitem;structNode*next;};enum{Q_SIZE=10};//privateclassmembersNode*front;//pointertofrontofQueueNode*rear;//pointertorearofQueueintitems;//currentnumberofitemsinQueueconstintqsize;//maximumnumberofitemsinQueue…第五十一頁,共五十八頁,編輯于2023年,星期一隊列最初是空的,所以Queue::Queue(intqs):qsize(qs){front=rear=NULL;items=0;}注意:非靜態(tài)常量數(shù)據(jù)成員和引用數(shù)據(jù)成員不能賦值,但又不能在類定義中初始化。只能使用成員初始化列表方式初始化第五十二頁,共五十八頁,編輯于2023年,星期一歸納:static,const成員的初始化問題staticconst成員是類中的常數(shù),在類定義中初始化即可:

classTest{

staticconstintsize=10;…};static成員在類中聲明,其初始化要放在類定以外,通常是在實現(xiàn)文件中,例如

classTest{

staticintsize;

…};第五十三頁,共五十八頁,編輯于2023年,星期一

//實現(xiàn)文件

intTest::size=10;

//…成員定義const成員,在類定義中聲明,在構(gòu)造函數(shù)的成員初始化列表中初始化,如前面的例子。第五十四頁,共五十八頁,編輯于2023年,星期一判斷隊列為空、為滿

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論