C++嵌套類(內部類與外部類)


在一個類中定義的類被稱為嵌套類,定義嵌套類的類被稱為外部類。 對類進行嵌套通常是為了幫助實現另一個類,並避免名稱沖突。
對類嵌套往往為了幫助實現另一個類,並避免名稱沖突。如下:
    
    
    
            
  1. class queue
  2. {
  3. private:
  4. struct Node{ Item item;struct Node *next };
  5. ...
  6. };
由於struct在默認情況下其成員為公有的,    所以Node實際上是一個嵌套類。

  • 作用域
嵌套類的聲明位置決定了嵌套類的作用域,即它決定了程序的那部分可以創建嵌套類的對象。
如果嵌套類聲明在一個類的私有部分,則只有嵌套類的外部類可以知道它。上面的類就是這種情況。在queue這個類中,queue成員可以使用Node對象或Node對象的指針,但是程序的其他部分甚至不知道存在Node類。對於queue派生下來的類,也不知道Node的存在。
如果嵌套類聲明在一個類的保護部分,對於后者是可見的,對於外界是不可見的。派生類知道該嵌套類,並且可以直接創建這種類型的對象。
如果嵌套類聲明在一個類的公有部分,則允許后者,后者的派生類以及外部世界使用。然后在外部使用時,必須加上外部類的外部類作用域限制符。
   
   
   
           
  1. class team
  2. {
  3. public
  4. struct Coach{...};
  5. ...
  6. };
使用Coach時,應該這樣定義 team::Coach teach1;

嵌套結構和枚舉的作用域於此相同。許多程序員使用公有的枚舉提供客戶使用的類常量。

下面表格總結了,嵌套類、結構、枚舉的作用域特征。
聲明位置 包含它的類是否可以使用它 從包含它的類派生下來的類是否可以使用它 外部是否可以使用它
公有
私有
保護
  • 訪問權限
    在外部類中聲明嵌套類並沒有賦予外部類任何對嵌套類的訪問權限,也沒有賦予任何嵌套類對於外部類的訪問權限。與一般類的訪問控制相同(私有,公有,保護)。

  • 代碼測試
在外部類訪問嵌套類
    
    
    
            
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. i = 10; //不能訪問
  7. mytest::i = 10;//不能訪問
  8. }
  9. private:
  10. class mytest
  11. {
  12. int i;
  13. int j;
  14. };
  15. };
不能直接訪問mytest的成員,試着通過對象訪問。
    
    
    
            
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. cc.i = 10; //通過對象可以訪問,如果i為私有則不可訪問
  7. }
  8. private:
  9. class mytest
  10. {
  11. public:
  12. int i;
  13. int j;
  14. };
  15. mytest cc;
  16. };
通過測試,在外部類中聲明一個嵌套類的對象。然后再外部類中利用該對象訪問嵌套類,訪問的規則與普通類相同。

在嵌套類中訪問外部類
 因為嵌套類中沒有任何對外部類的訪問權限。因此只有在嵌套類中定義了改對象,才能夠訪問其非靜態成員,但此時外部類是一個不完整的類型(類沒有定義完成)。因此想在嵌套類內部訪問外部類是無法做到的。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM