




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
UML與程序設(shè)計(C++)1堆與拷貝構(gòu)造函數(shù)UML與程序設(shè)計(C++)1堆與拷貝構(gòu)造函數(shù)第4章
堆與拷貝構(gòu)造函數(shù)2堆與拷貝構(gòu)造函數(shù)第4章
堆與拷貝構(gòu)造函數(shù)2堆與拷貝構(gòu)造函數(shù)4.1關(guān)于堆C++程序的內(nèi)存格局通常分為四個區(qū):全局?jǐn)?shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)全局變量、靜態(tài)數(shù)據(jù)、常量存放在全局?jǐn)?shù)據(jù)區(qū);所有類的成員函數(shù)和非成員函數(shù)代碼存放在代碼區(qū);為運行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等存放于棧區(qū);余下的空間作為堆區(qū)。3堆與拷貝構(gòu)造函數(shù)4.1關(guān)于堆C++程序的內(nèi)存格局通常分為四個區(qū):3堆與拷貝4.2需要new和delete的原因從C++的立場來看,不使用malloc()函數(shù)的原因是它在分配空間的時候不能調(diào)用構(gòu)造函數(shù)。類對象的建立包括分配空間、構(gòu)造結(jié)構(gòu)以及初始化,這些是由構(gòu)造函數(shù)統(tǒng)一完成的。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); //… free(pD);}classTDate{public:TDate();//構(gòu)造函數(shù)voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;};4堆與拷貝構(gòu)造函數(shù)4.2需要new和delete的原因從C++的立場來看,不4.2需要new和delete的原因如果構(gòu)造函數(shù)被調(diào)用,則須在進(jìn)行內(nèi)存分配的malloc()調(diào)用時進(jìn)行,而malloc()僅是一個函數(shù)調(diào)用,沒有足夠的信息調(diào)用構(gòu)造函數(shù)。pD從malloc()獲得只是一個含有隨機(jī)數(shù)據(jù)的類對象空間,須在內(nèi)存分配之后再進(jìn)行初始化。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); pD->SetDate(2011,1,1); //… free(pD);}5堆與拷貝構(gòu)造函數(shù)4.2需要new和delete的原因如果構(gòu)造函數(shù)被調(diào)用,則4.3分配堆對象C++的new和delete機(jī)制更簡單易懂。voidfn(){ Tdate*pS; pS=newTDate;
//分配堆空間并構(gòu)造 //… deletepS;//析構(gòu)并將空間返還給堆}如果分配局部對象,則在該局部對象退出作用域時自動調(diào)用析構(gòu)函數(shù)。但堆對象的作用域是整個程序生命期,所以除非程序運行完畢,否則堆對象的作用域不會到期。堆對象的析構(gòu)是在釋放堆對象語句delete執(zhí)行之時。6堆與拷貝構(gòu)造函數(shù)4.3分配堆對象C++的new和delete機(jī)制更簡單易懂4.3分配堆對象如果構(gòu)造函數(shù)有參數(shù),則new后面的類類型也需要相應(yīng)的參數(shù)。classTDate{public:TDate(inty,intm,intd){ year=y; month=m; day=d;private:intyear,month,day;};voidfn(){ Tdate*pD; pD=newTdate(2011,1,1);
//… deletepD;}new根據(jù)參數(shù)匹配的原則來調(diào)用構(gòu)造函數(shù),如果寫成pD=newTdate;則由于TDate類沒有提供無參的構(gòu)造函數(shù)而出錯。7堆與拷貝構(gòu)造函數(shù)4.3分配堆對象如果構(gòu)造函數(shù)有參數(shù),則new后面的類類型也4.3分配堆對象從堆中還可以分配對象數(shù)組classStudent{public:Student(char*pName=“noname”){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]=‘\0’;}private:charname[40];};voidfn(intnum){ Student*pS=newStudent[num]; //… delete[]pS;}構(gòu)造函數(shù)被調(diào)用num次,依次構(gòu)造pS[0]到pS[num-1]。從堆上分配對象數(shù)組,只能調(diào)用默認(rèn)構(gòu)造函數(shù),不能調(diào)用任何其他構(gòu)造函數(shù)。8堆與拷貝構(gòu)造函數(shù)4.3分配堆對象從堆中還可以分配對象數(shù)組classStu4.4拷貝構(gòu)造函數(shù)如果希望生成一個對象的副本,可以創(chuàng)建一個新的對象,并將現(xiàn)有對象的數(shù)據(jù)成員值賦值給新對象的相應(yīng)成員。這種方法可行,但繁瑣。更好的途徑是使類具有某種復(fù)制本類對象的能力,這便是拷貝構(gòu)造函數(shù)(CopyConstructor)的功能??截悩?gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的特點,其作用是用一個已經(jīng)存在的對象去初始化一個新的同類對象。9堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)如果希望生成一個對象的副本,可以創(chuàng)建一個4.4拷貝構(gòu)造函數(shù)可以根據(jù)實際問題的需要定義拷貝構(gòu)造函數(shù),以實現(xiàn)同類對象之間數(shù)據(jù)成員的傳遞。如果沒有自定義類的拷貝構(gòu)造函數(shù),系統(tǒng)會自動生成一個默認(rèn)的拷貝構(gòu)造函數(shù),其工作方式是按成員初始化(memberwiseinitialization),即通過依次拷貝每個非靜態(tài)數(shù)據(jù)成員實現(xiàn),如果成員是類對象,則調(diào)用其拷貝構(gòu)造函數(shù)或者默認(rèn)拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的形式:類名(類名&對象名)形參是本類對象的引用10堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)可以根據(jù)實際問題的需要定義拷貝構(gòu)造函數(shù),4.4拷貝構(gòu)造函數(shù)classTPoint{public: TPoint(intx=0,inty=0){X=x;Y=y;} TPoint(TPoint&p);//拷貝構(gòu)造函數(shù)
intGetX(){returnX;} intGetY(){returnY;}private: intX,Y;};TPoint::TPoint(TPoint&p){ X=p.X; Y=p.Y; cout<<“拷貝構(gòu)造函數(shù)被調(diào)用”<<endl;}11堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)classTPoint11堆與拷貝構(gòu)造4.4拷貝構(gòu)造函數(shù)
普通構(gòu)造函數(shù)在對象創(chuàng)建時被調(diào)用,拷貝構(gòu)造函數(shù)在以下三種情況下會被調(diào)用:1.用類的一個對象去初始化該類的另外一個對象,例如:voidmain(){TPointA(1,2);TPointB(A);//用對象A初始化對象B,拷貝構(gòu)造函數(shù)被調(diào)用
//…}2.函數(shù)的形參是類的對象,調(diào)用函數(shù)進(jìn)行形參和實參結(jié)合時,例如voidf(TPointp)//形參p用實參的值進(jìn)行構(gòu)造{cout<<p.GetX()<<endl;}12堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)普通構(gòu)造函數(shù)在對象創(chuàng)建時被調(diào)用,拷貝構(gòu)4.4拷貝構(gòu)造函數(shù)3.函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回調(diào)用者時,拷貝構(gòu)造函數(shù)會被調(diào)用。TPointg(){TPointA(1,2);returnA;}voidmain(){TPointB;B=g();}說明:函數(shù)g表面上將對象A返回給主函數(shù),但A是局部對象,離開建立它的函數(shù)后就消亡了,不可能在返回主函數(shù)后繼續(xù)生存,編譯系統(tǒng)在處理這種情況時會在主函數(shù)中創(chuàng)建一個臨時的無名對象,該臨時對象的生存期只在函數(shù)調(diào)用所處的表達(dá)式中。執(zhí)行“returnA;”時,實際上是調(diào)用拷貝構(gòu)造函數(shù)將對象A復(fù)制到臨時對象中。表達(dá)式B=g();計算完畢后,臨時對象自動消失。13堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)3.函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完4.4拷貝構(gòu)造函數(shù)
一般規(guī)定,創(chuàng)建的臨時對象,只在創(chuàng)建它們的外部表達(dá)式中有效。Studentfn(){ Studentms(“Randy”); returnms;}voidmain(){ Student&ref=fn(); //….}
因為外部表達(dá)式Student&ref=fn();到分號處結(jié)束,之后從fn()返回的臨時對象不再有效,即ref所引用的目標(biāo)不復(fù)存在。14堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)一般規(guī)定,創(chuàng)建的臨時對象,只在創(chuàng)建它們4.5深拷貝和淺拷貝
在默認(rèn)拷貝構(gòu)造函數(shù)中,拷貝的方式是逐個成員依次復(fù)制。但一個對象可能會擁有某些資源,當(dāng)構(gòu)造函數(shù)為其分配了一個資源(例如堆內(nèi)存)的時候,如果拷貝構(gòu)造函數(shù)簡單地制作了一個指向該資源的副本,而不是重新分配,就會出現(xiàn)兩個對象擁有同一個資源,當(dāng)對象析構(gòu)時,資源會被返還兩次。這種復(fù)制對象成員,但不復(fù)制資源的方式稱為淺拷貝。15堆與拷貝構(gòu)造函數(shù)4.5深拷貝和淺拷貝在默認(rèn)拷貝構(gòu)造函數(shù)中,拷貝的方式是逐4.5深拷貝和淺拷貝如果創(chuàng)建一個對象時,分配了資源就需要定義自己的拷貝構(gòu)造函數(shù)來改變?nèi)笔〉闹鸪蓡T拷貝的方式,不但拷貝成員,也拷貝資源,這種方式稱為深拷貝。通常,如果類需要析構(gòu)函數(shù)來釋放資源的話,那么它也需要一個拷貝構(gòu)造函數(shù)。16堆與拷貝構(gòu)造函數(shù)4.5深拷貝和淺拷貝如果創(chuàng)建一個對象時,分配了資源就需要4.6無名對象
可以直接調(diào)用構(gòu)造函數(shù)產(chǎn)生無名對象。voidfn(){ Student(“Randy”); //….}
無名對象可以作為實參傳遞給函數(shù),可以用來拷貝構(gòu)造一個新對象,也可以初始化一個引用。voidfn(Student&s);voidmain(){ Student&refs=Student(“Randy”); Students=Student(“Randy”); fn(Student(“Randy”));}17堆與拷貝構(gòu)造函數(shù)4.6無名對象可以直接調(diào)用構(gòu)造函數(shù)產(chǎn)生無名對象。void4.7構(gòu)造函數(shù)用于類型轉(zhuǎn)換
轉(zhuǎn)換用戶自定義的類類型需要定義含有一個參數(shù)的構(gòu)造函數(shù)。classStudent(){ public: Student(char*); //….};
因為有Student(char*)的構(gòu)造函數(shù),又有函數(shù)fn(Student&s),于是fn(“Jenny”)被認(rèn)為是fn(Student(“Jenny”)),予以匹配。voidfn(Student&s);voidmain(){ fn(“Jenny”);}18堆與拷貝構(gòu)造函數(shù)4.7構(gòu)造函數(shù)用于類型轉(zhuǎn)換轉(zhuǎn)換用戶自定義的類類型需要定義
UML與程序設(shè)計(C++)19堆與拷貝構(gòu)造函數(shù)UML與程序設(shè)計(C++)1堆與拷貝構(gòu)造函數(shù)第4章
堆與拷貝構(gòu)造函數(shù)20堆與拷貝構(gòu)造函數(shù)第4章
堆與拷貝構(gòu)造函數(shù)2堆與拷貝構(gòu)造函數(shù)4.1關(guān)于堆C++程序的內(nèi)存格局通常分為四個區(qū):全局?jǐn)?shù)據(jù)區(qū)代碼區(qū)棧區(qū)堆區(qū)全局變量、靜態(tài)數(shù)據(jù)、常量存放在全局?jǐn)?shù)據(jù)區(qū);所有類的成員函數(shù)和非成員函數(shù)代碼存放在代碼區(qū);為運行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回數(shù)據(jù)、返回地址等存放于棧區(qū);余下的空間作為堆區(qū)。21堆與拷貝構(gòu)造函數(shù)4.1關(guān)于堆C++程序的內(nèi)存格局通常分為四個區(qū):3堆與拷貝4.2需要new和delete的原因從C++的立場來看,不使用malloc()函數(shù)的原因是它在分配空間的時候不能調(diào)用構(gòu)造函數(shù)。類對象的建立包括分配空間、構(gòu)造結(jié)構(gòu)以及初始化,這些是由構(gòu)造函數(shù)統(tǒng)一完成的。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); //… free(pD);}classTDate{public:TDate();//構(gòu)造函數(shù)voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;};22堆與拷貝構(gòu)造函數(shù)4.2需要new和delete的原因從C++的立場來看,不4.2需要new和delete的原因如果構(gòu)造函數(shù)被調(diào)用,則須在進(jìn)行內(nèi)存分配的malloc()調(diào)用時進(jìn)行,而malloc()僅是一個函數(shù)調(diào)用,沒有足夠的信息調(diào)用構(gòu)造函數(shù)。pD從malloc()獲得只是一個含有隨機(jī)數(shù)據(jù)的類對象空間,須在內(nèi)存分配之后再進(jìn)行初始化。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); pD->SetDate(2011,1,1); //… free(pD);}23堆與拷貝構(gòu)造函數(shù)4.2需要new和delete的原因如果構(gòu)造函數(shù)被調(diào)用,則4.3分配堆對象C++的new和delete機(jī)制更簡單易懂。voidfn(){ Tdate*pS; pS=newTDate;
//分配堆空間并構(gòu)造 //… deletepS;//析構(gòu)并將空間返還給堆}如果分配局部對象,則在該局部對象退出作用域時自動調(diào)用析構(gòu)函數(shù)。但堆對象的作用域是整個程序生命期,所以除非程序運行完畢,否則堆對象的作用域不會到期。堆對象的析構(gòu)是在釋放堆對象語句delete執(zhí)行之時。24堆與拷貝構(gòu)造函數(shù)4.3分配堆對象C++的new和delete機(jī)制更簡單易懂4.3分配堆對象如果構(gòu)造函數(shù)有參數(shù),則new后面的類類型也需要相應(yīng)的參數(shù)。classTDate{public:TDate(inty,intm,intd){ year=y; month=m; day=d;private:intyear,month,day;};voidfn(){ Tdate*pD; pD=newTdate(2011,1,1);
//… deletepD;}new根據(jù)參數(shù)匹配的原則來調(diào)用構(gòu)造函數(shù),如果寫成pD=newTdate;則由于TDate類沒有提供無參的構(gòu)造函數(shù)而出錯。25堆與拷貝構(gòu)造函數(shù)4.3分配堆對象如果構(gòu)造函數(shù)有參數(shù),則new后面的類類型也4.3分配堆對象從堆中還可以分配對象數(shù)組classStudent{public:Student(char*pName=“noname”){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]=‘\0’;}private:charname[40];};voidfn(intnum){ Student*pS=newStudent[num]; //… delete[]pS;}構(gòu)造函數(shù)被調(diào)用num次,依次構(gòu)造pS[0]到pS[num-1]。從堆上分配對象數(shù)組,只能調(diào)用默認(rèn)構(gòu)造函數(shù),不能調(diào)用任何其他構(gòu)造函數(shù)。26堆與拷貝構(gòu)造函數(shù)4.3分配堆對象從堆中還可以分配對象數(shù)組classStu4.4拷貝構(gòu)造函數(shù)如果希望生成一個對象的副本,可以創(chuàng)建一個新的對象,并將現(xiàn)有對象的數(shù)據(jù)成員值賦值給新對象的相應(yīng)成員。這種方法可行,但繁瑣。更好的途徑是使類具有某種復(fù)制本類對象的能力,這便是拷貝構(gòu)造函數(shù)(CopyConstructor)的功能??截悩?gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的特點,其作用是用一個已經(jīng)存在的對象去初始化一個新的同類對象。27堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)如果希望生成一個對象的副本,可以創(chuàng)建一個4.4拷貝構(gòu)造函數(shù)可以根據(jù)實際問題的需要定義拷貝構(gòu)造函數(shù),以實現(xiàn)同類對象之間數(shù)據(jù)成員的傳遞。如果沒有自定義類的拷貝構(gòu)造函數(shù),系統(tǒng)會自動生成一個默認(rèn)的拷貝構(gòu)造函數(shù),其工作方式是按成員初始化(memberwiseinitialization),即通過依次拷貝每個非靜態(tài)數(shù)據(jù)成員實現(xiàn),如果成員是類對象,則調(diào)用其拷貝構(gòu)造函數(shù)或者默認(rèn)拷貝構(gòu)造函數(shù)。拷貝構(gòu)造函數(shù)的形式:類名(類名&對象名)形參是本類對象的引用28堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)可以根據(jù)實際問題的需要定義拷貝構(gòu)造函數(shù),4.4拷貝構(gòu)造函數(shù)classTPoint{public: TPoint(intx=0,inty=0){X=x;Y=y;} TPoint(TPoint&p);//拷貝構(gòu)造函數(shù)
intGetX(){returnX;} intGetY(){returnY;}private: intX,Y;};TPoint::TPoint(TPoint&p){ X=p.X; Y=p.Y; cout<<“拷貝構(gòu)造函數(shù)被調(diào)用”<<endl;}29堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)classTPoint11堆與拷貝構(gòu)造4.4拷貝構(gòu)造函數(shù)
普通構(gòu)造函數(shù)在對象創(chuàng)建時被調(diào)用,拷貝構(gòu)造函數(shù)在以下三種情況下會被調(diào)用:1.用類的一個對象去初始化該類的另外一個對象,例如:voidmain(){TPointA(1,2);TPointB(A);//用對象A初始化對象B,拷貝構(gòu)造函數(shù)被調(diào)用
//…}2.函數(shù)的形參是類的對象,調(diào)用函數(shù)進(jìn)行形參和實參結(jié)合時,例如voidf(TPointp)//形參p用實參的值進(jìn)行構(gòu)造{cout<<p.GetX()<<endl;}30堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)普通構(gòu)造函數(shù)在對象創(chuàng)建時被調(diào)用,拷貝構(gòu)4.4拷貝構(gòu)造函數(shù)3.函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完成返回調(diào)用者時,拷貝構(gòu)造函數(shù)會被調(diào)用。TPointg(){TPointA(1,2);returnA;}voidmain(){TPointB;B=g();}說明:函數(shù)g表面上將對象A返回給主函數(shù),但A是局部對象,離開建立它的函數(shù)后就消亡了,不可能在返回主函數(shù)后繼續(xù)生存,編譯系統(tǒng)在處理這種情況時會在主函數(shù)中創(chuàng)建一個臨時的無名對象,該臨時對象的生存期只在函數(shù)調(diào)用所處的表達(dá)式中。執(zhí)行“returnA;”時,實際上是調(diào)用拷貝構(gòu)造函數(shù)將對象A復(fù)制到臨時對象中。表達(dá)式B=g();計算完畢后,臨時對象自動消失。31堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)3.函數(shù)的返回值是類的對象,函數(shù)執(zhí)行完4.4拷貝構(gòu)造函數(shù)
一般規(guī)定,創(chuàng)建的臨時對象,只在創(chuàng)建它們的外部表達(dá)式中有效。Studentfn(){ Studentms(“Randy”); returnms;}voidmain(){ Student&ref=fn(); //….}
因為外部表達(dá)式Student&ref=fn();到分號處結(jié)束,之后從fn()返回的臨時對象不再有效,即ref所引用的目標(biāo)不復(fù)存在。32堆與拷貝構(gòu)造函數(shù)4.4拷貝構(gòu)造函數(shù)一般規(guī)定,創(chuàng)建的臨時對象,只在創(chuàng)建它們4.5深拷貝和淺拷貝
在默認(rèn)拷貝構(gòu)造函數(shù)中,拷貝的方式是
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)療器械質(zhì)量檢測服務(wù)合同
- 職場辦公技能培訓(xùn)教育范文
- 高考語文復(fù)習(xí):人物傳記類文言文專練
- 電線電纜采購合同書
- 法律行業(yè)律師服務(wù)費用免責(zé)協(xié)議
- 經(jīng)典童話白雪公主的解讀與賞析
- 高考英語完形填空專題集中訓(xùn)練含參考答案(5份)
- 農(nóng)村居民公共服務(wù)需求滿足指導(dǎo)手冊
- 問題解決指南
- 金融科技服務(wù)風(fēng)險免責(zé)合同
- 檔案館建筑設(shè)計規(guī)范
- 《英語閱讀3》課程教案
- 安全標(biāo)準(zhǔn)化法律法規(guī)識別清單
- 高分子材料完整版課件
- DB1301∕T 369-2021 設(shè)施蔬菜有機(jī)肥替代化肥技術(shù)規(guī)程
- IPCJEDEC J-STD-020 塑料集成電路(IC)SMD的潮濕回流敏感性分類 該
- a04-hci深信服超融合配置指南_v1
- 急診與災(zāi)難醫(yī)學(xué)第二版配套課件 05 心悸與心律失常
- 流體力學(xué)第二版蔡增基課件
- 天然氣管道保護(hù)蓋板涵施工方案
- 燒結(jié)普通磚抗壓強(qiáng)度試驗
評論
0/150
提交評論