引言
在 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;
}
🍃內部類的使用場景
- 封裝和隱藏實現細節:內部類可以隱藏實現細節,使得外圍類的接口更加簡潔。————內部類本質也是⼀種封裝,當A類跟B類緊密關聯,A類實現出來主要就是給B類使用,那麼可以考 慮把A類設計為B的內部類,如果放到private/protected位置,那麼A類就是B類的專屬內部類,其他地方都用不了
- 實現輔助類:內部類可以作為外圍類的輔助類,用於實現一些具體的功能,而不影響外圍類的整體結構。
- 避免命名衝突:通過內部類,可以避免不同命名空間或類中的命名衝突。
- 訪問權限控制:內部類可以更好地控制對特定成員或方法的訪問權限。
結語
C++ 中的內部類提供了一種靈活的方式來封裝和隱藏實現細節,使得代碼更加模塊化和易於管理。
通過內部類,可以更好地控制訪問權限,避免命名衝突,並實現輔助類來支持外圍類的功能。
理解內部類的定義、訪問權限及其與外圍類的相互作用,對於編寫高質量的 C++ 代碼至關重要。