版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第5章類和對象本章提要面向?qū)ο缶幊痰囊?;描述抽象、封裝和類;描述C++程序的典型結(jié)構(gòu);訪問限定符;靜態(tài)變量和靜態(tài)函數(shù);友元函數(shù)和友元類;構(gòu)造函數(shù)和析構(gòu)函數(shù)引子軟件有著極高的復雜性。想想我們的案例,“航空貨物托運費用計算程序”由初始化變量、輸入數(shù)據(jù)、計算費用、輸出結(jié)果等部分組成,但必須告訴大家,這還不算復雜,還不及真正的系統(tǒng)的千分之一。案例是我們經(jīng)過了刪除、簡化、修改才得出來的描述,真正的“航空售票、貨物托運系統(tǒng)”有著驚人的復雜性,并不是一二十人在一兩個月就可以完成的事情。再比如,銀行系統(tǒng)、電信收費系統(tǒng)、航天控制系統(tǒng)等等,這些軟件所涉及的人、物、機器等是如此之多,過程也極其復雜。只要其中一個環(huán)節(jié)出了問題,那么就會帶來上千萬、甚至幾十億元的損失。軟件系統(tǒng)復雜性的出現(xiàn)是由于軟件內(nèi)部和外部的因素造成的。第一,內(nèi)部的復雜性來自于系統(tǒng)運行模式的復雜性。第二,外部的復雜性來自于用戶與軟件設(shè)計者之間的溝通。“軟件的復雜性是一個本質(zhì)的性質(zhì),不是一種偶然的性質(zhì)?!薄狟rooks5.1世界是由對象構(gòu)成的有機體現(xiàn)實世界的復雜性軟件系統(tǒng)的復雜性是不可能擺脫的,怎么樣來簡化軟件系統(tǒng)的復雜性呢?利用面向?qū)ο蠓椒?,先把系統(tǒng)分解為若干個組成對象,它們彼此交互,最后用這些對象“裝配出”整個系統(tǒng)軟件。打個比方,一個大集團的運作是相當復雜的,但是如果將它分解為各個部門,各個層次,它們之間互相聯(lián)系,各自負責相應(yīng)的工作,那么整個集團的運作就會變得一目了然了。世界是由對象構(gòu)成的有機體在物理實體中,我們把對象定義為:“可以看得見,摸得著的實體?!蓖恚叭藶榈母拍?,或者是任何有明確邊界與意義的東西,也是對象”。它們都有著同一的特征:擁有狀態(tài)和行為。狀態(tài)是對象的一個或多個屬性的描述。行為是對象為了改變自身的狀態(tài)而發(fā)生的作用和反作用。簡單來說,在軟件中,對象就是一組變量和相關(guān)方法的集合,其中變量表明對象的狀態(tài),方法表明對象所具有的行為,即我們所學過的函數(shù)。當然,我們可以將現(xiàn)實世界中的對象經(jīng)過抽象,映射為軟件中的對象。對象在軟件中是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(Class);用更嚴謹?shù)脑拋肀硎觯皩ο笫欠庋b了數(shù)據(jù)結(jié)構(gòu)及可以施加在這些數(shù)據(jù)結(jié)構(gòu)中的操作的封裝體,這個封裝體有可以唯一地標識它的名字,而且向外界提供一組服務(wù)(即操作)。”概括地說,面相對象方法具有下述四個要點:①
認為客觀世界是由各種對象組成的,任何事物都是對象,復雜的對象可以由比較簡單的對象以某種方式組合而成;②
把所有對象都劃分成各種對象類(簡稱為類,Class),每個對象類都定義了一組數(shù)據(jù)和一組方法;③
按照子類與父類的關(guān)系,把若干個對象類組成一個層次結(jié)構(gòu)的系統(tǒng);④對象彼此之間僅能通過傳遞消息互相聯(lián)系;5.2抽象、封裝與類什么是抽象、封裝由于不能應(yīng)付對象的復雜性,人們就選擇了這樣的方法:拋棄非本質(zhì)的細節(jié),集中于我們最關(guān)心的材料。“抽象是指區(qū)別于所有其它種類對象的‘對象的本質(zhì)特征’,因此,相對于觀察者來看,它提供了清晰的、有定義的概念邊界。”
用相關(guān)的方法把變量包圍起來與外界隔離,稱為封裝。封裝后的對象外界不能直接訪問其內(nèi)部數(shù)據(jù),各對象間必須通過消息來通信。換一句話來說,封裝實際上就是使用方法將類的數(shù)據(jù)隱藏起來,控制用戶對類的修改和訪問數(shù)據(jù)的程度。什么是類“類”就是對具有相同數(shù)據(jù)和相同操作的一組相似對象的定義,也就是說,類是對具有相同特性和行為的一個或多個對象的描述。有了類這個概念之后,我們就可以實現(xiàn)面向?qū)ο缶幊?個關(guān)鍵的組成部分:抽象、繼承、封裝和多態(tài)了。舉例:
classCar軟件中的類
{intcolor;intnumber;變量
intspeed;
voidbrake(){…}voidspeedUp(){…}方法
voidslowDown(){…}}什么是對象與類對應(yīng)的就是實例,實例就是由某個特定的類所描述的一個具體的對象。打個比方,我們所說的“人類”,它是一個概念,是對人的一個定義,人類里有一個具體的人,他的名字叫“張三”,“張三”就是一個具體的對象了,他是實實在在的存在著的。那么,“人類”就好比類,“張三”就好比實例了。“對象是類的實例,類是有公共特性的對象的抽象。”比如:
GarbageTruckg;g.brake();g.LoadGarbage();一個類可以定義出無數(shù)個對象,各個對象之間相互獨立,互不影響。用C++描述、識別類用C++識別類:① 用英語寫出需求的陳述;② 用把名詞標識出來;(名詞代表了一個實體)選擇有用的名詞作為類名;決定要將哪些有用的名詞作為類。5.3面向?qū)ο蟮腃++程序的典型結(jié)構(gòu)第一個面向?qū)ο蟮腃++程序一個典型的C++程序一般由以下幾部分組成:頭文件、類(類中包含數(shù)據(jù)成員、成員函數(shù))和main()函數(shù)。例:#include<iostream.h>//頭文件classCar//類{public://訪問限定符
voidback()//成員函數(shù)
{ cout<<"Danger,backingacar!";}};intmain()//主函數(shù){Carc1;//創(chuàng)建對象
c1.back();return0;}(1)頭文件文件包含命令:#include<頭文件>,放在C++程序的開頭。(2)類類是對具有相同特性和行為的一個或多個對象的描述。①類的定義類定義包含兩部分:類頭(classhead)、類體(classbody),類定義后面必須接一個分號。②數(shù)據(jù)成員類數(shù)據(jù)成員的聲明方式跟變量聲明相同,如:③成員函數(shù)C++中,對象的函數(shù)被稱為成員函數(shù),如:④創(chuàng)建對象類是對具有相同特性和行為的一個或多個對象的描述,類的定義(如類Car)不會引起內(nèi)存分配,只有當創(chuàng)建了一個類的對象時,系統(tǒng)才會分配內(nèi)存。對象是類的實例,是具體存在著的。例如:classCar{
…
…};intmain(){Carc1,c2;//創(chuàng)建了c1,c2兩個對象}只有創(chuàng)建了類Car的對象時,才分配一塊足夠包含Car類的數(shù)據(jù)成員的存儲區(qū),名字c1引用到這塊存儲區(qū)。每個類對象都有自己的類數(shù)據(jù)成員的拷貝,修改c1的數(shù)據(jù)成員不會改變?nèi)魏纹渌鸆ar對象的數(shù)據(jù)成員,例如不會修改c2。創(chuàng)建了類的對象之后,就可以用成員訪問操作符來訪問類對象的數(shù)據(jù)成員或成員函數(shù)了,成員訪問操作符——點“
.”或箭頭“
->”,例如:Carc1;c1.number=888;c1.back();(3)main()函數(shù)對于每個C++程序,都必須定義一個稱作main()的函數(shù),它是C++程序開始執(zhí)行時第一個調(diào)用的函數(shù)。當main()函數(shù)執(zhí)行完畢(也就是整個程序執(zhí)行完畢)時,它需要通知操作系統(tǒng)它已經(jīng)執(zhí)行完畢了。return0;意味著程序執(zhí)行完畢且沒有錯誤。如果返回給操作系統(tǒng)的是任何非0的數(shù),這意味著程序執(zhí)行時出現(xiàn)了某種錯誤。作用域分解運算符為了能夠很快地了解一個類中具體包括哪些屬性和方法,使我們編寫的C++程序有更好的可讀性,C++允許將類中的方法的具體實現(xiàn)放置在類定義的外面;為了做到這一點,必須使用C++中提供的作用域分解運算符“::”來定義這些方法。classCargo{public:floatweight;//成員函數(shù)的原型說明,決不可以省略;
voidinit();};//利用作用域分解符將類的成員函數(shù)放在類定義之外;voidCargo::init(){ weight=0.0;}關(guān)于類的this指針當類的函數(shù)的形參與這個類的數(shù)據(jù)成員同名時,在C++中,用this關(guān)鍵字指向于當前正在執(zhí)行的類對象,采用this關(guān)鍵字來告訴C++編譯器到底要訪問哪個變量。例如:classCargo{public:floatweight;//成員函數(shù)的原型說明,決不可以省略;
voidinit();};voidCargo::init(floatweight,floatcharge){ this->weight=weight; this->charge=charge;}單元練習:定義一個類Video,它表示錄像帶租賃店中的錄像帶。試考慮在錄像帶租賃管理程序中,為使錄像帶類運行良好,必須設(shè)計的屬性和方法,請包含一個能顯示錄像帶信息的print()成員函數(shù)。5.4訪問限定符public訪問限定符公有成員(publicmember)在程序的任何地方都可以被訪問。舉例如下:classSerApp{public: charname[30];//公有成員};intmain(){SerAppc;cin>>;//訪問namereturn0;}private訪問限定符私有成員(privatemember)只能被該類的成員函數(shù)和類的友元訪問(友元將在后面講述),不能被其他類對象或函數(shù)訪問(子類也不行)。這樣就實現(xiàn)了信息隱藏,信息隱藏可以使數(shù)據(jù)不受外部變動的影響。舉例如下:classSerApp{private://私有成員
floatimprest;voidwarning() { cout<<"BEEP!Ifyouisnotthepeopleonmyownside,youcanseethisnew!"; }public://公有成員
voidaccept() {cin>>imprest; }};intmain(){SerAppc;c.accept();}錯誤代碼:cin>>c.imprest;或c.warning();//提示出錯:error:cannotaccessprivatememberprotected訪問限定符被保護成員(protectedmember)對派生類(子類)就像public成員一樣,對其他程序則表現(xiàn)得像private成員一樣。protected訪問限定符有意義的用法是在實現(xiàn)繼承時用到。三種訪問限定符的類成員的可見性:單元練習:創(chuàng)建一個類,具有public、private和protected數(shù)據(jù)成員和成員函數(shù)。在main()函數(shù)中,創(chuàng)建該類的一個對象,看看當試圖存取所有的類成員時會得到一些什么編譯信息。5.5靜態(tài)變量和靜態(tài)函數(shù)靜態(tài)變量在類體中的變量聲明前面加上關(guān)鍵字static,就使該變量成為靜態(tài)的。對于非靜態(tài)變量,每個類對象都有自己的拷貝;而靜態(tài)變量對每個類只有一個拷貝,靜態(tài)變量可被該類的所有對象共享訪問。還有,靜態(tài)變量即使在它所屬于的函數(shù)執(zhí)行完后還是保留他們的值,這意味著:靜態(tài)變量在整個程序內(nèi)一直保留著它的值。靜態(tài)變量必須在其類體內(nèi)聲明,但不能在類體內(nèi)初始化,只能在成員函數(shù)或類定義之外(類體外)被初始化。靜態(tài)變量的聲明和初始化,舉例:classSExample{public:staticintsvar;//靜態(tài)變量聲明
…
…}intSExample::svar=0;//靜態(tài)變量初始化①在類的成員函數(shù)中可以直接訪問該類的靜態(tài)變量而不必使用成員訪問操作符:SExample::cout(){svar=svar+1;cout<<”Now,Thetotalis:”<<svar;}②但是,在非成員函數(shù)中我們必須以以下兩種方式之一訪問靜態(tài)變量:a.可以使用成員訪問操作符:intSExample::svar=0;intmain(){SExamples1;s1.svar=1;}b.因為類靜態(tài)變量只有一個拷貝,所以不一定要通過對象或指針來訪問,訪問靜態(tài)變量的另一種方法是用被類名限定修飾的名字直接訪問它:intSExample::svar=0;intmain(){SExample::svar=1;}
當不通過類的成員訪問操作符訪問靜態(tài)變量時,必須指定類名以及緊跟其后的域操作符“
::”。靜態(tài)函數(shù)靜態(tài)函數(shù)的聲明就是在類體中的函數(shù)聲明前加上關(guān)鍵字static。因為靜態(tài)成員在對象創(chuàng)建之前就已經(jīng)存在了,所以,靜態(tài)函數(shù)只能訪問靜態(tài)變量,不能夠訪問非靜態(tài)變量。靜態(tài)函數(shù)聲明舉例:classSExample{public: staticintsvar;staticvoiddisplay()//靜態(tài)函數(shù)聲明
{ cout<<"Thestaticvariableis:"<<svar; }};intSExample::svar=0;與靜態(tài)變量同理,也有兩種方式訪問靜態(tài)函數(shù)。a.可以用成員訪問操作符——點“
.”
和箭頭“
->”,為一個類對象或指向類對象的指針調(diào)用靜態(tài)函數(shù)。b.也可以用類限定修飾名直接訪問或調(diào)用靜態(tài)函數(shù),而無需聲明類對象。舉例:
SExample::display();//訪問方式a SExamples; s.display();//訪問方式b案例提出問題:改善我們的“航空貨物托運費用計算程序”,航空公司能根據(jù)旅客的數(shù)量隨意增加輸入的信息,并能隨時顯示當前的旅客數(shù)量。而且,分段收費要留有接口,以便以后增加更多、更細的收費標準。分析問題:使用靜態(tài)變量存儲當前旅客數(shù)量使用靜態(tài)變量存儲分段收費標準使用靜態(tài)函數(shù)顯示當前的旅客數(shù)量編寫代碼編譯程序檢驗程序執(zhí)行解決問題:見書本單元練習:
創(chuàng)建一個類Monitor,它能知道它的成員函數(shù)incident()被調(diào)用了多少次,增加一個成員函數(shù)print()顯示incident()被調(diào)用的次數(shù)。5.6友元函數(shù)和友元類友元函數(shù)在某些情況下,允許某個特殊函數(shù)而不是整個程序可以訪問類的私有成員,這樣做會比較方便。于是,友元(friend)機制允許一個類授權(quán)其他的函數(shù)訪問它的非公有成員。友元函數(shù)的聲明以關(guān)鍵字friend開頭,它只能出現(xiàn)在類的聲明中,它不受類體中聲明的public、private和protected區(qū)的影響。任何非成員函數(shù)都可以由類聲明為friend(友元函數(shù)),那么,該函數(shù)就可以直接訪問此類對象的非public成員了。例如:classFExample{friendvoidcall1();//說明“call1()函數(shù)是朋友,它可以用x了”;
private:intx;}voidcall1(){FExamplef;f.x=0;//運行通過,因為聲明了友元函數(shù)call1();}voidcall2(){FExamplef;f.x=0;//錯誤,因為call2()函數(shù)并沒有被聲明為友元函數(shù);}友元類在使一個類成為友元時,友元類的所有成員函數(shù)都被給予了訪問“授權(quán)友誼的類的非公有成員”的權(quán)力。舉例如下:classFExample{friendclassFClass1;//說明“FClass1類是朋友,它可以用x了”;
private:intx;};classFClass1{public://“FClass1類是FExample類的朋友”,
voidcall()//FClass1類的所有成員函數(shù)都可以訪問FExample類的非公有成員;
{ FExamplef; cin>>f.x;//聲明了友元類,可以訪問私有成員x }};單元練習:創(chuàng)建三個類,第一個類包含private數(shù)據(jù),并且第二個類和第三個類所有的成員函數(shù)都是它的友元,在main()函數(shù)中演示一下它們是如何正確運行的。5.7構(gòu)造函數(shù)及析構(gòu)函數(shù)
構(gòu)造函數(shù)(1)為什么需要構(gòu)造函數(shù)每當我們要創(chuàng)建對象時,都要為它分配內(nèi)存,但是,分配內(nèi)存并不是數(shù)據(jù)成員的初始化。當然,針對這個問題,可以寫一個初始化的函數(shù),在函數(shù)中對每個數(shù)據(jù)成員賦初值,然后,每當創(chuàng)建一個對象時,就調(diào)用該函數(shù)一次。但是,這樣來初始化很不方便,如果忘記了調(diào)用這個初始化函數(shù),那么運算就會出錯。在C++中,初始化實在太重要了,類的設(shè)計者為我們提供了更好的解決方案。當聲明一個類時,在類里包含一個特殊的成員函數(shù),每當創(chuàng)建類的對象的時候,計算機就自動調(diào)用此函數(shù)。這種函數(shù)稱為構(gòu)造函數(shù)。(2)聲明構(gòu)造函數(shù)構(gòu)造函數(shù)是一個可以被重載的用戶定義的成員函數(shù),它在創(chuàng)建類的對象的時候自動被調(diào)用。構(gòu)造函數(shù)的特點:它的函數(shù)名與類名相同,它不能指定任何返回類型,甚至void也不行。舉例如下:classCargo{public: Cargo();};Cargo::Cargo()//構(gòu)造函數(shù);{cout<<"\nConstructorhasbeeninvoked!";}(3)帶參數(shù)的構(gòu)造函數(shù)一個類可以有多個構(gòu)造函數(shù),只要各個構(gòu)造函數(shù)的參數(shù)的類型不同、或者個數(shù)不同、或者是排列順序不同就可以了,計算機會根據(jù)參數(shù)的不同而自動調(diào)用相應(yīng)的構(gòu)造函數(shù)。定義帶參數(shù)的構(gòu)造函數(shù),舉例如下:classCargo{public: Cargo(floatinitCharge);};Cargo::Cargo(floatinitCharge)//帶參數(shù)的構(gòu)造函數(shù);{ charge=initCharge;//給變量discount賦初值;}intmain(){ Cargoc(5);//在創(chuàng)建對象時,必須帶上構(gòu)造數(shù)的實參; return0;}析構(gòu)函數(shù)(1)為什么需要析構(gòu)函數(shù)另一種情況是,我們還缺少一種對稱的操作,它為生命期即將結(jié)束的類對象再次初始化,返還相關(guān)的資源,或者說自動釋放已獲得的資源。析構(gòu)函數(shù)就是這樣一個特殊的類成員函數(shù),它是構(gòu)造函數(shù)的互補。當該類的對象離開了它的作用域,或者該對象的指針被delete時,析構(gòu)函數(shù)會自動被調(diào)用。(2)聲明析構(gòu)函數(shù)構(gòu)造函數(shù)的特點:析構(gòu)函數(shù)的名字是在類名前加上波浪線(“
~”),它不返回任何值,也沒有任何參數(shù)。因為它不能指定任何參數(shù),所以它也不能被重載。盡管可以為一個類定義多個構(gòu)造函數(shù),但是,只能提供一個析構(gòu)函數(shù),它將被應(yīng)用在該類的所有對象上。舉例說明如下,:classCargo{public: Cargo();~Cargo();};Cargo::Cargo(){owner=newchar[15];//動態(tài)分配內(nèi)存;}Cargo::~Cargo()//析構(gòu)函數(shù);{cout<<"\nDestructorhasinvoked!"<<endl; delete[]owner;//釋放內(nèi)存;}注意
①構(gòu)造函數(shù)不能顯式地被調(diào)用,例如:c.Cargo();//錯誤但是,析構(gòu)函數(shù)卻不同,它可以顯式的多次被調(diào)用,如果有必要的話。語法跟成員函數(shù)的調(diào)用一樣,例如:c.~Cargo();②當使用new運算符動態(tài)創(chuàng)建對象的指針時,new運算符也會自動調(diào)用構(gòu)造函數(shù)的;當使用delete運算符釋放指針時,那么,delete運算符也會自動調(diào)用析構(gòu)函數(shù)。對象的生命周期考察以下程序,用來說明類Lifecycle對象的生命周期:#include<iostream.h>classLifecycle{staticinti;intflag;//變量flag用來標明是第幾個對象
public: Lifecycle()//構(gòu)造函數(shù)
{ i++; flag=i;cout<<"\nObj["<<flag<<"]'sConstructorhasbeeninvoked!"; } ~Lifecycle()//析構(gòu)函數(shù)
{cout<<"\nObj["<<flag<<"]'sDestructorhasbeeninvoked!"; }};intLifecycle::i=0;Lifecycleobj1;//創(chuàng)建第一個類對象intmain(){cout<<"\nProgramstartinhere!"; Lifecycleobj2;//創(chuàng)建第二個類對象
{ cout<<"\nTheblockstartinhere!"; Lifecycleobj3;//創(chuàng)建第三個類對象
cout<<"\nTheblockfinishinhere!"; } cout<<"\nProgramfinishinhere!"; return0;cout<<"\nHere,youcan'tseeanything!";}運行上面的程序,我們看到的結(jié)果將會是:Obj[1]'sConstructorhasbeeninvoked!Programstartinhere!Obj[2]'sConstructorhasbeeninvoked!Theblockstartinhere!Obj[3]'sConstructorhasbeeninvoked
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東科技學院《無人機航測與規(guī)劃制圖》2023-2024學年第一學期期末試卷
- 廣東江門幼兒師范高等??茖W?!痘粞莩c欣賞》2023-2024學年第一學期期末試卷
- 廣東機電職業(yè)技術(shù)學院《合唱指揮二》2023-2024學年第一學期期末試卷
- 廣東工業(yè)大學《社區(qū)發(fā)展與社會治理》2023-2024學年第一學期期末試卷
- 廣東第二師范學院《法語語音》2023-2024學年第一學期期末試卷
- 廣東白云學院《影視編導基礎(chǔ)》2023-2024學年第一學期期末試卷
- 贛州職業(yè)技術(shù)學院《工程安全與環(huán)境保護》2023-2024學年第一學期期末試卷
- 憲法課件培訓內(nèi)容
- 贛西科技職業(yè)學院《經(jīng)濟效益審計》2023-2024學年第一學期期末試卷
- 贛東學院《中外經(jīng)典戲劇與文學》2023-2024學年第一學期期末試卷
- 腫瘤病例隨訪調(diào)查表
- 游樂園、滑雪場、冰雪樂園建設(shè)合作協(xié)議
- 建設(shè)項目環(huán)境監(jiān)理 環(huán)境監(jiān)理大綱的編制 環(huán)境監(jiān)理大綱的編制
- 粉末涂料有限公司檢維修作業(yè)安全風險分級清單
- 【蘇教版】2022-2023學年六年級數(shù)學上冊期末試卷(及答案)
- 2023-2024學年連云港市灌云縣四年級數(shù)學第一學期期末學業(yè)水平測試模擬試題含答案
- 湖南省懷化市鶴城區(qū)2023年數(shù)學三下期末監(jiān)測試題含解析
- 項目工程安全管理責任區(qū)域劃分表
- 2023年學校食堂審計發(fā)現(xiàn)問題整改報告3篇
- 教育培訓學校(機構(gòu))課堂教學反饋表
- 2023年全國測繪生產(chǎn)成本費用定額
評論
0/150
提交評論