内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

c語(yǔ)言構(gòu)造函數(shù)的概念 c語(yǔ)言構(gòu)造函數(shù)是什么

C語(yǔ)言里面構(gòu)造函數(shù)和析構(gòu)函數(shù)的運(yùn)用辦法

摘 要:構(gòu)造函數(shù)與析構(gòu)函數(shù)是一個(gè)類中看似較為簡(jiǎn)單的兩類函數(shù),但在實(shí)際運(yùn)用過程中總會(huì)出現(xiàn)一些意想不到的運(yùn)行錯(cuò)誤。本文將較系統(tǒng)的介紹構(gòu)造函數(shù)與析構(gòu)函數(shù)的原理及在C#中的運(yùn)用,以及在使用過程中需要注意的若干事項(xiàng)。

創(chuàng)新互聯(lián)公司堅(jiān)信:善待客戶,將會(huì)成為終身客戶。我們能堅(jiān)持多年,是因?yàn)槲覀円恢笨芍档眯刨?。我們從不忽悠初訪客戶,我們用心做好本職工作,不忘初心,方得始終。十載網(wǎng)站建設(shè)經(jīng)驗(yàn)創(chuàng)新互聯(lián)公司是成都老牌網(wǎng)站營(yíng)銷服務(wù)商,為您提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、H5建站、網(wǎng)站制作、高端網(wǎng)站設(shè)計(jì)、成都微信小程序服務(wù),給眾多知名企業(yè)提供過好品質(zhì)的建站服務(wù)。

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

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

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

根據(jù)經(jīng)驗(yàn),不少難以察覺的程序錯(cuò)誤是由于變量沒有被正確初始化或清除造成的,而初始化和清除工作很容易被人遺忘。微軟利用面向?qū)ο蟮母拍钤谠O(shè)計(jì)C#語(yǔ)言時(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í)行。這樣就不用擔(dān)心忘記對(duì)象的初始化和清除工作。

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

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

class TestClass

{

public TestClass(): base() {} // 由CLR提供

}

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

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

class TestClass

{

public TestClass(): base() {}

}

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

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

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

using System;

class Point

{

public double x, y;

public Point()

{

this.x = 0;

this.y = 0;

}

public Point(double x, double y)

{

this.x = x;

this.y = y;

}

}

class Test

{

static void Main()

{

Point a = new Point();

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

}

}

聲明了一個(gè)類Point,它提供了兩個(gè)構(gòu)造函數(shù)。它們是重載的。一個(gè)是沒有參數(shù)的Point構(gòu)造函數(shù)和一個(gè)是有兩個(gè)double參數(shù)的Point構(gòu)造函數(shù)。如果類中沒有提供這些構(gòu)造函數(shù),那么會(huì)CLR會(huì)自動(dòng)提供一個(gè)缺省構(gòu)造函數(shù)的。但一旦類中提供了自定義的構(gòu)造函數(shù),如Point()和Point(double x, double y),則缺省構(gòu)造函數(shù)將不會(huì)被提供,這一點(diǎn)要注意。

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

靜態(tài)構(gòu)造函數(shù)是實(shí)現(xiàn)對(duì)一個(gè)類進(jìn)行初始化的方法成員。它一般用于對(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)用。如:

using System.Data;

class Employee

{

private static DataSet ds;

static Employee()

{

ds = new DataSet(...);

}

}

聲明了一個(gè)有靜態(tài)構(gòu)造函數(shù)的類Employee。注意靜態(tài)構(gòu)造函數(shù)只能對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行初始化,而不能對(duì)非靜態(tài)數(shù)據(jù)成員進(jìn)行初始化。但是,非靜態(tài)構(gòu)造函數(shù)既可以對(duì)靜態(tài)數(shù)據(jù)成員賦值,也可以對(duì)非靜態(tài)數(shù)據(jù)成員進(jìn)行初始化。

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

以上是幾種類型構(gòu)造函數(shù)的簡(jiǎn)單運(yùn)用,下面將重點(diǎn)介紹一下在類的層次結(jié)構(gòu)中(即繼承結(jié)構(gòu)中)基類和派生類的構(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ù)。如果派生類又有對(duì)象成員,則,先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行成員對(duì)象類的構(gòu)造函數(shù),最后執(zhí)行派生類的構(gòu)造函數(shù)。

至于執(zhí)行基類的什么構(gòu)造函數(shù),缺省情況下是執(zhí)行基類的無(wú)參構(gòu)造函數(shù),如果要執(zhí)行基類的有參構(gòu)造函數(shù),則必須在派生類構(gòu)造函數(shù)的成員初始化表中指出。如:

class A

{ private int x;

public A( ) { x = 0; }

public A( int i ) { x = i; }

};

class B : A

{ private int y;

public B( ) { y = 0; }

public B( int i ) { y = i; }

public B( int i, int j ):A(i) { y = j; }

};

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

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

B b3 = new B(0,1); //執(zhí)行執(zhí)行基類A的構(gòu)造函數(shù)A(int) ,再執(zhí)行派生類的

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

在這里構(gòu)造函數(shù)的執(zhí)行次序是一定要分析清楚的。另外,如果基類A中沒有提供無(wú)參構(gòu)造函數(shù)public A( ) { x = 0; },則在派生類的所有構(gòu)造函數(shù)成員初始化表中必須指出基類A的有參構(gòu)造函數(shù)A(i),如下所示:

class A

{ private int x;

public A( int i ) { x = i; }

};

class B : A

{ private int y;

public B():A(i) { y = 0; }

public B(int i):A(i) { y = i; }

public B(int i, int j):A(i) { y = 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ù)的相反,就加前綴‘~’以示區(qū)別。

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

資源的.釋放一般是通過"垃圾回收器"自動(dòng)完成的,但具體來說,仍有些需要注意的地方:

1. 值類型和引用類型的引用其實(shí)是不需要什么"垃圾回收器"來釋放內(nèi)存的,因?yàn)楫?dāng)它們出了作用域后會(huì)自動(dòng)釋放所占內(nèi)存,因?yàn)樗鼈兌急4嬖跅?Stack)中;

2. 只有引用類型的引用所指向的對(duì)象實(shí)例才保存在堆(Heap)中,而堆因?yàn)槭且粋€(gè)自由存儲(chǔ)空間,所以它并沒有像"棧"那樣有生存期("棧"的元素彈出后就代表生存期結(jié)束,也就代表釋放了內(nèi)存),并且要注意的是,"垃圾回收器"只對(duì)這塊區(qū)域起作用;

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

public class ResourceHolder

{

~ResourceHolder()

{

// 這里是清理非托管資源的用戶代碼段

}

}

四.小結(jié)

構(gòu)造函數(shù)與析構(gòu)函數(shù)雖然是一個(gè)類中形式上較簡(jiǎn)單的函數(shù),但它們的使用決非看上去那么簡(jiǎn)單,因此靈活而正確的使用構(gòu)造函數(shù)與析構(gòu)函數(shù)能夠幫你更好的理解CLR的內(nèi)存管理機(jī)制,以及更好的管理系統(tǒng)中的資源。

構(gòu)造方法和構(gòu)造函數(shù)有什么不同

是一個(gè)東西.不過是不同說法.其實(shí)"函數(shù)"是類似c語(yǔ)言的說法,而方法是java的說法.java中的構(gòu)造方法是用來初始化類用的.比如說

public class A{

private int i;

public A(int i){

this.i=i;

}

public static void main(String args[]){

A a=new A(4);//此出用new 的時(shí)候就是調(diào)用了A的構(gòu)

造方法初始化了

}

java中的構(gòu)造方法名字必須是和類名相同,如果一個(gè)類沒寫構(gòu)造方法,系統(tǒng)運(yùn)行時(shí)會(huì)默認(rèn)給它一個(gè)沒有參數(shù)的構(gòu)造方法.

}

C#程序理解,怎么理解構(gòu)造函數(shù),構(gòu)造函數(shù)名字為什么和類名是一樣的呢??

構(gòu)造函數(shù)是面向?qū)ο蟮木幊讨谐霈F(xiàn)的一種方法,它是每個(gè)類都會(huì)有的方法,作用是構(gòu)造及初始化對(duì)象。為了程序編譯時(shí)能很好地辨識(shí)這個(gè)必須的“構(gòu)造函數(shù)”。那這個(gè)構(gòu)造函數(shù)的名字最好就有一定的規(guī)定?,F(xiàn)在規(guī)定了構(gòu)造函數(shù)名字和類名一致,編譯時(shí)就知道哪些是構(gòu)造函數(shù), 實(shí)例化對(duì)象時(shí)就會(huì)調(diào)用合適的構(gòu)造函數(shù)進(jìn)行類的實(shí)例化。

構(gòu)造函數(shù) 是一種特殊的方法 主要用來在創(chuàng)建對(duì)象時(shí)對(duì)對(duì)象進(jìn)行初始化。即為對(duì)象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)建對(duì)象的語(yǔ)句中。特別地,一個(gè)類可以有多個(gè)構(gòu)造函數(shù) 可根據(jù)其參數(shù)個(gè)數(shù)的不同或參數(shù)類型的不同來區(qū)分它們,就是構(gòu)造函數(shù)的重載。

構(gòu)造函數(shù)是類自己在對(duì)象剛剛創(chuàng)建時(shí)候自己調(diào)用的,一般不允許用戶自己顯示調(diào)用構(gòu)造函數(shù)。用戶只要將構(gòu)造函數(shù)寫好,類在實(shí)例化對(duì)象的時(shí)候自動(dòng)調(diào)用合適的構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行初始化(若有多個(gè)構(gòu)造函數(shù),系統(tǒng)會(huì)根據(jù)構(gòu)造函數(shù)的形參來進(jìn)行選擇)。

你可能會(huì)看到有些類沒有構(gòu)造函數(shù),這時(shí)候編譯器會(huì)自動(dòng)生成一個(gè)形參為空的函數(shù)體為空的構(gòu)造函數(shù)給該類??傊?,構(gòu)造函數(shù)是必須的。

你說的不懂的地方,其實(shí)就是在實(shí)例化kkk這個(gè)對(duì)象的時(shí)候,即kkk剛創(chuàng)建的時(shí)候,系統(tǒng)對(duì)自動(dòng)調(diào)用一次Program類的構(gòu)造函數(shù)。這就是構(gòu)造函數(shù)唯一一次調(diào)用的地方。用戶是不能顯示調(diào)用構(gòu)造函數(shù)的。

這和C語(yǔ)言是有區(qū)別的,構(gòu)造函數(shù)用于對(duì)象的初始化,這樣可以使對(duì)象的封裝性更好。

C語(yǔ)言中,“類”中的構(gòu)造函數(shù)和析構(gòu)函數(shù),樹上的解釋我看了,不明不白,求應(yīng)用。

首先,類是C++中的,C語(yǔ)言只有結(jié)構(gòu)體。當(dāng)你定義了一個(gè)類類型的對(duì)象時(shí),需要對(duì)這個(gè)對(duì)象中的數(shù)據(jù)成員初始化,這就是構(gòu)造函數(shù)的作用;當(dāng)這個(gè)類的對(duì)象生命周期結(jié)束時(shí),需要釋放相關(guān)內(nèi)存啊之類的,這就是析構(gòu)函數(shù)的作用。具體的例子可以參考我的博客:

關(guān)于構(gòu)造函數(shù):

關(guān)于析構(gòu)函數(shù):

C語(yǔ)言類一定要有構(gòu)造函數(shù)嗎

構(gòu)造函數(shù)通常用于在實(shí)例化對(duì)象時(shí)自動(dòng)對(duì)內(nèi)部數(shù)據(jù)成員初始化,設(shè)置初始值、分配內(nèi)存空間等。 而析構(gòu)函數(shù)則用于刪除對(duì)象時(shí)做收尾工作,比如釋放申請(qǐng)的空間等。 要?jiǎng)?chuàng)建一個(gè)對(duì)象,就得調(diào)用構(gòu)造函數(shù)。 要銷毀一個(gè)對(duì)象,就會(huì)被迫的調(diào)用析構(gòu)函數(shù)。

新聞名稱:c語(yǔ)言構(gòu)造函數(shù)的概念 c語(yǔ)言構(gòu)造函數(shù)是什么
網(wǎng)頁(yè)地址:http://m.rwnh.cn/article38/hieppp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站收錄、微信公眾號(hào)網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
岳阳县| 万宁市| 清徐县| 峡江县| 凤凰县| 北流市| 扎赉特旗| 辽源市| 利津县| 耒阳市| 惠来县| 长丰县| 嘉义县| 绩溪县| 枞阳县| 盘锦市| 申扎县| 鹤岗市| 澄迈县| 木兰县| 卓尼县| 平山县| 武清区| 博兴县| 东台市| 龙岩市| 云浮市| 濉溪县| 思南县| 南郑县| 宝鸡市| 论坛| 铅山县| 古交市| 镇赉县| 同德县| 安顺市| 同江市| 张家川| 资阳市| 阳江市|