第三章 類和成員

2021-07-10 03:04:54 字數 4372 閱讀 8382



1>類和結構

(1)類和結構實際上都是建立物件的模板,每個物件都包含資料,並提供了處理和訪問資料的方法。

```class phonecustomer

```(2)結構與類的區別是它們在記憶體中的儲存方式(類是儲存在堆(heap)上的引用型別,而結

構是儲存在堆疊(stack)上的值型別)、訪問方式和一些特徵(如結構不支援繼承)。較小的數

據型別使用結構可提高效能。在語法上,結構與類非常相似,主要的區別是使用關鍵字

struct 代替 class 來宣告結構。

例項:```struct phonecustomerstruct

```類和結構,都使用關鍵字 new 來宣告例項:這個關鍵字建立物件並對其進行初始

化。 例項:

phonecustomer mycustomer = new phonecustomer(); //works for a class

phonecustomerstruct mycustomer2 = new phonecustomerstruct(); // works for a struct

3>類成員

(1)類中的資料和函式稱為類的成員。

類中的所有成員都可以宣告為 public(此時可以在類的外部直接訪問它們) 或 private(此時,它們只能由類中的其他**來訪問)。

(2)資料成員

1)資料成員包含了類的資料—— 字段、常量和事件。資料成員可以是靜態資料(與整個類相關)或例項資料(類的每個例項都有它自己的資料副本)。對於物件導向的語言,類成員總是例項成員,除非用 static 進行了顯式的宣告。

欄位是與類相關的變數。

訪問字段:

```phonecustomer customer1 = new phonecustomer();

customer1.firstname = "simon";

```    2)const 關鍵字來宣告常量。如果它們宣告為 public,就可以在類的外部訪問。

```class phonecustomer

```4>函式成員

(1)函式成員提供了操作類中資料的某些功能,包括方法、屬性、建構函式和終結器(finalizer)、運算子以及索引器。

1)方法是與某個類相關的函式,它們可以是例項方法,也可以是靜態方法。例項方法處理類的某個例項,靜態方法提供了更一般的功能,不需要例項化乙個類(例如 console.writeline()方法)。

2)屬性是可以在客戶機上訪問的函式組,其訪問方式與訪問類的公共字段類似。

3)建構函式是在例項化物件時自動呼叫的函式。它們必須與所屬的類同名,且不能有返回型別。建構函式用於初始化欄位的值。

4)終結器類似於建構函式,但是在 clr 檢測到不再需要某個物件時呼叫。

5)運算子執行的最簡單的操作就是+和–。在對兩個整數進行相加操作時,嚴格地說,就是對整數使用+運算子。

6)就是對整數使用+運算子。

(2)方法

1)方法的宣告

1,每個方法都單獨宣告為 public 或 private

2,方法的定義包括方法的修飾符(例如方法的可訪問性)、返回值的型別,然後是方法名、輸入引數的列表(用圓括號括起來)和方法體(用花括號括起來)。

```[modifiers] return_type methodname([parameters])

```     3,每個引數都包括引數的型別名及在方法體中的引用名稱。但如果方法有返回值, return語句就必須與返回值一起使用,以指定出口點。

```public bool issquare(rectangle rect)

```     4,方法沒有返回值,就把返回型別指定為 void,因為不能省略返回型別。

5,注意方法可以包含任意多個 return 語句.

```public bool ispositive(int value)

```2)給方法傳遞引數

1,引數可以通過引用或值傳遞給方法。在變數通過引用傳遞給方法時,被呼叫的方法得到的就是這個變數,所以在方法內部對變數進行的任何改變在方法退出後仍舊發揮作用。而如果變數是通過值傳送給方法的,被呼叫的方法得到的是變數的乙個副本。

2,引用型別的物件只包含物件的引用,它們只給方法傳遞這個引用,而不是物件ᴀ身,所以對底層物件的修改會保留下來。相反,值型別的物件包含的是實際資料,所以傳遞給方法的是資料ᴀ身的副本。

3)ref 引數

1,通過值傳送變數是預設的,也可以迫使值引數通過引用傳送給方法。為此,要使用 ref關鍵字。如果把乙個引數傳遞給方法,且這個方法的輸入引數前帶有 ref 關鍵字,則該方法對變數所作的任何改變都會影響原來物件的值:

```static void somefunction(int ints, ref int i)

```   2,在呼叫該方法時,還需要新增 ref 關鍵字:

somefunction(ints, ref i);

4)out 關鍵字

1,使用 out 關鍵字來初始化。當在方法的輸入引數前面加上 out 關鍵字時,傳遞給該方法的變數可以不初始化。該變數通過引用傳送,所以在從被呼叫的方法中返回時,方法對該變數進行的任何改變都會保留下來。

```static void somefunction(out int i)

public static int main()

```    5)方法的過載

1,過載方法,只需宣告同名但引數個數或型別不同的方法

```class resultdisplayer

void displayresult(int result)

}```

2,使用方法過載

```class myclass

int dosomething(int x, int y)

}```

2,c#在過載方法的引數方面有一些小區別:

● 兩個方法不能僅在返回型別上有區別。

● 兩個方法不能僅根據引數是宣告為 ref 還是 out 來區分。

(3)屬性

1)屬性的概念是:它是乙個方法或一對方法,在客戶機**看來,它們是乙個字段。

2)定義:

```public string someproperty

set}

```get 訪問器不帶引數,且必須返回屬性宣告的型別。也不應為 set 訪問器指定任何顯式引數,但編譯器假定它帶乙個引數,其型別也與屬性相同,並表示為 value。

```private string forename;

public string forename

set}

```注意:c#的區分大小寫模式,使用相同的名稱,但公共屬性採用 pascal 大小寫命名規則,而私有屬性採用 camel 大小寫命名規則。

3)唯讀和只寫屬性

1,在屬性定義中省略 set 訪問器, 就可以建立唯讀屬性。

2,在屬性定義中省略 get 訪問器,就可以建立只寫屬性。

4)屬性的訪問修飾符

屬性可以有公共的 get訪問器和私有或受保護的 set 訪問器。這有助於控制屬性的設定方式或時間。

(4)建構函式

1)建構函式的過載遵循與其他方法相同的規則。換言之,可以為建構函式提供任意多的過載,只要它們的簽名有明顯的區別即可:

```public myclass()

public myclass(int number)

```注意:如果提供了帶引數的建構函式,編譯器就不會自動提供預設的建構函式,只有在沒有定義任何建構函式時,編譯器才會自動提供預設的建構函式。

```public class mynumber

}```

一般使用 this 關鍵字區分成員欄位和同名的引數。

2)把建構函式定義為 private 或 protected,不相關的類就不能訪問它們。

```public class mynumber

}```

注意:沒有為 mynumber 定義任何公共或受保護的建構函式。這就使

mynumber 不能使用 new 運算子在外部**中例項化(但可以在mynumber 上編寫乙個公共靜態屬性或方法,以進行例項化)。

一下兩種情況可用:

● 類僅用作某些靜態成員或屬性的容器,因此永遠不會例項化。

● 希望類僅通過呼叫某個靜態成員函式來例項化(這就是所謂物件例項化的類**方法)。

3)靜態建構函式

1,無引數的靜態建構函式。這種建構函式只執行一次,而前面的建構函式是例項建構函式,只要建立類的物件,它都會執行。

```class myclass

// rest of class definition

}```

編寫靜態建構函式的乙個原因是,類有一些靜態欄位或屬性,需要在第一次使用類之前,從外部源中初始化這些靜態欄位和屬性。

2, 從其他建構函式中呼叫建構函式

兩個建構函式初始化了相同的字段,顯然,最好把所有的**放在乙個地方----建構函式初始化器。

第三章 《類和物件II》

目錄 1.什麼是常物件?使用常物件時要注意什麼?2.什麼是常資料成員?常資料成員怎麼賦初值?3.帶成員初始化列表的建構函式的執行順序是怎樣的?4.在建構函式成員初始化列表中初始化資料成員和在建構函式體中初始化,結果是一樣的?二者在效能方面有什麼區別呢?5.什麼是常成員函式?使用常成員函式要注意什麼?...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...

第三章 曙光

第三章 曙光 第二場校園招聘開始了。其實,洋對這個公司的不是很了解。因為前幾天突然在bbs上面看到了這個公司的招聘資訊,洋覺得這個公司不錯,就上網投了簡歷。接下來的乙個多小時,讓洋很震撼!想不到這個公司這個厲害,而且無論從哪方面來說,絕對不比之前的那個公司差。想不到自己的乙個不經意的決定到了這個大的...