C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法_第1頁
C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法_第2頁
C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法_第3頁
C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法_第4頁
C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——C語言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法摘要:構(gòu)造函數(shù)與析構(gòu)函數(shù)是一個(gè)類中看似較為簡樸的兩類函數(shù),但在實(shí)際運(yùn)用過程中總會(huì)展現(xiàn)一些意想不到的運(yùn)行錯(cuò)誤。本文將較系統(tǒng)的介紹構(gòu)造函數(shù)與析構(gòu)函數(shù)的原理及在C#中的運(yùn)用,以及在使用過程中需要留神的若干事項(xiàng)。

關(guān)鍵字:構(gòu)造函數(shù);析構(gòu)函數(shù);垃圾回收器;非托管資源;托管資源

一.構(gòu)造函數(shù)與析構(gòu)函數(shù)的原理

作為比C更先進(jìn)的語言,C#供給了更好的機(jī)制來鞏固程序的安好性。C#編譯器具有嚴(yán)格的類型安好檢查功能,它幾乎能找出程序中全體的語法問題,這確實(shí)幫了程序員的大忙。但是程序通過了編譯檢查并不表示錯(cuò)誤已經(jīng)不存在了,在“錯(cuò)誤”的大家庭里,“語法錯(cuò)誤”的地位只能算是冰山一角。級(jí)別高的錯(cuò)誤通常暗藏得很深,不輕易察覺。

根據(jù)閱歷,不少難以覺察的程序錯(cuò)誤是由于變量沒有被正確初始化或除掉造成的,而初始化和除掉工作很輕易被人遺忘。微軟利用面向?qū)ο蟮母拍钤谠O(shè)計(jì)C#語言時(shí)充分考慮了這個(gè)問題并很好地予以解決:把對(duì)象的初始化工作放在構(gòu)造函數(shù)中,把除掉工作放在析構(gòu)函數(shù)中。當(dāng)對(duì)象被創(chuàng)造時(shí),構(gòu)造函數(shù)被自動(dòng)執(zhí)行。當(dāng)對(duì)象消亡時(shí),析構(gòu)函數(shù)被自動(dòng)執(zhí)行。這樣就不用惦記忘卻對(duì)象的初始化和除掉工作。

二.構(gòu)造函數(shù)在C#中的運(yùn)用

構(gòu)造函數(shù)的名字不能隨意起,務(wù)必讓編譯器認(rèn)得出才可以被自動(dòng)執(zhí)行。它的命名方法既簡樸又合理:讓構(gòu)造函數(shù)與類同名。除了名字外,構(gòu)造函數(shù)的另一個(gè)更加之處是沒有返回值類型,這與返回值類型為void的函數(shù)不同。假設(shè)它有返回值類型,那么編譯器將不知所措。在你可以訪問一個(gè)類的方法、屬性或任何其它東西之前,第一條執(zhí)行的語句是包含有相應(yīng)類的構(gòu)造函數(shù)。甚至你自己不寫一個(gè)構(gòu)造函數(shù),也會(huì)有一個(gè)缺省構(gòu)造函數(shù)供給給你。

classTestClass

publicTestClass:base//由CLR供給

下面列舉了幾種類型的構(gòu)造函數(shù)

1)缺省構(gòu)造函數(shù)

classTestClass

publicTestClass:base

上面已介紹,它由系統(tǒng)(CLR)供給。

2)實(shí)例構(gòu)造函數(shù)

實(shí)例構(gòu)造函數(shù)是實(shí)現(xiàn)對(duì)類中實(shí)例舉行初始化的方法成員。如:

usingSystem;

classPoint

publicdoublex,y;

publicPoint

this.x=0;

this.y=0;

publicPointdoublex,doubley

this.x=x;

this.y=y;

classTest

staticvoidMain

Pointa=newPoint;

Pointb=newPoint3,4;//用構(gòu)造函數(shù)初始化對(duì)象

聲領(lǐng)略一個(gè)類Point,它供給了兩個(gè)構(gòu)造函數(shù)。它們是重載的。一個(gè)是沒有參數(shù)的Point構(gòu)造函數(shù)和一個(gè)是有兩個(gè)double參數(shù)的Point構(gòu)造函數(shù)。假設(shè)類中沒有供給這些構(gòu)造函數(shù),那么會(huì)CLR會(huì)自動(dòng)供給一個(gè)缺省構(gòu)造函數(shù)的。但一旦類中供給了自定義的構(gòu)造函數(shù),如Point和Pointdoublex,doubley,那么缺省構(gòu)造函數(shù)將不會(huì)被供給,這一點(diǎn)要留神。

3)靜態(tài)構(gòu)造函數(shù)

靜態(tài)構(gòu)造函數(shù)是實(shí)現(xiàn)對(duì)一個(gè)類舉行初始化的方法成員。它一般用于對(duì)靜態(tài)數(shù)據(jù)的初始化。靜態(tài)構(gòu)造函數(shù)不能有參數(shù),不能有修飾符而且不能被調(diào)用,當(dāng)類被加載時(shí),類的靜態(tài)構(gòu)造函數(shù)自動(dòng)被調(diào)用。如:

usingSystem.Data;

classEmployee

privatestaticDataSetds;

staticEmployee

ds=newDataSet...;

聲領(lǐng)略一個(gè)有靜態(tài)構(gòu)造函數(shù)的類Employee。留神靜態(tài)構(gòu)造函數(shù)只能對(duì)靜態(tài)數(shù)據(jù)成員舉行初始化,而不能對(duì)非靜態(tài)數(shù)據(jù)成員舉行初始化。但是,非靜態(tài)構(gòu)造函數(shù)既可以對(duì)靜態(tài)數(shù)據(jù)成員賦值,也可以對(duì)非靜態(tài)數(shù)據(jù)成員舉行初始化。

假設(shè)類僅包含靜態(tài)成員,你可以創(chuàng)造一個(gè)private的構(gòu)造函數(shù):privateTestClass…,但是private意味著從類的外面不成能訪問該構(gòu)造函數(shù)。所以,它不能被調(diào)用,且沒有對(duì)象可以被該類定義實(shí)例化。

以上是幾種類型構(gòu)造函數(shù)的簡樸運(yùn)用,下面將重點(diǎn)介紹一下在類的層次布局中(即繼承布局中)基類和派生類的構(gòu)造函數(shù)的使用方式。派生類對(duì)象的初始化由基類和派生類共同完成:基類的成員由基類的構(gòu)造函數(shù)初始化,派生類的成員由派生類的構(gòu)造函數(shù)初始化。

當(dāng)創(chuàng)造派生類的對(duì)象時(shí),系統(tǒng)將會(huì)調(diào)用基類的構(gòu)造函數(shù)和派生類的構(gòu)造函數(shù),構(gòu)造函數(shù)的執(zhí)行次序是:先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù)。假設(shè)派生類又有對(duì)象成員,那么,先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行成員對(duì)象類的構(gòu)造函數(shù),結(jié)果執(zhí)行派生類的構(gòu)造函數(shù)。

至于執(zhí)行基類的什么構(gòu)造函數(shù),缺省處境下是執(zhí)行基類的無參構(gòu)造函數(shù),假設(shè)要執(zhí)行基類的有參構(gòu)造函數(shù),那么務(wù)必在派生類構(gòu)造函數(shù)的成員初始化表中指出。如:

classA

privateintx;

publicAx=0;

publicAintix=i;

;

classB:A

privateinty;

publicBy=0;

publicBintiy=i;

publicBinti,intj:Aiy=j;

;

Bb1=newB;//執(zhí)行基類A的構(gòu)造函數(shù)A,再執(zhí)行派生類的構(gòu)造函數(shù)B

Bb2=newB1;//執(zhí)行基類A的構(gòu)造函數(shù)A,再執(zhí)行派生類的構(gòu)造函數(shù)Bint

Bb3=newB0,1;//執(zhí)行執(zhí)行基類A的構(gòu)造函數(shù)Aint,再執(zhí)行派生類的

構(gòu)造函數(shù)Bint,int

在這里構(gòu)造函數(shù)的執(zhí)行次序是確定要分析領(lǐng)會(huì)的。另外,假設(shè)基類A中沒有供給無參構(gòu)造函數(shù)publicAx=0;,那么在派生類的全體構(gòu)造函數(shù)成員初始化表中務(wù)必指出基類A的有參構(gòu)造函數(shù)Ai,如下所示:

classA

privateintx;

publicAintix=i;

;

classB:A

privateinty;

publicB:Aiy=0;

publicBinti:Aiy=i;

publicBinti,intj:Aiy=j;

;

三.析構(gòu)函數(shù)和垃圾回收器在C#中的運(yùn)用

析構(gòu)函數(shù)是實(shí)現(xiàn)銷毀一個(gè)類的實(shí)例的方法成員。析構(gòu)函數(shù)不能有參數(shù),不能任何修飾符而且不能被調(diào)用。由于析構(gòu)函數(shù)的目的與構(gòu)造函數(shù)的相反,就加前綴‘~’以示識(shí)別。

雖然C#(更切當(dāng)?shù)恼f是CLR)供給了一種新的內(nèi)存管理機(jī)制自動(dòng)內(nèi)存管理機(jī)制(Automaticmemorymanagement),資源的釋放是可以通過“垃圾回收器”自動(dòng)完成的,一般不需要用戶干預(yù),但在有些特殊處境下還是需要用到析構(gòu)函數(shù)的,如在C#中非托管資源的釋放。

資源的釋放一般是通過垃圾回收器自動(dòng)完成的,但概括來說,仍有些需要留神的地方:

1.值類型和引用類型的引用其實(shí)是不需要什么垃圾回收器來釋放內(nèi)存的,由于當(dāng)它們出了作用域后會(huì)自動(dòng)釋放所占內(nèi)存,由于它們都保存在棧Stack中;

2.只有引用類型的引用所指向的對(duì)象實(shí)例才保存在堆Heap中,而堆由于是一個(gè)自由存儲(chǔ)空間,所以它并沒有像棧那樣有生存期棧的元素彈出后就代表生存期終止,也就代表釋放了內(nèi)存,并且要留神的是,垃圾回收器只對(duì)這塊區(qū)域起作用;

然而,有些處境下,當(dāng)需要釋放非托管資源時(shí),就務(wù)必通過寫代碼的方式來解決。通常是使用析構(gòu)函數(shù)釋放非托管資源,將用戶自己編寫的釋放非托管資源的代碼段放在析構(gòu)函數(shù)中即可。需要留神的是,假設(shè)一個(gè)類中沒有使用到非托管資源,那么確定不要定義析構(gòu)函數(shù),這是由于對(duì)象執(zhí)行了析構(gòu)函數(shù),那么垃圾回收器在釋放托管資源之前要先調(diào)用析構(gòu)函數(shù),然后其次次才真正釋放托管資源,這樣一來,兩次刪除動(dòng)作的花銷比一次大多的。下面使用一段代碼來示析構(gòu)函數(shù)是如何使用的:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論