




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨時(shí)租用商鋪合同范例
- 2025年中國絲印傘市場調(diào)查研究報(bào)告
- 公司銷售人員合同范例
- 書經(jīng)銷合同范例
- 刑事會(huì)見合同范例
- 農(nóng)場經(jīng)營代養(yǎng)合同范例
- 倉庫閣樓轉(zhuǎn)讓合同范例
- 個(gè)人資產(chǎn)質(zhì)押合同范例
- 養(yǎng)牛股合同范例
- 會(huì)展買賣合同范例
- 《鋰離子電池介紹》
- 第3章-水文統(tǒng)計(jì)原理
- 斑馬導(dǎo)絲熱縮工藝
- 《工傷預(yù)防知識(shí)教育》課件
- 重癥醫(yī)學(xué)科品管圈PDCA案例四例
- 蘇教版二年級(jí)科學(xué)下冊(cè)第7課《栽小蔥》課件PPT
- 《活著》讀后感-課件
- 空白表格簡歷模板
- 網(wǎng)店運(yùn)營管理(第二版)課件全套 段文忠 第1-9章 網(wǎng)店運(yùn)營基本原理- 戰(zhàn)略化運(yùn)營 動(dòng)態(tài)競爭
- 煤礦機(jī)電事故及其防治措施
- 王思斌社會(huì)工作概論第3版課后習(xí)題答案完全
評(píng)論
0/150
提交評(píng)論