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