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、枚舉成員。其他的都和友元類一樣。
https://www.cnblogs.com/aademeng/articles/7264696.html