04 前向宣告 巢狀類 區域性類

2021-08-21 11:18:32 字數 2676 閱讀 8378

一、類的前向宣告

有種特殊情況,當兩個類需要相互引用形成乙個」環形「引用時,無法先定義使用。 這時候需要用到前向申明,但是前向申明的類不能例項化。

下面的三個圖展現了前向宣告的用法和注意的事項:

(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...

區域性類和巢狀類

區域性類和巢狀類 區域性類在乙個函式體內定義的類稱為區域性類。區域性類中只能使用它的外圍作用域中的物件和函式進行聯絡,因為外圍作用域中的變數與該局部類的物件無關。在定義區域性類時需要注意 區域性類中不能說明靜態成員函式,並且所有成員函式都必須定義在類體內。在實踐中,區域性類是很少使用的。下面是乙個區...