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、枚舉成員。其他的都和友元類一樣。