版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第2章類和對象(一)類對象構(gòu)造函數(shù)析構(gòu)函數(shù)一個對象的生存期對象淺復(fù)制與深復(fù)制靜態(tài)成員類成員指針應(yīng)用實例練習(xí)題2上機(jī)實驗題2第2章類和對象(一)類對象構(gòu)造函數(shù)析構(gòu)函數(shù)一個對象的生存類類的聲明類的組織形式類的作用域類的成員函數(shù)類的訪問權(quán)限類與結(jié)構(gòu)體類型的區(qū)別類的特點類類的聲明類的組織形式類的作用域類的成員函數(shù)類的訪問權(quán)限類與類的聲明類是一種用戶自定義的數(shù)據(jù)類型,聲明類的一般格式如下:class類名{private:
私有數(shù)據(jù)成員和成員函數(shù);protected:
保護(hù)數(shù)據(jù)成員和成員函數(shù);public:
公有數(shù)據(jù)成員和成員函數(shù);};各個成員函數(shù)的實現(xiàn);類界面類實現(xiàn)在聲明類時有如下規(guī)則:如果類的成員是變量,可以像聲明變量一樣聲明它。如果類的成員是函數(shù),一般是使用函數(shù)原型來聲明它。如果類的成員是函數(shù),它可以訪問類中的任何成員——數(shù)據(jù)成員和成員函數(shù)。也就是說,當(dāng)聲明類的成員函數(shù)時,定義的函數(shù)可以直接訪問該類中任何成員而無需將其聲明為參數(shù),惟一的限制條件是在使用一個成員之前必須聲明它。類的聲明類是一種用戶自定義的數(shù)據(jù)類型,聲明類的一般格式如下類的組織形式通常將類界面與類實現(xiàn)分離,將類界面部分存放在頭文件(.h)中,將類實現(xiàn)放在程序文件(.cpp)中,而使用類的程序放在另一個程序文件中,這樣使整個程序更清晰。例如,聲明類C的類界面的部分用c.h文件保存,類實現(xiàn)部分用c.cpp文件保存,而使用類C的部分用a.cpp保存,如圖所示。類的組織形式通常將類界面與類實現(xiàn)分離,將類類的作用域聲明類時所使用的一對大括號({})形成了類作用域。在類作用域中聲明的標(biāo)識符只在該類中具有可見性,并且其作用域與該標(biāo)識符聲明的次序無關(guān)。類作用域包括了類中成員函數(shù)的作用域,即使該成員函數(shù)的實現(xiàn)放在類的外面也是如此。所以當(dāng)成員函數(shù)的函數(shù)體中使用一個標(biāo)識符時,編譯系統(tǒng)首先在成員函數(shù)中尋找其聲明,如果未找到則在該成員函數(shù)所在的類中尋找,如果還未找到,則在包含類作用域的更大作用域中作最后尋找。類的作用域聲明類時所使用的一對大括號({})形成了類的成員函數(shù)類的成員函數(shù)用于實現(xiàn)某種操作,成員函數(shù)的定義體可以在類的聲明體中,也可以在類的說明體外。在類聲明體中實現(xiàn)的函數(shù)是內(nèi)聯(lián)函數(shù)。在類聲明體外實現(xiàn)的函數(shù)可以通過在函數(shù)聲明和定義上分別加上inline來表示該函數(shù)是內(nèi)聯(lián)的,否則不是內(nèi)聯(lián)函數(shù)。在類的聲明體內(nèi)定義成員函數(shù)的優(yōu)點是使整個類集中于程序代碼的同一位置上,不利的方面是增加了類聲明的規(guī)模和復(fù)雜性,而且,內(nèi)聯(lián)的函數(shù)代碼并不被相同類的對象所共享,因而增大了程序的內(nèi)存開銷。類的成員函數(shù)類的成員函數(shù)用于實現(xiàn)某種操作,成員函數(shù)類的訪問權(quán)限在類聲明中,public、private和protected是關(guān)鍵字,稱為成員訪問限定符,它們分別表示公有、私有和保護(hù)的成員訪問權(quán)限。在C++中,有關(guān)類的訪問權(quán)限的其他規(guī)定如下:在默認(rèn)的情況下,一個類中所有的成員都是私有的。一旦給出了成員訪問限定符(如public:),它后面的成員都具有這個成員訪問權(quán)限(如后面的成員均為公有的),直到出現(xiàn)另一個成員訪問限定符或類聲明結(jié)束為止。類的訪問權(quán)限在類聲明中,public、privat類與結(jié)構(gòu)體類型的區(qū)別
從類的聲明格式可以看出,類與結(jié)構(gòu)體類型是非常相似的。C++中類是由結(jié)構(gòu)體類型演化而來的,但對結(jié)構(gòu)體類型進(jìn)行了擴(kuò)展。類的成員可以是數(shù)據(jù)成員或成員函數(shù),結(jié)構(gòu)體中的成員也可以是數(shù)據(jù)成員或函數(shù)成員。并且在結(jié)構(gòu)體中,也可以使用關(guān)鍵詞public、private、protected限定其成員的訪問權(quán)限。
實際上,結(jié)構(gòu)體只是類的一個特例。結(jié)構(gòu)體與類惟一區(qū)別在于:在類中,其成員的默認(rèn)訪問權(quán)限是私有的,而在結(jié)構(gòu)體類型中,其成員的默認(rèn)訪問權(quán)限是公有的。
當(dāng)只需要描述數(shù)據(jù)結(jié)構(gòu)時,使用結(jié)構(gòu)體較好。當(dāng)需要描述數(shù)據(jù)又需要描述對數(shù)據(jù)的處理方法時使用類為好。類與結(jié)構(gòu)體類型的區(qū)別從類的聲明格式可以看出,類與結(jié)構(gòu)類的特點類具有如下特點。(1)類具有封裝性(2)類具有安全性(3)類具有獨立性與可維護(hù)性(4)類具有繼承性(5)類具有多態(tài)性類的特點類具有如下特點。(1)類具有封裝性對象對象的定義格式對象的數(shù)據(jù)成員訪問方法對象的成員函數(shù)調(diào)用方法對象的存儲空間對象的賦值運算對象對象的定義格式對象的數(shù)據(jù)成員訪問方法對象的成員函數(shù)調(diào)用方對象的定義格式一旦聲明了一個類,就可以用它作為數(shù)據(jù)類型來定義類對象(簡稱為對象)。在C++中,類對象也稱為類變量或者類實例。定義類對象的格式如下:類名對象名表;其中,“類名”是待定的對象所屬的類的名字,即所定義的對象是該類的對象?!皩ο竺怼敝锌梢杂幸粋€或多個對象名,多個對象名之間用逗號分隔。在“對象名表”中,可以是一般的對象名,還可以是指向?qū)ο蟮闹羔樧兞棵磳ο笾羔槪?、引用名(即對象引用)、對象?shù)組名。對象的定義格式一旦聲明了一個類,就可以用它作為數(shù)對象的數(shù)據(jù)成員訪問方法對象的數(shù)據(jù)成員的訪問方式如下:對象名.數(shù)據(jù)成員名其中,“.”是一個運算符,該運算符的功能是表示對象的成員。對象的數(shù)據(jù)成員訪問方法對象的數(shù)據(jù)成員的訪問方式如下:對象名對象的成員函數(shù)調(diào)用方法成員函數(shù)的調(diào)用是為了響應(yīng)發(fā)送對象的消息。消息對應(yīng)于從一個對象向另一個對象或者從一個函數(shù)向一個對象發(fā)送的成員函數(shù)調(diào)用。調(diào)用對象的成員函數(shù)的方式如下:對象名.成員名(參數(shù)表)對象的成員函數(shù)調(diào)用方法成員函數(shù)的調(diào)用是為了響應(yīng)發(fā)送對象的存儲空間實際上,C++只為每一個對象的數(shù)據(jù)成員分配內(nèi)存空間,類中的所有成員函數(shù)只生成一個副本,而該類的每個對象執(zhí)行相同的函數(shù)成員副本。因此在描繪類圖時,通常將顯示類中所有的成員。然而在描繪類的對象圖時,將只顯示其數(shù)據(jù)成員。實際上,類對象也像變量一樣,可以定義全局對象或靜態(tài)對象等,它們的存儲空間類型和作用域與全局變量或靜態(tài)變量是一樣的。對象的存儲空間實際上,C++只為每一個對象的數(shù)據(jù)成對象的賦值運算在定義了一個類的多個對象時,可以在對象之間進(jìn)行賦值運算,也稱為對象復(fù)制,假設(shè)定義了例2.1中類MyClass的兩個對象sa1和sa2,它們的值如圖所示。對象的賦值運算在定義了一個類的多個對象時,可以在對構(gòu)造函數(shù)什么是構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)重載構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)構(gòu)造函數(shù)什么是構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)重載構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)什么是構(gòu)造函數(shù)C++提供了利用類的構(gòu)造函數(shù)來初始化類的數(shù)據(jù)成員。構(gòu)造函數(shù)具有如下性質(zhì):構(gòu)造函數(shù)的名字與類的名字相同。構(gòu)造函數(shù)盡管是一個函數(shù),但沒有任何類型,即它既不屬于返回值函數(shù)也不屬于void函數(shù)。類可以有多個構(gòu)造函數(shù)。然而,一個類的所有構(gòu)造函數(shù)的名字都相同。如果類有多個構(gòu)造函數(shù),則它們的參數(shù)是各不相同的。當(dāng)類對象創(chuàng)建時,構(gòu)造函數(shù)會自動地執(zhí)行;由于它們沒有類型,不能像其他函數(shù)那樣進(jìn)行調(diào)用。當(dāng)類對象說明時調(diào)用哪一個構(gòu)造函數(shù)取決于傳遞給它的參數(shù)類型。什么是構(gòu)造函數(shù)C++提供了利用類的構(gòu)造函數(shù)來初始化類的數(shù)據(jù)調(diào)用構(gòu)造函數(shù)當(dāng)定義類對象時,構(gòu)造函數(shù)會自動執(zhí)行。因為一個類可能會有包括默認(rèn)構(gòu)造函數(shù)在內(nèi)的不止一種構(gòu)造函數(shù),下面討論如何調(diào)用特定的構(gòu)造函數(shù)。1.調(diào)用默認(rèn)構(gòu)造函數(shù)假設(shè)一個類包含有默認(rèn)構(gòu)造函數(shù),調(diào)用默認(rèn)構(gòu)造函數(shù)的語法如下:類名類對象名;2.調(diào)用帶參數(shù)的構(gòu)造函數(shù)假設(shè)一個類中包含有帶參數(shù)的構(gòu)造函數(shù),調(diào)用這種帶參數(shù)的構(gòu)造函數(shù)的語法如下:類名類對象名(參數(shù)表)其中,“參數(shù)表”中的參數(shù)可以是變量,也可以是表達(dá)式。3.調(diào)用內(nèi)置數(shù)據(jù)類型的構(gòu)造函數(shù)實際上,C++中內(nèi)置的數(shù)據(jù)類型都可以看成是類,定義變量時除了可以使用“=”運算符賦初值外,還可以像定義類對象一樣調(diào)用其構(gòu)造函數(shù)給變量賦初值。調(diào)用構(gòu)造函數(shù)當(dāng)定義類對象時,構(gòu)造函數(shù)會自動執(zhí)行。因4.用new動態(tài)創(chuàng)建對象
可以用new運算符來動態(tài)地建立對象。用new運算符建立對象時,同樣也要自動調(diào)用構(gòu)造函數(shù),以便完成對象數(shù)據(jù)成員的初始化。5.用構(gòu)造函數(shù)初始化對象的過程
構(gòu)造函數(shù)初始化對象的過程,實際上就是對構(gòu)造函數(shù)的調(diào)用過程。一般情況下按如下步驟進(jìn)行:(1)程序執(zhí)行到定義對象語句時,系統(tǒng)為對象分配內(nèi)存空間。(2)系統(tǒng)自動調(diào)用構(gòu)造函數(shù),將實參傳送給形參,執(zhí)行構(gòu)造函數(shù)體時,將形參值賦給對象的數(shù)據(jù)成員。完成數(shù)據(jù)成員的初始化工作。4.用new動態(tài)創(chuàng)建對象可以用new運算符來動態(tài)地建立重載構(gòu)造函數(shù)構(gòu)造函數(shù)可以像普通函數(shù)一樣被重載,C++根據(jù)聲明中的參數(shù)個數(shù)和類型選擇合適的構(gòu)造函數(shù)。重載構(gòu)造函數(shù)構(gòu)造函數(shù)可以像普通函數(shù)一樣被重載,C+復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)常用于將一個已知對象的數(shù)據(jù)成員復(fù)制給正在創(chuàng)建的另一個同類的對象。除此之外,復(fù)制構(gòu)造函數(shù)可以像其他構(gòu)造函數(shù)一樣定義和使用。復(fù)制構(gòu)造函數(shù)的格式如下:類名::復(fù)制構(gòu)造函數(shù)(類名&引用名)或:類名::復(fù)制構(gòu)造函數(shù)(const類名&引用名)在以下3種情況下,復(fù)制構(gòu)造函數(shù)都會自動被調(diào)用:當(dāng)說明一個類的對象時,使用另外一個對象來初始化(此時復(fù)制構(gòu)造函數(shù)就如同其他構(gòu)造函數(shù)一樣使用)。當(dāng)一個函數(shù)返回值為類類型時。當(dāng)一個類類型的實參傳遞給函數(shù)中的傳值調(diào)用參數(shù)時,在這種情況下,復(fù)制構(gòu)造函數(shù)決定了參數(shù)按照什么方式傳遞。復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)常用于將一個已知對象的數(shù)據(jù)析構(gòu)函數(shù)什么是析構(gòu)函數(shù)析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)什么是析構(gòu)函數(shù)析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)的調(diào)用什么是析構(gòu)函數(shù)同構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的特殊成員函數(shù),不用調(diào)用便自動執(zhí)行,而且析構(gòu)函數(shù)的名字也與類的名字有關(guān)。C++程序設(shè)計的一個原則是:由系統(tǒng)自動分配的內(nèi)存空間由系統(tǒng)自動釋放。什么是析構(gòu)函數(shù)同構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的特殊析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)具有如下性質(zhì):析構(gòu)函數(shù)在類對象銷毀時自動執(zhí)行。一個類只能有一個析構(gòu)函數(shù),而且析構(gòu)函數(shù)沒有參數(shù)。析構(gòu)函數(shù)的名字是“~”加上類的名字(中間沒有空格)。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也沒有任何類型,即不屬于返回值函數(shù)也不屬于void函數(shù)。它們不能像其他函數(shù)那樣被調(diào)用。析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)具有如下性質(zhì):析構(gòu)函數(shù)在類對象銷析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)被系統(tǒng)自動調(diào)用時分為以下兩種情況。1.用類直接建立對象
在程序執(zhí)行過程中,當(dāng)遇到對象的生存期結(jié)束時,系統(tǒng)自動調(diào)用析構(gòu)函數(shù),然后回收為對象所分配的存儲空間。2.用new動態(tài)創(chuàng)建對象
對于用new運算符動態(tài)創(chuàng)建的對象,在產(chǎn)生對象時調(diào)用構(gòu)造函數(shù),只有用delete釋放對象時,才調(diào)用析構(gòu)函數(shù)。若不使用delete運算符來撤銷動態(tài)生成的對象,程序結(jié)束時對象仍存在,并占用相應(yīng)的存儲空間,即系統(tǒng)不能自動撤銷動態(tài)創(chuàng)建的對象。析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)被系統(tǒng)自動調(diào)用時分為以下兩種情況。1一個對象的生存期如同一個變量一樣,對象從被創(chuàng)建到被釋放為止的時間稱為對象的生存期。一個對象的生存期如圖所示。一個對象的生存期如同一個變量一樣,對象從被創(chuàng)建到被釋對象淺復(fù)制與深復(fù)制對象淺復(fù)制對象深復(fù)制對象淺復(fù)制與深復(fù)制對象淺復(fù)制對象深復(fù)制對象淺復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,它們還共享某些資源(內(nèi)存空間),其中一個對象的銷毀會影響另一個對象,這種對象之間的復(fù)制稱為對象淺復(fù)制。對象淺復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,對象深復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,它們不會共享任何資源(內(nèi)存空間),其中一個對象的銷毀不會影響另一個對象,這種對象之間的復(fù)制稱為對象深復(fù)制。對象深復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類中所有對象共享的成員,而不是某個對象的成員,也就是說靜態(tài)數(shù)據(jù)成員的存儲空間不是放在每個對象中,而是和成員函數(shù)一樣放在類公共區(qū)中。所以有時將靜態(tài)數(shù)據(jù)成員稱為類變量。因為靜態(tài)數(shù)據(jù)成員不從屬于任何一個具體對象,所以必須對它初始化,而且對它的初始化不能在構(gòu)造函數(shù)中進(jìn)行。靜態(tài)數(shù)據(jù)成員的使用方法如下:(1)靜態(tài)數(shù)據(jù)成員的定義與一般數(shù)據(jù)成員相似,但前面要加上static關(guān)鍵詞。當(dāng)數(shù)據(jù)成員的一個副本就已經(jīng)足夠時,可使用static數(shù)據(jù)成員來節(jié)省存儲空間。(2)靜態(tài)數(shù)據(jù)成員的初始化與一般數(shù)據(jù)成員不同,靜態(tài)數(shù)據(jù)成員初始化的格式如下:類型類名::靜態(tài)數(shù)據(jù)成員=值;(3)在引用靜態(tài)數(shù)據(jù)成員時采用格式類名::靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類中所有對象共享的成員,靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員類似,也是從屬于類,都是類的靜態(tài)成員。只要類存在,靜態(tài)成員函數(shù)就可以使用,靜態(tài)成員函數(shù)的定義是在一般函數(shù)定義前加上static關(guān)鍵字。調(diào)用靜態(tài)成員函數(shù)的格式如下:類名::靜態(tài)成員函數(shù)名(參數(shù)表);靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員類似,也是從類成員指針類數(shù)據(jù)成員指針類成員函數(shù)指針類成員指針類數(shù)據(jù)成員指針類成員函數(shù)指針類數(shù)據(jù)成員指針類數(shù)據(jù)成員指針的定義格式如下:類型類名::*指針名由于類不是在運行時存在的對象,因此在使用類數(shù)據(jù)成員指針時,需要首先指定類的一個數(shù)據(jù)成員,然后通過類的對象來引用指針?biāo)赶虻某蓡T。類數(shù)據(jù)成員指針類數(shù)據(jù)成員指針的定義格式如下:類型類名::類成員函數(shù)指針指向類成員函數(shù)指針的定義格式如下:類型(類名::*指針名)(參數(shù)表)給類成員函數(shù)指針賦值的格式如下:指向函數(shù)的指針名=函數(shù)名程序中使用指向函數(shù)的指針調(diào)用函數(shù)的格式如下:(*指向函數(shù)的指針名)(實參表)類成員函數(shù)指針指向類成員函數(shù)指針的定義格式如下:應(yīng)用實例編寫一個程序,設(shè)計一個滿足如下要求的CDate類,用數(shù)據(jù)進(jìn)行調(diào)試并輸出結(jié)果:(1)用日/月/年格式輸出日期。(2)可進(jìn)行日期加一天的操作。(3)設(shè)置日期。應(yīng)用實例編寫一個程序,設(shè)計一個滿足如下要求的CDate類,用練習(xí)題2給出以下程序的執(zhí)行結(jié)果。#include<iostream.h>classSample{intx,y;public:Sample(){x=y=0;}Sample(inta,intb) {x=a;y=b;}~Sample(){if(x==y)cout<<"x=y"<<endl;elsecout<<"x!=y"<<endl;}voiddisp(){cout<<"x="<<x<<",y="<<y<<endl;}};voidmain(){Samples1(2,3);s1.disp();}練習(xí)題2給出以下程序的執(zhí)行結(jié)果。#include<iost上機(jī)實驗題2設(shè)計一個詞典類Dic,其中包含若干單詞信息,每個單詞由英文單詞及對應(yīng)的中文含義組成。并含有單詞增加和英漢翻譯成員函數(shù),通過查詞典的方式將一段英語翻譯成對應(yīng)的漢語。上機(jī)實驗題2設(shè)計一個詞典類Dic,其中包含若第2章類和對象(一)類對象構(gòu)造函數(shù)析構(gòu)函數(shù)一個對象的生存期對象淺復(fù)制與深復(fù)制靜態(tài)成員類成員指針應(yīng)用實例練習(xí)題2上機(jī)實驗題2第2章類和對象(一)類對象構(gòu)造函數(shù)析構(gòu)函數(shù)一個對象的生存類類的聲明類的組織形式類的作用域類的成員函數(shù)類的訪問權(quán)限類與結(jié)構(gòu)體類型的區(qū)別類的特點類類的聲明類的組織形式類的作用域類的成員函數(shù)類的訪問權(quán)限類與類的聲明類是一種用戶自定義的數(shù)據(jù)類型,聲明類的一般格式如下:class類名{private:
私有數(shù)據(jù)成員和成員函數(shù);protected:
保護(hù)數(shù)據(jù)成員和成員函數(shù);public:
公有數(shù)據(jù)成員和成員函數(shù);};各個成員函數(shù)的實現(xiàn);類界面類實現(xiàn)在聲明類時有如下規(guī)則:如果類的成員是變量,可以像聲明變量一樣聲明它。如果類的成員是函數(shù),一般是使用函數(shù)原型來聲明它。如果類的成員是函數(shù),它可以訪問類中的任何成員——數(shù)據(jù)成員和成員函數(shù)。也就是說,當(dāng)聲明類的成員函數(shù)時,定義的函數(shù)可以直接訪問該類中任何成員而無需將其聲明為參數(shù),惟一的限制條件是在使用一個成員之前必須聲明它。類的聲明類是一種用戶自定義的數(shù)據(jù)類型,聲明類的一般格式如下類的組織形式通常將類界面與類實現(xiàn)分離,將類界面部分存放在頭文件(.h)中,將類實現(xiàn)放在程序文件(.cpp)中,而使用類的程序放在另一個程序文件中,這樣使整個程序更清晰。例如,聲明類C的類界面的部分用c.h文件保存,類實現(xiàn)部分用c.cpp文件保存,而使用類C的部分用a.cpp保存,如圖所示。類的組織形式通常將類界面與類實現(xiàn)分離,將類類的作用域聲明類時所使用的一對大括號({})形成了類作用域。在類作用域中聲明的標(biāo)識符只在該類中具有可見性,并且其作用域與該標(biāo)識符聲明的次序無關(guān)。類作用域包括了類中成員函數(shù)的作用域,即使該成員函數(shù)的實現(xiàn)放在類的外面也是如此。所以當(dāng)成員函數(shù)的函數(shù)體中使用一個標(biāo)識符時,編譯系統(tǒng)首先在成員函數(shù)中尋找其聲明,如果未找到則在該成員函數(shù)所在的類中尋找,如果還未找到,則在包含類作用域的更大作用域中作最后尋找。類的作用域聲明類時所使用的一對大括號({})形成了類的成員函數(shù)類的成員函數(shù)用于實現(xiàn)某種操作,成員函數(shù)的定義體可以在類的聲明體中,也可以在類的說明體外。在類聲明體中實現(xiàn)的函數(shù)是內(nèi)聯(lián)函數(shù)。在類聲明體外實現(xiàn)的函數(shù)可以通過在函數(shù)聲明和定義上分別加上inline來表示該函數(shù)是內(nèi)聯(lián)的,否則不是內(nèi)聯(lián)函數(shù)。在類的聲明體內(nèi)定義成員函數(shù)的優(yōu)點是使整個類集中于程序代碼的同一位置上,不利的方面是增加了類聲明的規(guī)模和復(fù)雜性,而且,內(nèi)聯(lián)的函數(shù)代碼并不被相同類的對象所共享,因而增大了程序的內(nèi)存開銷。類的成員函數(shù)類的成員函數(shù)用于實現(xiàn)某種操作,成員函數(shù)類的訪問權(quán)限在類聲明中,public、private和protected是關(guān)鍵字,稱為成員訪問限定符,它們分別表示公有、私有和保護(hù)的成員訪問權(quán)限。在C++中,有關(guān)類的訪問權(quán)限的其他規(guī)定如下:在默認(rèn)的情況下,一個類中所有的成員都是私有的。一旦給出了成員訪問限定符(如public:),它后面的成員都具有這個成員訪問權(quán)限(如后面的成員均為公有的),直到出現(xiàn)另一個成員訪問限定符或類聲明結(jié)束為止。類的訪問權(quán)限在類聲明中,public、privat類與結(jié)構(gòu)體類型的區(qū)別
從類的聲明格式可以看出,類與結(jié)構(gòu)體類型是非常相似的。C++中類是由結(jié)構(gòu)體類型演化而來的,但對結(jié)構(gòu)體類型進(jìn)行了擴(kuò)展。類的成員可以是數(shù)據(jù)成員或成員函數(shù),結(jié)構(gòu)體中的成員也可以是數(shù)據(jù)成員或函數(shù)成員。并且在結(jié)構(gòu)體中,也可以使用關(guān)鍵詞public、private、protected限定其成員的訪問權(quán)限。
實際上,結(jié)構(gòu)體只是類的一個特例。結(jié)構(gòu)體與類惟一區(qū)別在于:在類中,其成員的默認(rèn)訪問權(quán)限是私有的,而在結(jié)構(gòu)體類型中,其成員的默認(rèn)訪問權(quán)限是公有的。
當(dāng)只需要描述數(shù)據(jù)結(jié)構(gòu)時,使用結(jié)構(gòu)體較好。當(dāng)需要描述數(shù)據(jù)又需要描述對數(shù)據(jù)的處理方法時使用類為好。類與結(jié)構(gòu)體類型的區(qū)別從類的聲明格式可以看出,類與結(jié)構(gòu)類的特點類具有如下特點。(1)類具有封裝性(2)類具有安全性(3)類具有獨立性與可維護(hù)性(4)類具有繼承性(5)類具有多態(tài)性類的特點類具有如下特點。(1)類具有封裝性對象對象的定義格式對象的數(shù)據(jù)成員訪問方法對象的成員函數(shù)調(diào)用方法對象的存儲空間對象的賦值運算對象對象的定義格式對象的數(shù)據(jù)成員訪問方法對象的成員函數(shù)調(diào)用方對象的定義格式一旦聲明了一個類,就可以用它作為數(shù)據(jù)類型來定義類對象(簡稱為對象)。在C++中,類對象也稱為類變量或者類實例。定義類對象的格式如下:類名對象名表;其中,“類名”是待定的對象所屬的類的名字,即所定義的對象是該類的對象?!皩ο竺怼敝锌梢杂幸粋€或多個對象名,多個對象名之間用逗號分隔。在“對象名表”中,可以是一般的對象名,還可以是指向?qū)ο蟮闹羔樧兞棵磳ο笾羔槪?、引用名(即對象引用)、對象?shù)組名。對象的定義格式一旦聲明了一個類,就可以用它作為數(shù)對象的數(shù)據(jù)成員訪問方法對象的數(shù)據(jù)成員的訪問方式如下:對象名.數(shù)據(jù)成員名其中,“.”是一個運算符,該運算符的功能是表示對象的成員。對象的數(shù)據(jù)成員訪問方法對象的數(shù)據(jù)成員的訪問方式如下:對象名對象的成員函數(shù)調(diào)用方法成員函數(shù)的調(diào)用是為了響應(yīng)發(fā)送對象的消息。消息對應(yīng)于從一個對象向另一個對象或者從一個函數(shù)向一個對象發(fā)送的成員函數(shù)調(diào)用。調(diào)用對象的成員函數(shù)的方式如下:對象名.成員名(參數(shù)表)對象的成員函數(shù)調(diào)用方法成員函數(shù)的調(diào)用是為了響應(yīng)發(fā)送對象的存儲空間實際上,C++只為每一個對象的數(shù)據(jù)成員分配內(nèi)存空間,類中的所有成員函數(shù)只生成一個副本,而該類的每個對象執(zhí)行相同的函數(shù)成員副本。因此在描繪類圖時,通常將顯示類中所有的成員。然而在描繪類的對象圖時,將只顯示其數(shù)據(jù)成員。實際上,類對象也像變量一樣,可以定義全局對象或靜態(tài)對象等,它們的存儲空間類型和作用域與全局變量或靜態(tài)變量是一樣的。對象的存儲空間實際上,C++只為每一個對象的數(shù)據(jù)成對象的賦值運算在定義了一個類的多個對象時,可以在對象之間進(jìn)行賦值運算,也稱為對象復(fù)制,假設(shè)定義了例2.1中類MyClass的兩個對象sa1和sa2,它們的值如圖所示。對象的賦值運算在定義了一個類的多個對象時,可以在對構(gòu)造函數(shù)什么是構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)重載構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)構(gòu)造函數(shù)什么是構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)重載構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)什么是構(gòu)造函數(shù)C++提供了利用類的構(gòu)造函數(shù)來初始化類的數(shù)據(jù)成員。構(gòu)造函數(shù)具有如下性質(zhì):構(gòu)造函數(shù)的名字與類的名字相同。構(gòu)造函數(shù)盡管是一個函數(shù),但沒有任何類型,即它既不屬于返回值函數(shù)也不屬于void函數(shù)。類可以有多個構(gòu)造函數(shù)。然而,一個類的所有構(gòu)造函數(shù)的名字都相同。如果類有多個構(gòu)造函數(shù),則它們的參數(shù)是各不相同的。當(dāng)類對象創(chuàng)建時,構(gòu)造函數(shù)會自動地執(zhí)行;由于它們沒有類型,不能像其他函數(shù)那樣進(jìn)行調(diào)用。當(dāng)類對象說明時調(diào)用哪一個構(gòu)造函數(shù)取決于傳遞給它的參數(shù)類型。什么是構(gòu)造函數(shù)C++提供了利用類的構(gòu)造函數(shù)來初始化類的數(shù)據(jù)調(diào)用構(gòu)造函數(shù)當(dāng)定義類對象時,構(gòu)造函數(shù)會自動執(zhí)行。因為一個類可能會有包括默認(rèn)構(gòu)造函數(shù)在內(nèi)的不止一種構(gòu)造函數(shù),下面討論如何調(diào)用特定的構(gòu)造函數(shù)。1.調(diào)用默認(rèn)構(gòu)造函數(shù)假設(shè)一個類包含有默認(rèn)構(gòu)造函數(shù),調(diào)用默認(rèn)構(gòu)造函數(shù)的語法如下:類名類對象名;2.調(diào)用帶參數(shù)的構(gòu)造函數(shù)假設(shè)一個類中包含有帶參數(shù)的構(gòu)造函數(shù),調(diào)用這種帶參數(shù)的構(gòu)造函數(shù)的語法如下:類名類對象名(參數(shù)表)其中,“參數(shù)表”中的參數(shù)可以是變量,也可以是表達(dá)式。3.調(diào)用內(nèi)置數(shù)據(jù)類型的構(gòu)造函數(shù)實際上,C++中內(nèi)置的數(shù)據(jù)類型都可以看成是類,定義變量時除了可以使用“=”運算符賦初值外,還可以像定義類對象一樣調(diào)用其構(gòu)造函數(shù)給變量賦初值。調(diào)用構(gòu)造函數(shù)當(dāng)定義類對象時,構(gòu)造函數(shù)會自動執(zhí)行。因4.用new動態(tài)創(chuàng)建對象
可以用new運算符來動態(tài)地建立對象。用new運算符建立對象時,同樣也要自動調(diào)用構(gòu)造函數(shù),以便完成對象數(shù)據(jù)成員的初始化。5.用構(gòu)造函數(shù)初始化對象的過程
構(gòu)造函數(shù)初始化對象的過程,實際上就是對構(gòu)造函數(shù)的調(diào)用過程。一般情況下按如下步驟進(jìn)行:(1)程序執(zhí)行到定義對象語句時,系統(tǒng)為對象分配內(nèi)存空間。(2)系統(tǒng)自動調(diào)用構(gòu)造函數(shù),將實參傳送給形參,執(zhí)行構(gòu)造函數(shù)體時,將形參值賦給對象的數(shù)據(jù)成員。完成數(shù)據(jù)成員的初始化工作。4.用new動態(tài)創(chuàng)建對象可以用new運算符來動態(tài)地建立重載構(gòu)造函數(shù)構(gòu)造函數(shù)可以像普通函數(shù)一樣被重載,C++根據(jù)聲明中的參數(shù)個數(shù)和類型選擇合適的構(gòu)造函數(shù)。重載構(gòu)造函數(shù)構(gòu)造函數(shù)可以像普通函數(shù)一樣被重載,C+復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)常用于將一個已知對象的數(shù)據(jù)成員復(fù)制給正在創(chuàng)建的另一個同類的對象。除此之外,復(fù)制構(gòu)造函數(shù)可以像其他構(gòu)造函數(shù)一樣定義和使用。復(fù)制構(gòu)造函數(shù)的格式如下:類名::復(fù)制構(gòu)造函數(shù)(類名&引用名)或:類名::復(fù)制構(gòu)造函數(shù)(const類名&引用名)在以下3種情況下,復(fù)制構(gòu)造函數(shù)都會自動被調(diào)用:當(dāng)說明一個類的對象時,使用另外一個對象來初始化(此時復(fù)制構(gòu)造函數(shù)就如同其他構(gòu)造函數(shù)一樣使用)。當(dāng)一個函數(shù)返回值為類類型時。當(dāng)一個類類型的實參傳遞給函數(shù)中的傳值調(diào)用參數(shù)時,在這種情況下,復(fù)制構(gòu)造函數(shù)決定了參數(shù)按照什么方式傳遞。復(fù)制構(gòu)造函數(shù)復(fù)制構(gòu)造函數(shù)常用于將一個已知對象的數(shù)據(jù)析構(gòu)函數(shù)什么是析構(gòu)函數(shù)析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)什么是析構(gòu)函數(shù)析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)的調(diào)用什么是析構(gòu)函數(shù)同構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的特殊成員函數(shù),不用調(diào)用便自動執(zhí)行,而且析構(gòu)函數(shù)的名字也與類的名字有關(guān)。C++程序設(shè)計的一個原則是:由系統(tǒng)自動分配的內(nèi)存空間由系統(tǒng)自動釋放。什么是析構(gòu)函數(shù)同構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的特殊析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)具有如下性質(zhì):析構(gòu)函數(shù)在類對象銷毀時自動執(zhí)行。一個類只能有一個析構(gòu)函數(shù),而且析構(gòu)函數(shù)沒有參數(shù)。析構(gòu)函數(shù)的名字是“~”加上類的名字(中間沒有空格)。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也沒有任何類型,即不屬于返回值函數(shù)也不屬于void函數(shù)。它們不能像其他函數(shù)那樣被調(diào)用。析構(gòu)函數(shù)的性質(zhì)析構(gòu)函數(shù)具有如下性質(zhì):析構(gòu)函數(shù)在類對象銷析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)被系統(tǒng)自動調(diào)用時分為以下兩種情況。1.用類直接建立對象
在程序執(zhí)行過程中,當(dāng)遇到對象的生存期結(jié)束時,系統(tǒng)自動調(diào)用析構(gòu)函數(shù),然后回收為對象所分配的存儲空間。2.用new動態(tài)創(chuàng)建對象
對于用new運算符動態(tài)創(chuàng)建的對象,在產(chǎn)生對象時調(diào)用構(gòu)造函數(shù),只有用delete釋放對象時,才調(diào)用析構(gòu)函數(shù)。若不使用delete運算符來撤銷動態(tài)生成的對象,程序結(jié)束時對象仍存在,并占用相應(yīng)的存儲空間,即系統(tǒng)不能自動撤銷動態(tài)創(chuàng)建的對象。析構(gòu)函數(shù)的調(diào)用析構(gòu)函數(shù)被系統(tǒng)自動調(diào)用時分為以下兩種情況。1一個對象的生存期如同一個變量一樣,對象從被創(chuàng)建到被釋放為止的時間稱為對象的生存期。一個對象的生存期如圖所示。一個對象的生存期如同一個變量一樣,對象從被創(chuàng)建到被釋對象淺復(fù)制與深復(fù)制對象淺復(fù)制對象深復(fù)制對象淺復(fù)制與深復(fù)制對象淺復(fù)制對象深復(fù)制對象淺復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,它們還共享某些資源(內(nèi)存空間),其中一個對象的銷毀會影響另一個對象,這種對象之間的復(fù)制稱為對象淺復(fù)制。對象淺復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,對象深復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,它們不會共享任何資源(內(nèi)存空間),其中一個對象的銷毀不會影響另一個對象,這種對象之間的復(fù)制稱為對象深復(fù)制。對象深復(fù)制當(dāng)兩個對象之間進(jìn)行復(fù)制時,若復(fù)制完成后,靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)靜態(tài)成員靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類中所有對象共享的成員,而不是某個對象的成員,也就是說靜態(tài)數(shù)據(jù)成員的存儲空間不是放在每個對象中,而是和成員函數(shù)一樣放在類公共區(qū)中。所以有時將靜態(tài)數(shù)據(jù)成員稱為類變量。因為靜態(tài)數(shù)據(jù)成員不從屬于任何一個具體對象,所以必須對它初始化,而且對它的初始化不能在構(gòu)造函數(shù)中進(jìn)行。靜態(tài)數(shù)據(jù)成員的使用方法如下:(1)靜態(tài)數(shù)據(jù)成員的定義與
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)員工勞保鞋統(tǒng)一采購供應(yīng)合同3篇
- 2024年度大蒜現(xiàn)貨交易市場調(diào)節(jié)與儲備服務(wù)協(xié)議3篇
- 2025版文化產(chǎn)業(yè)合作股權(quán)轉(zhuǎn)讓及市場推廣協(xié)議3篇
- 甜品店門窗施工合同協(xié)議書
- 2025版股東資產(chǎn)重組合作協(xié)議3篇
- 藝術(shù)畫廊木地板施工合同
- 醫(yī)療服務(wù)質(zhì)量監(jiān)控與評估
- 企業(yè)客戶答謝會車輛租賃
- 企業(yè)團(tuán)建廚師長錄用協(xié)議范本
- 機(jī)場工程產(chǎn)品認(rèn)證管理辦法
- DZY4850H整流器維修指導(dǎo)書
- 2023年7月中央電大行政管理本科《行政法與行政訴訟法》期末考試
- 礦井軌道質(zhì)量標(biāo)準(zhǔn)及架線維護(hù)規(guī)程
- 打字測試評分標(biāo)準(zhǔn)
- VBOXTools軟件操作手冊
- 外研版(三年級起點)五年級上冊重點知識點復(fù)習(xí)
- 2023-2024學(xué)年四川省涼山州小學(xué)數(shù)學(xué)六年級上冊期末自測試卷
- 2023年報告文學(xué)研究(自考)(重點)題庫(帶答案)
- 安全帶管理登記臺帳
- 第26課《詩詞五首-漁家傲》課件【教材精講精研】部編版語文八年級上冊
- 湖南省高等教育自學(xué)考試 畢業(yè)生登記表
評論
0/150
提交評論