C++之內部類

1. 內部類的概念

如果一個類定義在另一個類的內部,這個內部類就叫做內部類。注意此時這個內部類是一個獨立的類,它不屬於外部類,更不能通過外部類的對象去調用內部類。外部類對內部類沒有任何優越的訪問權限。

即說:內部類就是外部類的友元類。注意友元類的定義,內部類可以通過外部類的對象參數來訪問外部類中的所有成員。但是外部類不是內部類的友元。

 

2. 內部類可以定義在外部類的public、protected、private都是可以的。

如果內部類定義在public,則可通過 外部類名::內部類名 來定義內部類的對象。

如果定義在private,則外部不可定義內部類的對象,這可實現“實現一個不能被繼承的類”問題。

 

3. 注意內部類可以直接訪問外部類中的static、枚舉成員,不需要外部類的對象/類名。

class A
{
private: static int k;
               int h;
public: class B{
                     void foo(){
                           cout<<k<<endl;//OK
                           //cout<<h<<endl;//ERROR
                     }
              };
};
int A::k=3;

這裏cout<<h<<endl;是一個非常常見的錯誤。因爲內部類是一個獨立的類,不屬於外部類,所以此時還沒有外部類的對象,顯然也不存在h。而k就不同了,不需要外部類的對象就已存在,所以這裏k是OK的。

這和友元類的使用也是同樣的道理。“想要使用另一個類的成員,必須要存在這個類的對象”。

class A
{
private: static int k;
               int h;
public: class B{
                     void foo(A a){
                           cout<<k<<endl;//OK
                           cout<<a.h<<endl;//OK
                     }
              };
};
int A::k=3;

這樣就沒問題了。

 

4. 在堆中創建內部類對象:

class A
{
public: class B{};
};
int _tmain(int argc, _TCHAR* argv[])
{
       A::B*b=new A::B();
       return 0;
}

5.內部類可以現在外部類中聲明,然後在外部類外定義:

class A
{
private: static int i;
public: class B;
};
class A::B{
public:void foo(){cout<<i<<endl;}//!!!這裏也不需要加A::i.
};
int A::i=3;

 這形式上就更像友元類了。注意這裏和友元類,不要混淆了。

 

6. sizeof(外部類)=外部類,和內部類沒有任何關係。

class A
{
public:
       class B{int o;};
};
int _tmain(int argc, _TCHAR* argv[])
{
       cout<<sizeof(A)<<endl;//1
       return 0;
}


總結一下:其實內部類和友元類很像很像。只是內部類比友元類多了一點權限:可以不加類名的訪問外部類中的static、枚舉成員。其他的都和友元類一樣。

發佈了45 篇原創文章 · 獲贊 32 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章