對類嵌套往往為了幫助實現另一個類,並避免名稱沖突。如下:
class queue
{
private:
struct Node{ Item item;struct Node *next };
...
};
由於struct在默認情況下其成員為公有的,
所以Node實際上是一個嵌套類。
- 作用域
嵌套類的聲明位置決定了嵌套類的作用域,即它決定了程序的那部分可以創建嵌套類的對象。
如果嵌套類聲明在一個類的私有部分,則只有嵌套類的外部類可以知道它。上面的類就是這種情況。在queue這個類中,queue成員可以使用Node對象或Node對象的指針,但是程序的其他部分甚至不知道存在Node類。對於queue派生下來的類,也不知道Node的存在。
如果嵌套類聲明在一個類的保護部分,對於后者是可見的,對於外界是不可見的。派生類知道該嵌套類,並且可以直接創建這種類型的對象。
如果嵌套類聲明在一個類的公有部分,則允許后者,后者的派生類以及外部世界使用。然后在外部使用時,必須加上外部類的外部類作用域限制符。
class team
{
public
struct Coach{...};
...
};
使用Coach時,應該這樣定義 team::Coach teach1;
嵌套結構和枚舉的作用域於此相同。許多程序員使用公有的枚舉提供客戶使用的類常量。
下面表格總結了,嵌套類、結構、枚舉的作用域特征。
| 聲明位置 | 包含它的類是否可以使用它 | 從包含它的類派生下來的類是否可以使用它 | 外部是否可以使用它 |
| 公有 | 是 | 是 | 是 |
| 私有 | 是 | 否 | 否 |
| 保護 | 是 | 是 | 否 |
- 訪問權限
在外部類中聲明嵌套類並沒有賦予外部類任何對嵌套類的訪問權限,也沒有賦予任何嵌套類對於外部類的訪問權限。與一般類的訪問控制相同(私有,公有,保護)。
- 代碼測試
在外部類訪問嵌套類
class test
{
public:
test()
{
i = 10; //不能訪問
mytest::i = 10;//不能訪問
}
private:
class mytest
{
int i;
int j;
};
};
不能直接訪問mytest的成員,試着通過對象訪問。
class test
{
public:
test()
{
cc.i = 10; //通過對象可以訪問,如果i為私有則不可訪問
}
private:
class mytest
{
public:
int i;
int j;
};
mytest cc;
};
通過測試,在外部類中聲明一個嵌套類的對象。然后再外部類中利用該對象訪問嵌套類,訪問的規則與普通類相同。
在嵌套類中訪問外部類
因為嵌套類中沒有任何對外部類的訪問權限。因此只有在嵌套類中定義了改對象,才能夠訪問其非靜態成員,但此時外部類是一個不完整的類型(類沒有定義完成)。因此想在嵌套類內部訪問外部類是無法做到的。
