先看看什麼是前向聲明。在C++中,類需要先定義,而後才能被實例化,但是實際存在一種場景是:兩個類需要相互引用或相互成為類中的子對象成員時,就無法先定義使用,在編譯環節就出現錯誤導致編譯失敗,這時就需要用到前向聲明,此外,前向聲明的類不能被實例化。下面是例子:
//此段代碼在A.h文件中 #ifndef _A_H #define _A_H #include "B.h" class A { public: A(void); ~A(void); B b_; //A類中包含B類對象 }; #endif //下面代碼在B.h文件中 #ifndef _B_H #define _B_H /*B類包含A類對象,A類又包含B類對象時,頭文件也互相包含,這是不允許的,需要前向聲明: 在B.h中將A類前向聲明,此時就不再需要包含A.h頭文件,且B中不能有A類的對象,因為前向聲明的類不能被實例化,但是可以是A類的指針或者引用*/ //#include "A.h" class A; class B { public: B(void); ~B(void); //A a_; //前向聲明後,B類中不能含有A的對象 A *a_; //可以是指針 void Fun(A &a ) //可以是引用 { } }; #endif
嵌套類
顧名思義,嵌套類就是在類體中再定義另外一個類,形成類中類的情況。我們將最外層定義的類稱為外圍類,外圍類內部再定義的類稱為嵌套類。嵌套類的主要作用是為外圍類提供服務的,外圍類可以使用嵌套類對象作為外圍類的底層實現,同時可以對用戶隱藏該底層的實現。
嵌套類需要注意的幾點:
(1) 作用域上,嵌套類是定義在外圍類內部的,所以該類名只能在外圍類內部使用,如果在外圍類外部使用該類名時,需要加名字限定,如Out::Inner i;
(2) 嵌套類中的成員函數可以在它的外部定義。
(3) 嵌套類的成員函數對外圍類的數據成員沒有訪問權,反之亦然。因為嵌套類僅僅是語法上的嵌入,它與外圍類實際上是平級的。
下面是嵌套類的簡單例子:
class Outer //外圍類 { public: class Inner { public: void Fun() //也可以定義在外部 //{ // cout << "Inner::Fun()"<
局部類.
局部類是指在函數內部定義的類,這樣的類稱為局部類local class.局部類只在定義它的局部域內是可見的。此外,局部類的成員函數必須定義在類體中,並且不能有靜態成員。下面是例子:
void Fun() { //局部類,只在函數內部有效 class LocalClass { public: int a_; void Init(int &a ) //只能在類體中定義. { a_ = a; } //static int b_; //Error,局部類不能定義static靜態數據成員. }; LocalClass lc; lc.Init(10); } int main() { Fun(); LocalClass lc; //Error, 局部類在函數外部不可用。 }