版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2.1對(duì)象的創(chuàng)建2.2構(gòu)造函數(shù)
2.3析構(gòu)函數(shù)
2.4構(gòu)造參數(shù)
2.5動(dòng)態(tài)內(nèi)存分配
2.6常量
2.7const對(duì)象
2.8靜態(tài)成員
本章要點(diǎn)
練習(xí)
2.1.1對(duì)象創(chuàng)建順序
在前一章中已介紹了定義對(duì)象的方法:先描述類,然后由類來(lái)定義對(duì)象。描述的類并不占用內(nèi)存空間,當(dāng)類定義了對(duì)象后才占用內(nèi)存空間。當(dāng)我們?cè)谝粋€(gè)程序中定義了多個(gè)不同作用域的對(duì)象時(shí),就存在創(chuàng)建時(shí)的先后次序問題。
【例2-1】定義三個(gè)Desk類的對(duì)象,并說(shuō)明創(chuàng)建對(duì)象的先后次序。2.1對(duì)?象?的?創(chuàng)?建運(yùn)行結(jié)果:
weight=0size=0
weight=x…xsize=13 //weight是隨機(jī)值
weight=0size=0
在本例中按照定義對(duì)象的方法分別定義了全局對(duì)象、局部對(duì)象和靜態(tài)對(duì)象。從定義對(duì)象的位置來(lái)看,對(duì)象c和b都在main中定義,它們是局部對(duì)象,僅在main中有效;對(duì)象a的定義在函數(shù)之外,它是全局對(duì)象,從定義點(diǎn)開始到本文件結(jié)束都有效。當(dāng)創(chuàng)建多個(gè)同類對(duì)象時(shí),按定義的先后次序創(chuàng)建。當(dāng)同時(shí)創(chuàng)建全局對(duì)象、局部對(duì)象(包括靜態(tài)局部對(duì)象)時(shí),先創(chuàng)建全局對(duì)象后創(chuàng)建局部對(duì)象。如在例2-1中對(duì)象的創(chuàng)建次序?yàn)椋簩?duì)象a→對(duì)象c→對(duì)象b。
本例中我們定義了三個(gè)Desk類的對(duì)象,即有了a、b、c三張桌子。從運(yùn)行結(jié)果可知,桌子a和b的重量和大小都為0,即靜態(tài)對(duì)象和全局對(duì)象不賦初值,則為0。桌子c只設(shè)定了大小,并沒有給出重量,那么對(duì)象的重量是隨機(jī)值。因weight是被保護(hù)成員,所以要設(shè)定桌子c的重量,必須添加成員函數(shù)。2.1.2對(duì)象的賦值
在例2-1中,我們并沒有對(duì)書桌的保護(hù)成員(重量)賦值。對(duì)于類中的保護(hù)或私有成員,外界不能直接訪問,要實(shí)現(xiàn)賦值,就要由成員函數(shù)來(lái)完成。
【例2-2】接例2-1演示如何訪問保護(hù)成員。運(yùn)行結(jié)果:
weigth=XXsize=13 //XX為隨機(jī)值
weigth=18size=0
在本例中還有一個(gè)成員函數(shù)Set,用來(lái)完成重量值的設(shè)定。在定義對(duì)象時(shí)自動(dòng)設(shè)定初始值,即初始化的工作,由構(gòu)造函數(shù)來(lái)完成。2.2.1構(gòu)造函數(shù)的特點(diǎn)
構(gòu)造函數(shù)是一個(gè)特殊的成員函數(shù),它與類同名。構(gòu)造函數(shù)沒有類型(void類型也不行),函數(shù)體中也不允許有返回值,但可以有無(wú)值返回語(yǔ)句return。構(gòu)造函數(shù)由系統(tǒng)在創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用。
【例2-3】演示構(gòu)造函數(shù)的應(yīng)用。2.2構(gòu)造函數(shù)在本例中有一個(gè)成員函數(shù)Desk,它與類同名,它就是構(gòu)造函數(shù),它對(duì)數(shù)據(jù)成員weight進(jìn)行了初始化,在創(chuàng)建對(duì)象a和c時(shí)Desk被自動(dòng)調(diào)用。在本例中還有一個(gè)成員函數(shù)Set,它可對(duì)重量進(jìn)行重新設(shè)定或改變。那么兩者之間有什么區(qū)別呢?Desk與Set的主要區(qū)別就是:前者是構(gòu)造函數(shù),由系統(tǒng)自動(dòng)調(diào)用;后者是成員函數(shù),需人為調(diào)用。2.2.2構(gòu)造函數(shù)的需要性
若程序員需要對(duì)數(shù)據(jù)成員進(jìn)行初始化,就要提供構(gòu)造函數(shù),并在其中完成賦值。構(gòu)造函數(shù)可以帶參數(shù)也可以不帶參數(shù)。帶參數(shù)的構(gòu)造函數(shù)必須由程序員提供。不帶參數(shù)的構(gòu)造函數(shù)由系統(tǒng)自動(dòng)提供,也可以人為提供。一旦程序員提供了構(gòu)造函數(shù),原來(lái)的默認(rèn)構(gòu)造函數(shù)就被取代。構(gòu)造函數(shù)的主要功能就是初始化類的對(duì)象。2.2.3構(gòu)造函數(shù)的調(diào)用時(shí)機(jī)
構(gòu)造函數(shù)在創(chuàng)建類的對(duì)象時(shí),由系統(tǒng)自動(dòng)調(diào)用,而且每創(chuàng)建一個(gè)對(duì)象只能自動(dòng)調(diào)用一次。通過自動(dòng)調(diào)用就創(chuàng)建了對(duì)象,因此我們也可以說(shuō)構(gòu)造了一個(gè)對(duì)象。
【例2-4】演示對(duì)象構(gòu)造次序和默認(rèn)構(gòu)造函數(shù)。Deska('A'); //定義了一個(gè)Desk的全局對(duì)象a運(yùn)行結(jié)果:
constructA
constructC
constructB
從語(yǔ)句位置來(lái)看,對(duì)象a是最后申請(qǐng)的,但它卻是第一個(gè)構(gòu)造的。對(duì)象構(gòu)造的次序依據(jù)的原則是先區(qū)分性質(zhì),后區(qū)分位置。當(dāng)構(gòu)造多個(gè)不同作用域?qū)ο髸r(shí),先創(chuàng)建全局對(duì)象,后創(chuàng)建局部對(duì)象;對(duì)于相同作用域的對(duì)象,由定義的先后次序決定。2.3.1析構(gòu)函數(shù)的特點(diǎn)
析構(gòu)函數(shù)的表示方法是:在構(gòu)造函數(shù)前加波浪線~(所以它也稱為逆構(gòu)造函數(shù)),然后將要釋放的內(nèi)容,即要執(zhí)行的語(yǔ)句放入該函數(shù)中。
【例2-5】析構(gòu)函數(shù)的演示。2.3析構(gòu)函數(shù)運(yùn)行結(jié)果:
constructobject
5↙
x=5
destructobject
局部對(duì)象在函數(shù)返回時(shí)生命結(jié)束,便被析構(gòu)。要說(shuō)明的是,構(gòu)造函數(shù)與析構(gòu)函數(shù)可以實(shí)現(xiàn)函數(shù)的所有功能,但是往往只讓它們實(shí)現(xiàn)一些與名稱相符的功能。在本例中,在構(gòu)造函數(shù)與析構(gòu)函數(shù)中使用了輸出語(yǔ)句,主要是為了方便觀察執(zhí)行次序。以后也有類似的情況,不再說(shuō)明。
析構(gòu)函數(shù)是特殊的成員函數(shù),它沒有返回類型,沒有參數(shù),由系統(tǒng)自動(dòng)調(diào)用,不能隨意調(diào)用。因?yàn)槲鰳?gòu)函數(shù)沒有參數(shù),也就沒有重載。因?yàn)槲鰳?gòu)函數(shù)不能被調(diào)用,所以也沒有遞歸調(diào)用。一個(gè)類只能有一個(gè)析構(gòu)函數(shù)。2.3.2析構(gòu)函數(shù)的需要性
若在堆中分配了內(nèi)存,則要在析構(gòu)函數(shù)內(nèi)用delete釋放。若沒有需要?dú)w還的資源,可以不指定析構(gòu)函數(shù)。析構(gòu)函數(shù)的主要作用就是歸還資源。在不提供析構(gòu)函數(shù)時(shí),系統(tǒng)執(zhí)行默認(rèn)的析構(gòu)函數(shù)。默認(rèn)析構(gòu)函數(shù)是函數(shù)體為空的函數(shù),它什么也不做。同樣地,一旦人為提供了析構(gòu)函數(shù),該人為提供的析構(gòu)函數(shù)就取代了原來(lái)默認(rèn)的析構(gòu)函數(shù),則原來(lái)默認(rèn)的析構(gòu)函數(shù)就不存在了。
【例2-6】演示對(duì)象構(gòu)造與析構(gòu)次序。運(yùn)行結(jié)果:
high=30 //全局對(duì)象先構(gòu)造
width=10 //局部對(duì)象按定義次序構(gòu)造
length=20
destructBench//先析構(gòu)局部對(duì)象,按構(gòu)造時(shí)相反的次序析構(gòu)
destructDesk
destructChair //程序執(zhí)行完畢,最后析構(gòu)全局對(duì)象
該例中若不提供析構(gòu)函數(shù)也可以,即在對(duì)象取消時(shí)調(diào)用默認(rèn)析構(gòu)函數(shù)就可以了?,F(xiàn)提供了析構(gòu)函數(shù)并在函數(shù)體中添加了輸出語(yǔ)句,以便確認(rèn)析構(gòu)函數(shù)是否被調(diào)用以及調(diào)用的時(shí)機(jī)。2.3.3析構(gòu)函數(shù)的調(diào)用時(shí)機(jī)
析構(gòu)函數(shù)是在類對(duì)象生命結(jié)束的時(shí)候,由系統(tǒng)自動(dòng)調(diào)用的。調(diào)用的順序取決于對(duì)象生命結(jié)束(取消對(duì)象)的順序。對(duì)于局部對(duì)象,在該局部對(duì)象退出作用域或遇到函數(shù)結(jié)束標(biāo)記時(shí)生命結(jié)束。對(duì)于全局對(duì)象,則在整個(gè)程序執(zhí)行完畢時(shí)生命結(jié)束。析構(gòu)的次序與構(gòu)造函數(shù)相反,即后構(gòu)造先析構(gòu)。2.4.1帶參數(shù)的構(gòu)造函數(shù)
構(gòu)造函數(shù)也可以帶參數(shù),以使對(duì)象的構(gòu)造按程序員的要求進(jìn)行。但是程序員一旦提供了構(gòu)造函數(shù),那么原來(lái)系統(tǒng)自動(dòng)提供的默認(rèn)構(gòu)造函數(shù)就不復(fù)存在了。為了便于以后定義無(wú)參對(duì)象時(shí)不發(fā)生語(yǔ)法錯(cuò)誤,建議在人為提供了構(gòu)造函數(shù)之后,再提供一個(gè)默認(rèn)的構(gòu)造函數(shù)。
【例2-7】演示帶參數(shù)的構(gòu)造函數(shù)。2.4構(gòu)造參數(shù)運(yùn)行結(jié)果:
Constructing Jonas
Mynameis Lolee
Mynameis Jones
Destructing Lolee
Destructing Jones用戶定義了帶參的構(gòu)造函數(shù)后,最好再定義一個(gè)無(wú)參的構(gòu)造函數(shù),如上面的Student(){}。這樣做的理由是,既可以用帶參的構(gòu)造函數(shù)初始化studA對(duì)象,也可以用不帶參的構(gòu)造函數(shù)初始化studB對(duì)象,應(yīng)用較靈活。后面在講繼承時(shí)將進(jìn)一步說(shuō)明無(wú)參的構(gòu)造函數(shù)的需要性。
本例先構(gòu)造了studA,名字為Jonas,接著想將它改為Jones,于是就添加了普通成員函數(shù)Set,因?yàn)橹挥谐蓡T函數(shù)才能訪問私有成員。然后通過調(diào)用Set再來(lái)重新設(shè)定或改變對(duì)象參數(shù),如studA.Set(982002,"Jones",78)。2.4.2帶默認(rèn)參數(shù)的構(gòu)造函數(shù)
C++允許給函數(shù)定義默認(rèn)參數(shù)值。構(gòu)造函數(shù)的參數(shù)也可以用默認(rèn)方式提供。通過默認(rèn)參數(shù)值,可讓編程工作簡(jiǎn)單,讓編譯器做更多的檢查錯(cuò)誤工作,同時(shí)也增加了函數(shù)的可重用性。在實(shí)際應(yīng)用中,構(gòu)造函數(shù)往往都帶有默認(rèn)參數(shù)。若構(gòu)造函數(shù)內(nèi)的參數(shù)都進(jìn)行了默認(rèn),那么該構(gòu)造函數(shù)就成為默認(rèn)參數(shù)構(gòu)造函數(shù)。
1.默認(rèn)參數(shù)的聲明
當(dāng)需要給函數(shù)提供默認(rèn)參數(shù)時(shí),有兩個(gè)途徑:在函數(shù)的聲明中提供默認(rèn)參數(shù),也可以在函數(shù)的實(shí)現(xiàn)中提供默認(rèn)參數(shù)。但是不能兩者同時(shí)提供默認(rèn)參數(shù)。若某函數(shù)既有聲明也有定義,則默認(rèn)參數(shù)只能出現(xiàn)在函數(shù)的聲明中,定義中不可以再有默認(rèn)參數(shù)。若某函數(shù)只有定義,則默認(rèn)參數(shù)可出現(xiàn)在函數(shù)的定義中。例如:
voidfun(int=3,int=4); //聲明
voidfun(intx,inty) //定義
{cout<<x<<‘\t’<<y<<endl;}
2.提供默認(rèn)參數(shù)的方法
若函數(shù)有多個(gè)默認(rèn)參數(shù),則在形參的分布中,默認(rèn)參數(shù)應(yīng)當(dāng)按從右至左的順序連續(xù)提供。調(diào)用時(shí),實(shí)參則是從左至右連續(xù)匹配形參。不論是聲明還是匹配,參數(shù)的提供都必須是連續(xù)的,否則會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤。聲明部分:
voidfun(inta=1,intb,intc=3); //error
voidfun(inta,intb=1,intc=3); //ok
調(diào)用部分:
fun(2,4,6) ;//ok,形參以調(diào)用時(shí)提供的實(shí)參為準(zhǔn),a=2,b=4,c=6
fun(3); //ok,3傳給a,其余默認(rèn)
fun(3,4); //ok,3傳給a,4傳給b,其余默認(rèn)
fun(); //error,a沒有默認(rèn)值
fun(3,,4); //error,不允許參數(shù)中間使用默認(rèn)值第一句出錯(cuò)的原因是,默認(rèn)參數(shù)沒有從右至左連續(xù)提供,而是中斷了,因?yàn)橹虚g一個(gè)b沒有默認(rèn)值。最后一句出錯(cuò)的原因是,默認(rèn)參數(shù)沒有從左至右連續(xù)提供,而是中斷了,因?yàn)橹虚g一個(gè)b沒有提供默認(rèn)值。
【例2-8】說(shuō)明帶默認(rèn)參數(shù)構(gòu)造函數(shù)的使用。運(yùn)行結(jié)果:
high=7 width=8 //構(gòu)造對(duì)象a
high=11 width=8 //構(gòu)造對(duì)象b
high=7 width=8 //構(gòu)造有2個(gè)單元的對(duì)象數(shù)組c,
因此調(diào)用兩次構(gòu)造函數(shù)
high=7 width=8
destruct //析構(gòu)函數(shù)對(duì)象數(shù)組c中后構(gòu)造的第二個(gè)單元
destruct //析構(gòu)函數(shù)對(duì)象數(shù)組c中先構(gòu)造的第一個(gè)單元
destruct //析構(gòu)對(duì)象b
destruct //析構(gòu)對(duì)象a在本例中用到了Deskc[2],它是構(gòu)造對(duì)象數(shù)組c,該對(duì)象數(shù)組有兩個(gè)單元長(zhǎng)度。在此并沒有提供初始值,它用默認(rèn)參數(shù)構(gòu)造。若要提供參數(shù),可以使用如下語(yǔ)句:
Deskc[2]={22,33};
輸出結(jié)果為:
high=7 width=8
high=11 width=8
high=22 width=8 //對(duì)象c[0]的high是22
high=33 width=8 //對(duì)象c[1]的high是33從輸出結(jié)果可見,在上面的方法中只是改變了第一個(gè)參數(shù)。Deskc[2]={22,33};實(shí)際上相當(dāng)于Deskc[2]={Desk(22),Desk(33)};。要想改變多個(gè)參數(shù),可以使用如下語(yǔ)句:
Deskc[2]={Desk(11,22),Desk(33,44)};
輸出結(jié)果為:
…
high=11 width=22 //對(duì)象c[0]的high是11,width是22
high=33 width=44 //對(duì)象c[1]的high是33,width是44
...3.對(duì)默認(rèn)值的要求
只要在程序編譯時(shí)就能確定的值,都可以作為默認(rèn)值。默認(rèn)值可以是常量、全局變量和一個(gè)函數(shù)。默認(rèn)值不可以是局部變量。
【例2-9】給構(gòu)造函數(shù)提供三個(gè)默認(rèn)值a、fun()和d。#include<iostream.h>
intd=5;
intfun()
{intx;cin>>x;returnx;}
voidmain()
{inta=8;}
classDesk
{protected:程序在編譯時(shí),Desk(int=a,int=fun(),int=d);出錯(cuò),因?yàn)閍是main()函數(shù)中的局部變量。將a改為一個(gè)可確定的值,如8就可以了。同時(shí)要注意,本例中d的定義位置和函數(shù)fun的聲明或定義位置要放在默認(rèn)參數(shù)聲明之前,且fun必須有返回值。2.4.3默認(rèn)構(gòu)造函數(shù)
默認(rèn)構(gòu)造函數(shù)最多只能有一個(gè),由系統(tǒng)自動(dòng)提供或由程序員提供。構(gòu)造函數(shù)可以帶參數(shù),若構(gòu)造函數(shù)內(nèi)的參數(shù)皆為默認(rèn),則該構(gòu)造函數(shù)就成為默認(rèn)構(gòu)造函數(shù),此時(shí)程序員不能再提供無(wú)參默認(rèn)構(gòu)造函數(shù),否則就會(huì)出現(xiàn)二義性的語(yǔ)法錯(cuò)誤。
例如,下面兩個(gè)默認(rèn)構(gòu)造函數(shù)只能出現(xiàn)一個(gè),否則,在執(zhí)行Deskdesk時(shí)就會(huì)出現(xiàn)二義性。以默認(rèn)方式創(chuàng)建對(duì)象時(shí)無(wú)圓括號(hào),如:Deskdesk,而不能用Deskdesk()。因?yàn)樵撔问揭驯挥糜诤瘮?shù)的聲明,如floatdesk();。2.4.4成員初試化表
構(gòu)造函數(shù)主要用來(lái)實(shí)現(xiàn)成員參數(shù)的初試化。其中,既可以在函數(shù)體中實(shí)現(xiàn)初試化,也可以在成員初試化參數(shù)表中實(shí)現(xiàn)初試化。方法是在類的構(gòu)造函數(shù)的參數(shù)表后加“:成員名(初試化值)”。2.5.1申請(qǐng)堆和釋放堆內(nèi)存
申請(qǐng)堆的一般方法是:
new操作數(shù);
其中,操作數(shù)是數(shù)據(jù)類型,它可以帶初始化值表或單元個(gè)數(shù)。new和操作數(shù)之間要有空格。執(zhí)行new語(yǔ)句后的返回值是一個(gè)指向由操作數(shù)所規(guī)定的數(shù)據(jù)類型的指針,即具有操作數(shù)之?dāng)?shù)據(jù)類型的指針。2.5動(dòng)態(tài)內(nèi)存分配當(dāng)某一堆內(nèi)存不再需要時(shí),要將其釋放并歸還給系統(tǒng)。釋放堆內(nèi)存的方法是:
deletep;和delete[]q;
其中,p代表指向非數(shù)組空間的指針,q代表指向數(shù)組空間的指針。
在C++中new和delete是運(yùn)算符,不是函數(shù),因此執(zhí)行效率高。執(zhí)行new時(shí)可以直接返回一個(gè)指向具體的數(shù)據(jù)空間的指針,并且具有自動(dòng)調(diào)用構(gòu)造函數(shù)的能力。執(zhí)行delete具有自動(dòng)調(diào)用析構(gòu)函數(shù)的能力。
1.在堆中申請(qǐng)空間的方法
在堆中申請(qǐng)空間的一般方法是:
new類型名參數(shù);
其中,類型名可以是內(nèi)部類型,也可以是類類型;參數(shù)若是指定數(shù)組單元,則用[]包圍,否則用()包圍。例如:
newint; //開辟一個(gè)整型空間,并返回整型指針
newint(100); //開辟一個(gè)整型空間,并初始化為100
float*p=newfloat(3.14159);//開辟一個(gè)存放實(shí)數(shù)的空間,并指定該實(shí)數(shù)的初值為3.14159,
//返回的指向?qū)嵭蛿?shù)據(jù)的指針的指針賦給指針變量p
newchar[10]; //開辟字符數(shù)組空間,長(zhǎng)度為10
newint[5][4]; //開辟一個(gè)二維整型數(shù)組的空間
newchar*(p);//開辟一個(gè)存放指針p的空間【例2-10】new和delete的使用方法。
#include<iostream.h>
voidmain()
{int*p;p=newint; //在堆內(nèi)申請(qǐng)一個(gè)整型單元
deletep; //釋放時(shí)delete和操作數(shù)之間要有空格
double*q;q=newdouble;
deleteq;
char*r;r=newchardeleter;
intn;cin>>n;
int*p1;p1=newint[n];
//分配一個(gè)堆數(shù)組
delete[]p1;
//釋放一個(gè)堆數(shù)組
int*p2;p2=(int*)newint[4][5];//分配堆空間,并將int(*)[5]強(qiáng)
制轉(zhuǎn)換為int*
delete[4]p2; //釋放一個(gè)4×5的二堆數(shù)組空間
int*p3;p3=newint(2);
deletep3;
}釋放p1所指對(duì)象數(shù)組時(shí),delete[]p1中的[]p1的語(yǔ)義是告訴C++,p1指針指向的是一個(gè)數(shù)組,把該數(shù)組空間釋放掉。對(duì)于二維數(shù)組的釋放要給出行數(shù),如本例的delete[4]p2。若改為deletep2,則釋放二維數(shù)組第0行所占的存儲(chǔ)空間。2.堆中空間的訪問
#include<iostream.h>
voidmain()
{int*p;
p=(int*)newint[4][5];
//將二維數(shù)組指針強(qiáng)制轉(zhuǎn)換為一維數(shù)組指針
p[0]=11;p[1]=22;p[19]=33;//可從0號(hào)單元訪問到19號(hào)單元
cout<<p[0]<<""<<p[1]<<""<<p[19]<<endl;
delete[4]p; //釋放一個(gè)二堆數(shù)組
}2.5.2new和delete的應(yīng)用
1.分配和釋放堆對(duì)象
C++中可以使用new和delete在堆中分配和釋放對(duì)象。例如:
Student*p=newStudent;
deletep;
先自動(dòng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)Student類的無(wú)名對(duì)象,并用p指針指向它;然后人為調(diào)用析構(gòu)函數(shù),將p指針指向的對(duì)象析構(gòu)。
【例2-11】演示創(chuàng)建堆對(duì)象。在本例中,分別用默認(rèn)參數(shù)和人為提供參數(shù)的方法,創(chuàng)建了兩個(gè)局部堆對(duì)象,然后將其釋放。本例還演示了delete調(diào)用析構(gòu)函數(shù)的能力。
#include<iostream.h>
classDesk
{protected:運(yùn)行結(jié)果:
high=2 width=3.2 //構(gòu)造堆對(duì)象,并被p所指
high=22 width=25.2 //構(gòu)造堆對(duì)象,并被q所指
23.2
destruct //析構(gòu)被q所指的堆對(duì)象
destruct //析構(gòu)被p所指的堆對(duì)象
X…….X //X…….X為隨機(jī)值運(yùn)行結(jié)果:
France
length=7 width=3 high=4 weight=9.4
本例在main中創(chuàng)建了一個(gè)局部對(duì)象a,同時(shí)在構(gòu)造函數(shù)中申請(qǐng)了堆空間。當(dāng)函數(shù)結(jié)束時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)析構(gòu)對(duì)象a,并將資源歸還。對(duì)于在構(gòu)造函數(shù)中分配了堆空間的對(duì)象,每創(chuàng)建一個(gè)對(duì)象,都會(huì)申請(qǐng)堆空間,因此在析構(gòu)中要將其釋放。
2.關(guān)于delete的正確位置
我們比較例2-11和例2-12可以發(fā)現(xiàn),delete的位置是不同的。對(duì)于堆對(duì)象,可以在程序員需要的地方創(chuàng)建,在不需要處釋放。對(duì)于在構(gòu)造函數(shù)中分配的堆對(duì)象,要將delete放在析構(gòu)函數(shù)中;對(duì)于非構(gòu)造函數(shù)內(nèi)分配的堆對(duì)象,一般在該函數(shù)的結(jié)束符“}”前加入delete,以釋放堆空間。
3.分配和釋放對(duì)象數(shù)組
C++用new和delete在堆中分配和釋放對(duì)象數(shù)組。使用方法:
new類型名[數(shù)組長(zhǎng)度];
【例2-13】分配和釋放對(duì)象數(shù)組。
#include<iostream.h>
#include<string.h>
classStudent
{public:voidmain(){fun(3);}運(yùn)行結(jié)果:
noname
noname
noname
Kaste
Jonas
Randy
Kaste
Jonas
Randy在本例的fun函數(shù)體中有Student*ps,意為定義一個(gè)Student類型的指針,它可以指向Student類的對(duì)象或?qū)ο髷?shù)組。在fun中共申請(qǐng)了三個(gè)Student對(duì)象,分別存放在數(shù)組單元中。這三個(gè)對(duì)象的姓名都是noname。接著,ps[0].Setname("Kaste");將姓名Kaste通過成員函數(shù)Setname賦給數(shù)組0號(hào)單元中的對(duì)象;ps[1].Setname("Jonas")將姓名Jonas賦給數(shù)組1號(hào)單元中的對(duì)象;ps[2].Setname("Randy")將姓名Randy賦給數(shù)組2號(hào)單元中的對(duì)象。最后通過指針運(yùn)算符“ps->”訪問成員函數(shù)。
4.用new與定義對(duì)象來(lái)開辟空間的區(qū)別
用new或定義對(duì)象來(lái)開辟空間時(shí),它們都能自動(dòng)調(diào)用構(gòu)造函數(shù),但是對(duì)象所在的空間位置是不同的。用new開辟空間時(shí)是在堆中分配空間;通過類定義對(duì)象時(shí),在全局?jǐn)?shù)據(jù)區(qū)或棧區(qū)分配空間。兩者的區(qū)別除了空間的位置區(qū)別外,在析構(gòu)時(shí)也存在差別:全局?jǐn)?shù)據(jù)對(duì)象是在程序結(jié)束時(shí)被析構(gòu)的,棧區(qū)對(duì)象是在定義該對(duì)象的函數(shù)結(jié)束時(shí)被析構(gòu)的,而堆中的對(duì)象必須執(zhí)行delete才能被析構(gòu)。運(yùn)行結(jié)果:
constructteacher
constructstudent
constructteacher
deleteteacher //若主函數(shù)中去掉deletep,則無(wú)此輸出
deletestudent //棧對(duì)象a在函數(shù)結(jié)束時(shí)自動(dòng)析構(gòu)
deleteteacher //全局對(duì)象t在整個(gè)程序結(jié)束時(shí)自動(dòng)析構(gòu)從運(yùn)行結(jié)果中不難發(fā)現(xiàn),用Studa;創(chuàng)建的對(duì)象在生命期結(jié)束時(shí)自動(dòng)調(diào)用析構(gòu)函數(shù);用new創(chuàng)建的對(duì)象在生命期結(jié)束時(shí)是不會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)的,而必須使用delete才能釋放堆內(nèi)存和調(diào)用析構(gòu)函數(shù)。2.5.3使用堆空間
全局對(duì)象和局部對(duì)象的生命期是嚴(yán)格定義的,程序員不能以任何方式改變它們的生命期。若要控制對(duì)象的生命期,可以定義堆對(duì)象。除此以外,通常在以下情況下要使用堆空間。
(1)直到運(yùn)行時(shí)才知道需要多少對(duì)象空間。
(2)不知道對(duì)象的生成期到底有多長(zhǎng)。
(3)直到運(yùn)行時(shí)才知道一個(gè)對(duì)象需要多少內(nèi)存空間。盡管動(dòng)態(tài)分配的堆空間具有較大的彈性與靈活性,但它是有限的。過多的使用有可能將它耗盡,此時(shí)的請(qǐng)求就會(huì)導(dǎo)致失敗。在C++中,若返回一個(gè)空指針NULL,則表明分配對(duì)象失敗。這也是分配堆內(nèi)存空間是否成功的一個(gè)標(biāo)記。例如:
str=newchar[9];
if(!str){cerr<<"Memoryexhausted!\n";exit(0);}2.6.1常量的定義
在C++中一般用關(guān)鍵字const來(lái)定義常量。常量是常數(shù)或代表固定不變值的代名詞。常量是不能作為左值的量。
程序中如果想讓變量的內(nèi)容自初始化后一直保持不變,可以定義一個(gè)常量。定義方法:
const類型常量名=常量;
本定義的語(yǔ)義是指定該常量名是常量。2.6常量例如:
constfloatpi=3.141592653f; //指定pi是常量
constintSIZE=6; //指定SIZE是常量
constinta[]={1,2,3}; //指定a[i]是常量
一般將常量定義放在頭文件中或放在#define處。常量在定義時(shí)必須初始化,如:constfloatpi=3.141592f;。若用constfloatpi;pi=3.141592;定義則出錯(cuò),錯(cuò)誤原因有兩條:第一條是pi在定義的同時(shí)沒有初始化,第二條是將常量作為左值。
【例2-15】演示常量的使用方法。其中pi是常量名,float常量只能存儲(chǔ)6位有效數(shù)字。
#include<iostream.h>
intmax(){return8;}
voidmain()
{constfloatpi=3.141592653f;
consta[]={1,2,3}; //整型也可以默認(rèn)
cout<<pi<<'\t'<<a[1]<<endl; //ok,輸出3.14159和2intx=8,y;
constintb=x+3; //ok,初始化值可以是一個(gè)表達(dá)式
cin>>y;
constintc=y; //ok,初始化值可以是變量,但必須有確定的值
y=3; //ok,變量可以改變
constintsize=sizeof(int); //ok
constintnumber=max(); //ok,初始化值可以是具有相同
類型返回值的函數(shù)
}該例的運(yùn)行結(jié)果是,pi的輸出為3.14159。
常量的初始化值可以是常量,也可以是編譯時(shí)還不能確定值的變量。對(duì)常量的要求是:定義的同時(shí)必須初始化,常量不能作為左值。2.6.2常量指針
常量指針也稱為指向常量的指針。它指定該指針?biāo)赶虻膶?duì)象是常量,不是變量。它保證了不能通過常量指針來(lái)改變常量指針?biāo)竼卧獌?nèi)的值。通過該指針訪問單元時(shí),單元內(nèi)的值只能讀出而不能被更改。在指針定義語(yǔ)句的類型前加const,如constint*p;或intconst*p;,都可以定義常量指針p,并將指定p所指向的對(duì)象是常量,不是變量。該定義的語(yǔ)義是:它告訴編譯器*p是常量,不能將*p作為左值進(jìn)行操作,即不能通過*p來(lái)改變p所指向的對(duì)象內(nèi)的值。
定義常量指針時(shí)可以不初始化,以后它還可以改變指向。常量指針可以指向變量,也可以指向常量,而指針變量不能指向常量。
【例2-16】演示常量指針的使用方法。#include<iostream.h>
voidmain()
{constinta=66;
constintb=88;intc=55;
int*r=&c;
intconst*p=&a; //定義常量指針并指向常量a
intconst*q;q=&c; //可以先定義后初始化
cout<<*p<<'\t';p=&b; //ok,常量指針可以變換指向
cout<<*p<<‘\t’;
p=&c; //ok,常量指針可以指向其他同類型的變量
c=20; //ok,?c是變量
cout<<*p<<endl;
}
運(yùn)行結(jié)果:
66 88 20從本例中可見,變量的指針不可以指向常量,而常量指針可以指向變量,也可以指向常量,也可以改變指向。例如,p可以初始化為指向變量,也可以初始化為指向常量。常量指針的含意并不是p不能改變指向,而是不能將*p作為左值進(jìn)行操作。
定義指向常量的指針p只限制*p不能作為左值,而不能限制指針?biāo)赶驅(qū)ο蟊旧淼牟僮?。如本例中,在進(jìn)行p=&c;c=20;操作后,c單元內(nèi)的值就被修改了。2.6.3指針常量
1.定義與引用
定義指針常量的方法是,在指針定義語(yǔ)句的指針名前加const,表示指針本身是常量。定義指針常量時(shí)必須初始化,它可以指向常量也可以指向變量,一旦定義以后不能再改變指向。
例如:char*constp="abc";語(yǔ)句告訴編譯器p是常量,不能將p作為左值進(jìn)行操作。但p指向單元內(nèi)的值可以修改。又例如:
inta=88,b=66;
int*constp=&a; //ok,定義指針常量p,在定義時(shí)必須初
始化
*p=77; //ok,指向的內(nèi)容改為77
char*constq="abc"; //ok,定義指針常量q
*q='A'; //ok,q指向的內(nèi)容改為:Abc
*(q+1)='B'; //ok,q指向的內(nèi)容改為:ABc注意:
在定義時(shí)不能寫成int*constptr=777;,因?yàn)閜tr是指針常量而不是指針常數(shù),它只能指向單元,不能指向常數(shù)。
2.指針常量的用途
指針常量對(duì)指針的指向作了限定,使它不能再指向其他對(duì)象。它的作用是限定指針只能在某一區(qū)間內(nèi)操作。如果有intfun(char*constp);,那么在fun函數(shù)中任何想使p改變指向的語(yǔ)句都將是非法的。2.6.4指向常量的指針常量
1.定義與引用
在指針常量前再加上const,就定義了指向常量的指針常量。定義時(shí)必須初始化,它可以指向常量也可以指向變量,一旦指向確定,則既不能改變指向,也不能通過指針改變指針?biāo)竼卧械膬?nèi)容。例如,語(yǔ)句constint*constp=&a;告訴編譯器p和*p都是常量,它們都不能作為左值進(jìn)行操作,但p指向的單元內(nèi)的值有時(shí)可以修改。又例如:
constina=8;
intb;
constint*constp=&a; //ok,定義指向常量的指針常量
p,它可以指向一個(gè)常量
constint*constq=&b; //ok,定義指向常量的指針常量
q,它可以指向一個(gè)變量
//p=q;p=&b;*p=6;//error,指針指
向和指針指向單元內(nèi)的值不能修改
b=6;
//ok,直接改變變量單元中的內(nèi)容
2.指向常量的指針常量的用途
指向常量的指針常量限定了指針的指向不能改變,限定了通過指針對(duì)指向單元的操作行為只能讀,即它保證了只能在限定的單元內(nèi)讀,不能進(jìn)行修改。2.7.1const數(shù)據(jù)成員
在類的數(shù)據(jù)成員中,對(duì)于保持不變的值,可以聲明為const數(shù)據(jù)成員。對(duì)于帶有const數(shù)據(jù)成員的對(duì)象,程序員一定要給構(gòu)造函數(shù)提供初始化該成員的初始值。若有多個(gè)const的數(shù)據(jù)成員,只需將它們列在構(gòu)造函數(shù)的冒號(hào)之后,成員之間用逗號(hào)分隔即可。
【例2-17】const的數(shù)據(jù)成員的初始化。2.7const對(duì)象2.7.2const成員函數(shù)
若想限制某成員函數(shù)功能為只讀,可以將其聲明為const成員函數(shù),即常量成員函數(shù)。聲明方法是,在函數(shù)聲明處的分號(hào)前加入const關(guān)鍵字,然后在函數(shù)實(shí)現(xiàn)的圓括號(hào)后、花括號(hào)前加入const關(guān)鍵字。voidPerson::Display()const
{//high=1.81f; //error,只能讀,不能改變
cout<<high<<endl;
}
上面程序中的Display是const成員函數(shù),在該函數(shù)中,既能讀取對(duì)象的const數(shù)據(jù)成員,也能讀取對(duì)象的非const數(shù)據(jù)成員,但是只能讀,卻不能改變對(duì)象的數(shù)據(jù)成員。若有const對(duì)象,則只有const成員函數(shù)才能對(duì)它進(jìn)行訪問。2.7.3const對(duì)象的聲明與實(shí)現(xiàn)
對(duì)于不需要修改的對(duì)象或不需要修改數(shù)據(jù)成員的成員函數(shù),都可以用const指明。試圖修改const對(duì)象是一個(gè)錯(cuò)誤的想法。例如:constPersonwom("Jonas");定義了類Person的
一個(gè)const對(duì)象wom,并初始化姓名為Jonas。const對(duì)象是不能被賦值的,所以必須初始化。const對(duì)象內(nèi)的數(shù)據(jù)是不能改變的,只有const成員函數(shù)才能對(duì)它的數(shù)據(jù)成員進(jìn)行訪問。運(yùn)行結(jié)果:
ID name score high
320 Kaste 75 1.81
320 Jonas 0 1.76
本例中列出了三個(gè)常見錯(cuò)誤。錯(cuò)誤1:定義了一個(gè)const成員函數(shù),但該函數(shù)又修改了對(duì)象的數(shù)據(jù)成員。錯(cuò)誤2:定義了一個(gè)const成員函數(shù),但該函數(shù)又調(diào)用了非const成員函數(shù)。錯(cuò)誤3:const對(duì)象調(diào)用了非const成員函數(shù),或者說(shuō)非const成員函數(shù)訪問了const對(duì)象。2.7.4使用const成員
在某對(duì)象中,可將不需要修改數(shù)據(jù)成員的成員函數(shù)聲明為const成員函數(shù)。若對(duì)于不需要修改的對(duì)象,即所有成員函數(shù)都不能修改數(shù)據(jù)成員時(shí),可聲明為const對(duì)象。const對(duì)象是不能被賦值的,所以必須初始化。同樣地,const對(duì)象必須由構(gòu)造函數(shù)初始化,由析構(gòu)函數(shù)來(lái)取消。const對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)無(wú)需用關(guān)鍵字const聲明。2.8.1靜態(tài)成員的需要性
在某些情況下,需要讓類的所有對(duì)象共享某個(gè)數(shù)據(jù)。例如鏈表的首指針、鏈表中結(jié)點(diǎn)的總數(shù)等若放在類的定義中,則一旦增加結(jié)點(diǎn),修改起來(lái)十分不便,因?yàn)槊總€(gè)對(duì)象都擁有該成員。如果定義為全局變量,那么其他函數(shù)也能訪問,就不安全了。下面通過一個(gè)銀行儲(chǔ)蓄類進(jìn)行說(shuō)明。2.8靜態(tài)成員從該類中我們可知,對(duì)于每一個(gè)銀行儲(chǔ)蓄帳戶,個(gè)人的姓名和儲(chǔ)額不同,而利率是一致的,是共享的,因此將它定義為靜態(tài)數(shù)據(jù)成員。對(duì)于屬于類的一部分,但既不適用于普通成員表示,又不適用于全局變量表示的數(shù)據(jù),用靜態(tài)數(shù)據(jù)成員表示后,便能在類的范圍中共享,稱之為靜態(tài)數(shù)據(jù)成員。
靜態(tài)數(shù)據(jù)成員的引入體現(xiàn)了兩個(gè)明顯的優(yōu)勢(shì):第一,靜態(tài)數(shù)據(jù)成員的引入很好地解決了共享與封裝之間的矛盾;第二,靜態(tài)數(shù)據(jù)成員只屬于類,而不屬于對(duì)象,當(dāng)存在多個(gè)某類的對(duì)象時(shí),只有唯一的一份靜態(tài)數(shù)據(jù)成員,可節(jié)省內(nèi)存。2.8.2靜態(tài)成員的訪問
靜態(tài)成員分為公有、私有或保護(hù)的,用static聲明。靜態(tài)數(shù)據(jù)成員是類的一部分,其定義也是類定義的一部分。要將其放在類的內(nèi)部定義,還必須在類的實(shí)現(xiàn)中初始化。初始化時(shí)用類名引導(dǎo),重用時(shí)簡(jiǎn)單地包含頭文件便可。
對(duì)于類的公有靜態(tài)成員,既可用類的對(duì)象或指針訪問,如:對(duì)象.公有靜態(tài)成員或?qū)ο笾羔?>公有靜態(tài)成員,也可用類名加域區(qū)分符訪問,如:類名::公有靜態(tài)成員。對(duì)于類的私有或保護(hù)靜態(tài)成員,可用靜態(tài)成員函數(shù)訪問,如:類名::靜態(tài)成員函數(shù)。2.8.3靜態(tài)數(shù)據(jù)成員
公有的靜態(tài)數(shù)據(jù)成員可被類的外部訪問,保護(hù)或私有靜態(tài)數(shù)據(jù)成員只可在類的內(nèi)部被訪問。通常,靜態(tài)數(shù)據(jù)在類的定義之外初始化。同時(shí)也要注意,由于靜態(tài)成員與對(duì)象的無(wú)關(guān)性,因此靜態(tài)成員無(wú)this指針。靜態(tài)數(shù)據(jù)成員可以作為類成員函數(shù)的默認(rèn)參數(shù)。要注意,其他數(shù)據(jù)成員不可以。
1.訪問公有的靜態(tài)數(shù)據(jù)成員的方法
對(duì)象名.數(shù)據(jù)成員名
或
類型名::數(shù)據(jù)成員名
【例2-19】演示靜態(tài)數(shù)據(jù)成員的初始化與兩種訪問方法。運(yùn)行結(jié)果:
1
2 2
在本例中,s.total等價(jià)于t.total,因?yàn)閠otal是各對(duì)象公有的。常用的方法是Student::total。其意義是,靜態(tài)數(shù)據(jù)成員是屬于Student類的,而不是屬于哪個(gè)特定對(duì)象。即靜態(tài)數(shù)據(jù)成員屬于類的一部分,不屬于對(duì)象的一部分。
2.訪問保護(hù)或私有靜態(tài)數(shù)據(jù)成員的方法
類的成員函數(shù)可以訪問保護(hù)或私有靜態(tài)數(shù)據(jù)成員,但是一般來(lái)說(shuō),訪問保護(hù)或私有靜態(tài)數(shù)據(jù)成員要用成員函數(shù)。
【例2-20】演示訪問保護(hù)靜態(tài)數(shù)據(jù)成員的方法。
3.靜態(tài)數(shù)據(jù)成員的應(yīng)用
靜態(tài)數(shù)據(jù)成員主要應(yīng)用于以下幾方面:用來(lái)保存流動(dòng)變化的對(duì)象個(gè)數(shù)(如上例中的total);作為一種標(biāo)志,指示一個(gè)特定的動(dòng)作是否發(fā)生;作為一個(gè)鏈表的首指針或尾指針;使用靜態(tài)數(shù)據(jù)成員,實(shí)際上可以不再需要全局變量。2.8.4靜態(tài)成員函數(shù)
1.概念
靜態(tài)成員屬于類,不屬于對(duì)象,也就是說(shuō)它不與對(duì)象相聯(lián)系。在沒有創(chuàng)建對(duì)象的情況下,仍可以直接以類來(lái)調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)不能訪問類的非靜態(tài)成員。如果類中的某個(gè)成員函數(shù)不需要訪問類的非靜態(tài)成員,那么可將該函數(shù)聲明為靜態(tài)成員函數(shù)。
2.使用中的注意點(diǎn)
(1)靜態(tài)成員函數(shù)的定義屬于類定義的一部分,因此它的定義位置與一般的成員函數(shù)一樣。
(2)靜態(tài)成員函數(shù)不能訪問對(duì)象成員。靜態(tài)成員函數(shù)與類相聯(lián)系,不與任何對(duì)象相聯(lián)系,故不能在靜態(tài)成員函數(shù)中對(duì)非靜態(tài)成員進(jìn)行訪問。既不能訪問非靜態(tài)成員函數(shù),也不能訪問非靜態(tài)數(shù)據(jù)成員。
(3)靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是:靜態(tài)成員函數(shù)沒有一個(gè)指向當(dāng)前對(duì)象的this指針。
(4)不能將靜態(tài)成員函數(shù)聲明為const函數(shù)。
【例2-21】對(duì)上面注意點(diǎn)的說(shuō)明。
【例2-22】演示靜態(tài)成員的使用。下面將班級(jí)學(xué)生總數(shù)設(shè)置為靜態(tài)成員total,通過創(chuàng)建對(duì)象自動(dòng)增加,通過析構(gòu)對(duì)象自動(dòng)減小。
//student.h
#ifndefSTUDENT_H
#defineSTUDENT_H
classStudent
{public://student.cpp //類的實(shí)現(xiàn)稱之為類的定義
#include<iostream.h>
#include<string.h>
#include"student.h"
intStudent::total=0; //靜態(tài)數(shù)據(jù)成員要求初始化Student::Student(char*pName)
{cout<<"createonestudent\n";
strcpy(name,pName);
total++; //自增,成員函數(shù)訪問靜態(tài)成員
cout<<total<<endl;
}
Student::~Student()
{cout<<"destructonestudent\n";
total--; //每析構(gòu)一個(gè)對(duì)象,學(xué)生表減1
cout<<total<<endl;
}intStudent::number() //靜態(tài)成員函數(shù)的實(shí)現(xiàn)
{returntotal;}
//stu.cpp
#include<iostream.h>
#include"student.h"
voidfun()
{Students1;Students2;
cout<<Student::number(); //調(diào)用靜態(tài)成員函數(shù)用類名引導(dǎo)
cout<<endl;
}
voidmain()
{fun();cout<<Student::number()<<endl;}在構(gòu)造函數(shù)中進(jìn)行靜態(tài)成員的自增,這樣每創(chuàng)建一個(gè)對(duì)象,學(xué)生數(shù)自動(dòng)加1。在析構(gòu)函數(shù)中進(jìn)行靜態(tài)成員的自減,這樣每取消一個(gè)對(duì)象,學(xué)生數(shù)自動(dòng)減1。●?與類同名的成員函數(shù)稱為構(gòu)造函數(shù)。它沒有返回類型,它在創(chuàng)建對(duì)象時(shí)自動(dòng)被調(diào)用,它的功能就是初始化類的對(duì)象。
●?讓構(gòu)造函數(shù)完成初始化以外的工作不是好方法。
●?構(gòu)造函數(shù)可以帶參數(shù),也可以帶默認(rèn)參數(shù)。讓構(gòu)造函
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江海洋大學(xué)《電機(jī)學(xué)2》2023-2024學(xué)年第一學(xué)期期末試卷
- 高性能纖維防護(hù)制品研發(fā)生產(chǎn)項(xiàng)目可行性研究報(bào)告寫作模板-備案審批
- 中國(guó)計(jì)量大學(xué)現(xiàn)代科技學(xué)院《控制電機(jī)》2023-2024學(xué)年第一學(xué)期期末試卷
- 中央財(cái)經(jīng)大學(xué)《航空自動(dòng)化控制》2023-2024學(xué)年第一學(xué)期期末試卷
- 小學(xué)師生讀書評(píng)價(jià)制度
- 昭通職業(yè)學(xué)院《臨床藥理學(xué)(醫(yī)學(xué)檢驗(yàn))》2023-2024學(xué)年第一學(xué)期期末試卷
- 云南現(xiàn)代職業(yè)技術(shù)學(xué)院《大數(shù)據(jù)思維與決策》2023-2024學(xué)年第一學(xué)期期末試卷
- 企業(yè)市值管理中資本結(jié)構(gòu)優(yōu)化的研究
- 合規(guī)性旅游業(yè)務(wù)培訓(xùn)模板
- DB2201T 65.1-2024 肉牛飼養(yǎng)技術(shù)規(guī)范 第1部分:種牛
- 建設(shè)工程質(zhì)量檢測(cè)檢測(cè)計(jì)劃
- 2025年抗肺纖維化藥物市場(chǎng)分析報(bào)告
- 銀行會(huì)計(jì)主管年度工作總結(jié)2024(30篇)
- 教師招聘(教育理論基礎(chǔ))考試題庫(kù)(含答案)
- 上海市12校2025屆高三第一次模擬考試英語(yǔ)試卷含解析
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案集錦
- 長(zhǎng)亭送別完整版本
- 《鐵路軌道維護(hù)》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書簡(jiǎn)版wps
- 職業(yè)學(xué)校視頻監(jiān)控存儲(chǔ)系統(tǒng)解決方案
- 《銷售心理學(xué)培訓(xùn)》課件
評(píng)論
0/150
提交評(píng)論