C 教程第07章類與物件 910結構與聯合拷貝構

2022-11-10 12:45:03 字數 3492 閱讀 2242

7章類與物件

7.1類和物件(定義及使用)初步7.2成員函式的過載

7.3物件的初始化、建構函式與析構函式7. 4類的定義及其使用7. 5類的靜態成員及常量成員7. 6友元

7. 7類之間的物件關係物件成員和巢狀7. 8自定義類中的運算子過載*7. 9結構與聯合

已在「4.6結構體型別」一節中簡單地介紹過結構及其使用。當時只是將它作為一種

存放資料的實體來使用來看待的。實際上,c++中的結構體同樣能夠像類那樣地實現封裝(而在c中則不能)。即是說,除資料成員外,也可在結構中定義函式成員;結構也可以有它自己的建構函式、析構函式以及this指標等等。

可以看出,類和結構在一定意義上是等價的。結構與類的區別是:在預設情況下,結構的成員是公有的(隱含為public型的),而類的成員是私有的(隱含為private型的)。

作為使用習慣,通常在僅描述資料成員時使用結構struct,而當既描述資料成員又刻畫其操作(函式成員)時使用類class。另外,在討論結構的時候,我們往往用結構變數這個詞;但在討論類時,我們用物件這個詞。

聯合在c++語言中除了類似於類和結構之外,受到了更多的限制,主要是其所有資料成員重疊,都從同一位置開始儲存。通常也只在要描述一批可重疊存放的資料成員時才使用聯合union。

總之,c++語言中的類和物件概念使得結構和聯合在程式設計中的重要性變輕,在作為c++語言的衍生語言j**a語言中,乾脆取消了結構和聯合這兩種資料型別。如果想對結構和聯合了解的更多,請參閱有關隨機幫助資料或其他參考書籍。

7. 10拷貝建構函式

建構函式除了可以在建立物件時對其中的成員資料進行初始化之外,還具有其他的兩

類特殊用途,即利用建構函式進行型別轉換,以及具有複製功能的建構函式。

7. 10. 1複製建構函式

具有完成複製功能的建構函式稱為複製建構函式。複製建構函式是一種特殊的建構函式。

其格式如下:《類名》::《類名》(〈〈const〉〉《類名》&《參數列》)

1複製建構函式的引數為它所在類的類別的引用。它是乙個建構函式,當用乙個已有的物件對正在建立的物件進行初始化時,呼叫該建構函式。它的特殊功能是能將引數代表的物件逐域複製到新建立的物件中。

複製建構函式有兩種形式:1)系統自動產生。

當使用者沒有定義複製建構函式時,系統將會自動產生乙個複製建構函式。在下述3種情況下,系統都將自動地去呼叫物件所屬類的拷貝建構函式:

①當使用如下兩種方式之一的說明語句,用已存在的物件來創造乙個相同的新物件時;《類名》《物件名2 >(《物件名1 >);《類名》《物件名2 >=《物件名1 >;

在說明新物件《物件名2 >時,準備用已存在物件《物件名1 >來對其進行初始化。②若物件作為函式的賦值引數,在呼叫函式時,當剛進入被調函式處首先要進行實參和形參的結合,此時會自動呼叫拷貝建構函式,以完成由實參物件來建立乙個相同的(區域性於本函式的)形參新物件。

③若函式的返回值是類的物件,在執行被調函式的返回語句後(也即在函式呼叫完成返回時),系統也將自動呼叫拷貝建構函式去建立乙個與返回值相同的臨時新物件。

一般規定所建立的臨時物件,僅在建立它們的外部表示式範圍內有效,表示式結束時,系統將呼叫析構函式去「銷毀」該臨時物件。

例1呼叫自動複製建構函式

# include <>class cpointcpoint ( int vx , int vy )

void print ( )

執行該程式,輸出結果為:100200100200100200

對於a行和b行,由於在類定義中沒有相應的建構函式與它們匹配,此時將呼叫系統自動產生的複製建構函式。其具有如下的形式:

2cpoint::cpoint(cpoint &pt)cpoint( int vx , int vy )

cpoint(cpoint &pt)

void print ( )

執行結果:100200

呼叫複製建構函式cpoint(cpoint&)!100200

呼叫複製建構函式cpoint(cpoint&)!100200標誌---

3)一般來說,系統自動產生的複製建構函式能處理大多數問題,但有些問題卻必須利用使用者自定義的複製建構函式。比如在複製同型別物件時只複製部分成員資料,或者類中的成員資料用new運算子動態分配儲存空間且在析構函式中釋放儲存空間等。

例:3自定義的複製建構函式處理「指標懸掛」問題。# include<>

3# include<>class caca (char *s)

ca ( ca &s);

~ca()//撤消指標ps所占用的儲存空間char *gets ( )

} ;ca::ca(ca &s)

else ps=0;}

void main (void )

執行該程式,輸出結果為:s1=china !s2=china !

如果沒有使用者自定義的複製建構函式,會產生指標懸掛問題。

7. 10. 2.利用建構函式進行型別轉換

對於基本資料型別,不同型別的資料之間可以相互轉換,他們之間可以自動轉換,也可進行強制型別轉換。當然,前提是它們之間必須相容。

對於使用者自定義型別的資料,不同型別的資料之間也可以相互轉換,而且也有兩種轉換形式:自動轉換和強制轉換。這些轉換都是通過建構函式實現的。

下例,說明如何進行自動型別轉換以及具有乙個引數建構函式的一些特殊用法。例4

# include<>class b

4};class aa(int a)

執行結果:

i=10呼叫建構函式a(int)!i=20呼叫建構函式a(int)!i=50呼叫建構函式a(int)!呼叫建構函式b()!

i=10呼叫建構函式a(b)!i=10呼叫建構函式a(b)!

①當乙個類能夠建立帶有乙個實參的物件時,可以像b行和e行那樣進行物件的初始化。其實b行和e行分別與下面的語句等價:aa2 (20 ) ;aa2 ( b ) ;

②c行是賦值語句,即將整型資料50賦給型別a的變數a2,由於等號兩邊的運算元的型別不一致,因此在賦值之前要進行型別轉換。型別轉換的過程是:

編譯系統呼叫建構函式將50轉換為a型別的物件(此時呼叫了建構函式a(int),並將該物件賦給a2,賦值完畢,立即撤消該臨時物件。

注意:綜上所述,當乙個類能夠建立帶有乙個實參(型別為t)的物件時,可進行下列操作:

1)在建立物件時,可以用賦值語句進行初始化,即可將t型別的資料賦給物件。

2)對已建立的物件,可以將t型別的資料賦給該物件。此時會產生乙個臨時物件,且當賦值完畢時立即撤消該臨時物件。

3)對多個引數的建構函式,則可利用它進行強制型別轉換。利用建構函式進行型別強制轉換的一般格式為:《類名》 (《實參表》)

其功能是通過呼叫《類名》中能夠與(《實參表》相匹配的建構函式,產生乙個臨物件,然後使該臨時物件參加運算,運算結束後,系統立即自動撤消這個臨時物件。其能夠實現轉換

5的條件是:相應的類中具有能夠與《實參表》相匹配的建構函式(包括具有預設引數值的建構函式)。

4)另一種強制型別轉換的方法,是「運算子過載」,可以實現任意型別的轉換。

例5用建構函式進行強制型別轉換# include <>class csample

執行該程式,輸出結果為:

x=12 ,y =105呼叫了建構函式!x=45 ,y=80呼叫了建構函式!6

C第10章類和物件例子

例10.4 定義並測試長方形類crect,長方形是由左上角座標 left,top 和右下角座標 right,bottom 組成。include include class crect 定義長方形類 void print void void crect setcoord int l,int t,int...

第3章確定物件與資訊

1 價值分析物件的確定 2 資訊與資料的收集。分析問題和解決問題的前提是發現問題和提出問題,這是進行設計的關鍵一步,也是價值分析首先要解決的問題。因為沒有很好地確定物件,則不能解決關鍵問題,而物件的選擇與確定,則是正確發現問題的前提。物件確定 資訊收集 不可分開 互為因果關係 沒有充足的資訊,則不能...

網頁設計與製作教程第15章

圖15 1 行為 面板 圖15 2 單擊按鈕,彈出動作選單圖15 3 顯示事件 級聯選單圖15 4 單擊下拉三角形 圖15 5 應用例項示意 圖15 6 設定顯示層layer2 圖15 7 設定隱藏層layer2 圖15 8 聲音 對話方塊 圖15 9 設定狀態條文本 對話方塊 圖15 10 時間軸...