C 學習之自定義類實現foreach

2022-02-24 05:13:56 字數 2543 閱讀 8267

前提知識:陣列可以被foreach語句遍歷陣列中的元素,原因是所有陣列的基類都是system.array ,而system.array 類實現了ienumerable介面,可以通過getenumerator方法按需提供乙個叫做列舉數(enumerator)的物件,列舉數可以依次返回請求的陣列的元素。 (注:c#裡面的列舉數,也就是列舉器,類似於c++中的迭代器,而c#中的迭代器是另外乙個意思。不知我這樣理解對否?)

第一步:建立person類

view code

1

public

class person

2

1112

public

override

string tostring()

13

16 }

第二步:建立peopleenum類,該類繼承ienumerator介面,實現ienumerator介面裡的movenext、reset方法和current屬性

view code

1

public

class peopleenum : ienumerator

2

1011

public

bool movenext()

12

1617

public

void reset()

18

2122

public

object current

23

28 }

2930 }

第三步: 建立people類,該類繼承ienumerable介面,實現了getenumerator方法,getenumerator方法的作用是獲取列舉數(返回值是ienumerator型別的,就是列舉數的型別),在這裡是通過返回peopleenum類的乙個例項來取得列舉數。

view code

1

public

class people : ienumerable

2

12 }

1314

public ienumerator getenumerator()

15

18 }

第四步:people類實現了介面ienumerable介面,所以people類的例項就能使用foreach來遍歷自身元素。主函式測試**如下:

1

class program

2 ;

1112 people peoplelist = new people(persons);

1314

foreach (var item in peoplelist)

15

1819 system.console.readkey();

20 }

21 }

輸出如下

第一部分裡的第二步建立peopleenum類,並實現裡其繼承的ienumerator介面裡的movenext、reset方法和current屬性,其實,該類已經具備了遍歷自身元素的條件了。

把主函式裡的測試的**改成如下,執行-》輸出,結果是一樣的

view code

1

class program

2 ;

1112

while (peopleenum.movenext())

13

1617 system.console.readkey();

18 }

19 }

但是不能使用foreach語句,為什麼呢?因為使用foreach語句類必須提供getenumerator方法獲取該類的列舉數,然後編譯器通過這個列舉數來呼叫ienumerator介面裡的 movenext、reset方法和current屬性實現對類元素的遍歷。

給peopleenum類新增乙個getenumerator方法

1

public ienumerator getenumerator()

2

主函式測試**改成如下:

1

class program

2 ;

1112

13 peopleenum peopleenum = new peopleenum(persons);

1415

foreach (var item in peopleenum)

16

2021 system.console.readkey();

22 }

23 }

執行,成功!

C 如何實現自定義類

pragma once include include using namespace std class csvitem csvitem const csvitem item void operator const csvitem item public string lock time 作業上鎖...

C 實現自定義string類

在一些c 筆試題裡,會有這樣一道題,那就是讓你自己實現乙個簡單的string類。自己在面試的時候就遇到過這個題。在這裡說一下自己是怎麼做的。主要包含一些基本的操作,建構函式 拷貝建構函式和析構函式。pragma once include using namespace std class mystr...

C 學習之 自定義模板

1.函式模板的定義 template 返回型別 函式名 模板函式常常可以解決我們 冗餘的情況,比如如果我們要實現若干數字排序,又要實現對字串進行排序等等,一般我們都要為每種型別排序都寫乙個排序函式,但模板函式就可以實現乙個函式就能達到要求。參考程式 include using namespace s...