在一個類中定義的類稱為巢狀類,定義巢狀類的類稱為外圍類。
定義巢狀類的目的在於隱藏類名,減少全域性的識別符號,從而限制使用者能否使用該類建立物件。這樣能夠提高類的抽象能力,並且強調了兩個類(外圍類和巢狀類)之間的主從關係。下面是個巢狀類的例子:
class A
{
public:
class B
…
private:
};
void f();
int a;
}
其中,類B是個巢狀類,類A是外圍類,類B定義在類A的類體內。
對巢狀類的若干說明:
1、從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。假如在外圍類的作用域內使用該類名時,需要加名字限定。
2、從訪問許可權的角度來看,巢狀類名和他的外圍類的物件成員名具備相同的訪問許可權規則。不能訪問巢狀類的物件中的私有成員函式,也不能對外圍類的私有部分中的巢狀類建立物件。
3、巢狀類中的成員函式能夠在他的類體外定義。
4、巢狀類中說明的成員不是外圍類中物件的成員,反之亦然。巢狀類的成員函式對外圍類的成員沒有訪問權,反之亦然。國此,在分析巢狀類和外圍類的成員訪問關係時,往往把巢狀類看作非巢狀類來處理。這樣,上述的巢狀類可寫成如下格式:
由引可見,巢狀類僅僅是語法上的嵌入。
5、在巢狀類中說明的友元對外圍類的成員沒有訪問權。
6、假如巢狀類比較複雜,能夠只在外圍類中對巢狀類進行說明,關於巢狀的周詳的內容可在外圍類體外的文件域中進行定義。
在一個類中定義的類稱為巢狀類,定義巢狀類的類稱為外圍類。
定義巢狀類的目的在於隱藏類名,減少全域性的識別符號,從而限制使用者能否使用該類建立物件。這樣能夠提高類的抽象能力,並且強調了兩個類(外圍類和巢狀類)之間的主從關係。下面是個巢狀類的例子:
class A
{
public:
class B
{
public:
…
private:
…
};
void f();
private:
int a;
}
其中,類B是個巢狀類,類A是外圍類,類B定義在類A的類體內。
對巢狀類的若干說明:
1、從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。假如在外圍類的作用域內使用該類名時,需要加名字限定。
2、從訪問許可權的角度來看,巢狀類名和他的外圍類的物件成員名具備相同的訪問許可權規則。不能訪問巢狀類的物件中的私有成員函式,也不能對外圍類的私有部分中的巢狀類建立物件。
3、巢狀類中的成員函式能夠在他的類體外定義。
4、巢狀類中說明的成員不是外圍類中物件的成員,反之亦然。巢狀類的成員函式對外圍類的成員沒有訪問權,反之亦然。國此,在分析巢狀類和外圍類的成員訪問關係時,往往把巢狀類看作非巢狀類來處理。這樣,上述的巢狀類可寫成如下格式:
class A
{
public:
void f();
private:
int a;
};
class B
{
public:
…
private:
…
};
由引可見,巢狀類僅僅是語法上的嵌入。
5、在巢狀類中說明的友元對外圍類的成員沒有訪問權。
6、假如巢狀類比較複雜,能夠只在外圍類中對巢狀類進行說明,關於巢狀的周詳的內容可在外圍類體外的文件域中進行定義。