引言

在 C++ 編程中,內部類(也稱為嵌套類)是一個定義在另一個類作用域內的類

內部類提供了一種封裝和邏輯分組的方式,使得代碼更加模塊化和易於管理。

本文將詳細介紹 C++ 中內部類的定義、使用場景、訪問權限及其與外圍類(外部類)的相互作用。

目錄

引言

🍃內部類的定義

🍃內部類與外部類的相互作用

1.內部類訪問外部類的成員:

2.外部類訪問內部類的成員:

🍃內部類的使用場景

結語


🍃內部類的定義

內部類是在一個類的成員部分定義的另一個類。

內部類是⼀個獨立的類,跟定義在 全局相比,他只是受外部類類域限制和訪問限定符限制,所以外部類定義的對象中不包含內部類。

  • 計算外部類對象的大小就不會將內部類的成員包括在內

簡單來説內部類與外部類的關係就是:(劃重點)

內部類是外部類的友元類,但外部類不是內部類的友元類,並且內部類受到外部類類域限制和訪問限定符限制。

🍃內部類與外部類的相互作用

1.內部類訪問外部類的成員:

簡單來説:內部類默認是外部類的友元類

        <1>內部類可以定義在外部類的public、protected、private中都是可以的。

        <2>內部類可以直接訪問外部類中的static、枚舉成員、不需要外部類的對象名。

        <3>內部類訪問外部類的普通成員,需要藉助外部類對象(否則無法得知訪問的是哪一個對象的)

 例如:

#include <iostream>  
using namespace std;
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的。

想要在內部類訪問外部類的普通成員,就需要通過外部類對象的方式,比如下方代碼,傳遞一個外部類對象作為參數就可以訪問外部類成員

#include <iostream>  
using namespace std;
class A
{
private: static int k;
       int h;
public: class B {
    void foo(const A& a ) 
    {
        cout << k << endl;//外部類的靜態成員,內部類可以直接訪問
        cout<<a.h<<endl;//外部類的普通成員,內部類需要藉助外部類對象訪問
    }
};
};
int A::k = 3;

2.外部類訪問內部類的成員:

內部類不屬於外部類,更不能通過外部類的對象去調用內部類。外部類對內部類沒有任何優越的訪問權限。

內部類在定義它的外圍類的作用域內是可見的,但在外圍類外部是不可見的。 

  • 假如內部類受外部類公有限定符限制,需要通過外部類限定符限定的方式創建內部類對象
  • 假如內部類是受外部私有或保護限定符限制,那麼在類外無法創建內部類的對象(如果你不想外部可以創建內部類的對象,就可以這麼做)
  • 外部類無法訪問內部類的私有成員
#include<iostream>
using namespace std;
class A
{
private:
    static int _k;
    int _h = 1;
public:
    class B // B默認就是A的友元

    {
    public:
        void foo(const A& a)
        {
            cout << _k << endl; //OK
            cout << a._h << endl; //OK
        }
    private:
        static int a;
    };
    void fun()
    {
        //cout << B::a << endl;
        //外部類無法訪問內部類的私有成員
    }
    
};
int A::_k = 1;
int main()
{
    
    A::B b;//假如內部類受外部類公有限定符限制,可以這樣創建內部類對象
    A aa;
    
    return 0;
}

🍃內部類的使用場景

  1. 封裝和隱藏實現細節:內部類可以隱藏實現細節,使得外圍類的接口更加簡潔。————內部類本質也是⼀種封裝,當A類跟B類緊密關聯,A類實現出來主要就是給B類使用,那麼可以考 慮把A類設計為B的內部類,如果放到private/protected位置,那麼A類就是B類的專屬內部類,其他地方都用不了
  2. 實現輔助類內部類可以作為外圍類的輔助類,用於實現一些具體的功能,而不影響外圍類的整體結構。
  3. 避免命名衝突:通過內部類,可以避免不同命名空間或類中的命名衝突。
  4. 訪問權限控制:內部類可以更好地控制對特定成員或方法的訪問權限。

結語

C++ 中的內部類提供了一種靈活的方式來封裝和隱藏實現細節,使得代碼更加模塊化和易於管理。

通過內部類,可以更好地控制訪問權限,避免命名衝突,並實現輔助類來支持外圍類的功能。

理解內部類的定義、訪問權限及其與外圍類的相互作用,對於編寫高質量的 C++ 代碼至關重要。