第十五章之(二)巢狀類

2021-07-10 05:34:39 字數 3338 閱讀 2928

在c++中,可以將類宣告放在另乙個類中。

在另乙個類中宣告的類,被稱為巢狀類(

nested class

它通過提供新的型別類作用域類避免名稱混亂。

包含類的成員函式,可以建立和使用被巢狀類的物件。

而僅當宣告位於公有部分時,才能在包含類的外面使用巢狀類。而且必須使用作用域解析運算子(舊版本可能不允許使用巢狀類,或無法完全實現這種概念)。

不懂,感覺是乙個類

a的類宣告在另外乙個類

b裡(此時,這個

a類的宣告,即可能在

b的公有部分,也可能在私有部分,還可能在保護部分。),只有當類

a的宣告在類

b的公有部分,類

a才能在類

b外面使用(即類似資料成員位於公有部分)。並且要加作用域解析運算子才能呼叫a。

有點類似在類中宣告乙個結構。

對類進行巢狀,與包含並不相同。包含意味著將類物件作為另乙個類的成員(但需要在類定義裡面進行宣告,並且宣告幾個就是幾個,除非使用new來分配,但這需要乙個指標)。而對類進行巢狀不建立類成員,而是定義了一種型別。該型別僅在包含巢狀類宣告的類中有效(也就是說,只能在該類方法中宣告此類)。

巢狀和包含的區別:

從以上說明來看:

包含一般是固定數量的類物件,或者使用new來動態分配,但就算使用new來動態分配,其指標的數量是一定的(在類定義時確認)。但由於在每個類方法中都可以使用該指標,因此在不同類方法中,可以共享同乙個資料。

巢狀,可以自由在類方法中宣告類物件,如果該類是自動變數的話,那麼離開該類方法時,會自動銷毀(自動變數的特性)。因此,乙個類方法中宣告的巢狀類的物件,不能在另乙個類方法中使用(因為其作用域是該類方法)。

假如在乙個類中宣告另乙個類,文中使用的是佇列模擬(特點是隊首刪除,隊尾新增)。之前使用的是結構形式(乙個成員為專案,即佇列裡的東西,另乙個成員為指標,指向下乙個結構的位置)

現就將結構改為類的形式,進行推斷:

①首先,資料成員保持不變,即乙個資料成員為專案,另乙個資料成員為指標。但此時,指標的型別更改,變為該類的指標;

②當新增新物件時(隊尾新增),則需要建立乙個新的專案,因此需要通過類物件來建立。

由於專案在類中,因此可以呼叫類的建構函式,在建立類物件的時候,同時建立該專案。又因為專案型別不定(比如說可能是某個類),因此,在建構函式中使用成員初始化列表。(這樣,假如專案是類,將自動呼叫其對應建構函式)。

因此,我們需要自定義類的建構函式。

另外,這個建構函式,要能將指標自動指向空指標(因為新加入的便是最後乙個)

③其他變化不大,每進來乙個,則要new乙個新的(並且賦值)。每結束乙個,則呼叫delete(與new對應)

**如下(用之前的atm模擬測試):

#include#includeclass customer

//預設建構函式,初始化

long when()const //返回到達時間

int ptime()const //返回消耗時間

void set(long when) //將到達時間作為引數傳遞 };

typedef customer item;

class queue

//預設為空指標,將專案傳遞給私有資料成員

}; int items = 0; //預設情況下,size(當前專案數)為0

const int max; //最大容納

node *front; //指向第乙個

node *rear; //指向最後乙個

public:

queue(int m = 10);

~queue();

bool isfull()const //如果等於最大則滿

bool isempty()const //如果等於0則空

int queuecount() //返回數目

bool enqueue(const item&it); //放入

bool dequeue(item&it); //取出

};queue::queue(int m) :max(m) //建構函式,指標預設為空指標,預設情況下,max的值為10

queue::~queue()

}bool queue::enqueue(const item&it)

items++;

return true;

}bool queue::dequeue(item&it)

const int min_per_hr = 60;

bool newcustomer(double x);

int main()

} if (wait_time <= 0 && !line.isempty())

if (wait_time > 0)

wait_time--;

sum_line += line.queuecount();

} if (customers > 0)

else

cout << "no customers!\n";

cout << "done!\n";

system("pause");

return 0;

}bool newcustomer(double x)

測試結果與之前相同,說明**正常執行。

呼叫巢狀類中的方法:

假如node是乙個普通的類,當我們呼叫它的方法時,是這樣做的:node::isfull();

而此時,node類在queue類中,因此,我們呼叫node類方法時,則不能像之前那樣,但方法類似,加上新的作用域解析運算子,即:queue::node::isfull();即可。(前提是,node類在queue類的public部分宣告)

同樣,假如需要在類外宣告乙個在類內public區域宣告的類,需要在型別名前加上作用域解析運算子。例如queue::node one; 這樣。

但在private和protected區域宣告的類,則無法做到這點(即無法在類外使用)。

protected可以在派生類使用,而private只能在當前類使用。

將巢狀類放在模板類之中:

將巢狀類放在模板類之中,很簡單,和使用typedef類似。

即使用模板類的中的xx作為其型別名。

例如node類的宣告不變(其專案型別為item),修改queue類宣告:

template

item>

class

queue ;

....

之後,按照使用模板類的方法,逐個修改queue類的類方法的函式定義即可。

第十五章之(二)巢狀類

在c 中,可以將類宣告放在另乙個類中。在另乙個類中宣告的類,被稱為巢狀類 nested class 它通過提供新的型別類作用域類避免名稱混亂。包含類的成員函式,可以建立和使用被巢狀類的物件。而僅當宣告位於公有部分時,才能在包含類的外面使用巢狀類。而且必須使用作用域解析運算子 舊版本可能不允許使用巢狀...

第十五章預習

public class yuxi15 else 字串的比較 字串1.equals 字串2 比較兩個字串的值是否相同,返回boolean型別的值.如果相同,則返回真值,否則返回假值.字串1.equalsignorecase 字串2 忽略大小寫比較字串1和字串2.如果都相同則返回真值 否則返回假值 改...

learn with python 第十五章 繼承

第十六章 繼承 16.1繼承 物件導向語言所擁有的特性是繼承,繼承指定義乙個新的類擁有原來類的方法。繼承最大的好處就是可以在不改變現存 的情況下新增新的方法,稱之為繼承是因為新定義的類擁有父類的所有方法。新建立的類知之為子類。繼承是乙個功能強大的特性,某些情況下如果沒有繼承,一些層序幾乎無法實現。同...