《C++程序設(shè)計(jì)教程》課件第2章_第1頁(yè)
《C++程序設(shè)計(jì)教程》課件第2章_第2頁(yè)
《C++程序設(shè)計(jì)教程》課件第2章_第3頁(yè)
《C++程序設(shè)計(jì)教程》課件第2章_第4頁(yè)
《C++程序設(shè)計(jì)教程》課件第2章_第5頁(yè)
已閱讀5頁(yè),還剩181頁(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)介

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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論