一、類的前向宣告
有種特殊情況,當兩個類需要相互引用形成乙個」環形「引用時,無法先定義使用。 這時候需要用到前向申明,但是前向申明的類不能例項化。
下面的三個圖展現了前向宣告的用法和注意的事項:
(1)class a;即前向宣告了這個a類,
此時a類被宣告而沒有被定義
(這種時候稱之為前向宣告),在宣告之後,定義之前,類a是乙個
不完整型別
。系統這個時候知道a是乙個型別,但不知道包含哪些成員。
不完全型別只能以有限方式使用,不能定義該型別的物件,不完全型別只能用於定義指向該型別的指標及引用,或者用於宣告(而不是定義)使用該型別作為形參型別或返回型別的函式。
(2)我們一般會定義乙個前向宣告類的指標,並定義乙個函式用於對這個指標進行賦值,注意我們
不能在cpp檔案中使用這個不完整型別
。二、巢狀類
所謂巢狀類,就是在類中宣告的類。如下**中,類inner就是乙個巢狀類,類outer是外圍類:
1.作用域
(1)巢狀類對於外圍類的可見性
①巢狀類僅僅是宣告在外圍類內部的型別,而不是外圍類的乙個成員
②外圍類不具備巢狀類所定義的成員
,不能通過外圍類類物件直接訪問巢狀類中的成員,只能通過巢狀類物件來訪問巢狀類的成員
③對於外圍類來說,巢狀類和其他的類沒有任何區別
;外圍類通過建立巢狀類物件來能訪問巢狀類物件的public成員,
不能訪問巢狀類物件的protected及private成員
(2)外圍類對於巢狀類的可見性
①巢狀類不具備外圍類所定義的成員
,既不能通過巢狀類物件來訪問外圍類的成員,只能通過外圍類物件來訪問外圍類的成員
②巢狀類能通過巢狀類物件來訪問外圍類的public成員,
不能訪問外圍類的protected及private成員
③巢狀類可以
直接引用外圍類的靜態成員、型別名和列舉成員
,即使這些是private的。
(3)巢狀類對於外圍類外部的可見性
①不管巢狀類在外圍類中被public、protected還是private修飾,對於外圍類而言,
外圍類任何成員都可以訪問這個巢狀類。②
但是當巢狀類在外圍類中被protected和private修飾時,不能被外圍類外部訪問
,當被public修飾時,可
通過外圍類類名
::
來訪問。2.
**解析
(1)如何實現巢狀類的成員函式
(2)外圍類外部如何建立乙個巢狀類的物件
(3)巢狀類如何訪問外圍類中的成員
?難點:
對與巢狀類來說,外圍類是乙個不完整型別
。類似前向宣告
①把外圍類的變數和函式靜態化,不管是否被private修飾,巢狀類中都可以直接訪問
②外圍類對於巢狀類來說是乙個不完整型別
,類似前向宣告,只知道有這些乙個型別並沒有定義,不知道有什麼成員變數,
可通過引數的指標、引用方式來用外圍類的成員變數和函式
③下面這種方法,在外圍類中建立巢狀類物件,而後通過外圍類物件訪問巢狀類物件,潛逃類中可計算外圍類物件的位址,最後通過該位址訪問外圍類的中成員。
(4)外圍類如何訪問巢狀類中的成員
?很簡單,直接例項化物件而後訪問。
三、區域性類
在乙個函式體內定義的類
稱為區域性類。區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域中的變數與該局部類的物件無關。區域性類不能被外部所繼承。在定義區域性類時需要注意:區域性類中不能說明靜態成員函式,並且
所有成員函式都必須定義在類體內
。在實踐中,
區域性類是很少使用
的。下面是乙個區域性類的例子。
C 回顧之前向宣告 巢狀類 區域性類
先看看什麼是前向宣告。在c 中,類需要先定義,而後才能被例項化,但是實際存在一種場景是 兩個類需要相互引用或相互成為類中的子物件成員時,就無法先定義使用,在編譯環節就出現錯誤導致編譯失敗,這時就需要用到前向宣告,此外,前向宣告的類不能被例項化。下面是例子 此段 在a.h檔案中 ifndef a h ...
區域性類和巢狀類
區域性類在乙個函式體內定義的類稱為區域性類。區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域中的變數與該局部類的物件無關。在定義區域性類時需要注意 區域性類中不能說明靜態成員函式,並且所有成員函式都必須定義在類體內。在實踐中,區域性類是很少使用的。下面是乙個區域性類的例子。in...
區域性類和巢狀類
區域性類和巢狀類 區域性類在乙個函式體內定義的類稱為區域性類。區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域中的變數與該局部類的物件無關。在定義區域性類時需要注意 區域性類中不能說明靜態成員函式,並且所有成員函式都必須定義在類體內。在實踐中,區域性類是很少使用的。下面是乙個區...