內部類的定義: 把一個類的定義寫在另一個類的內部,則稱裏面這個類爲內部類。
例如,Inner就是
class AAA{
public:
class Inner
{
public:
char name[64];
}
}
在使用該內部類時,類名要使用全程 AAA::inner。除此之外,內部類和普通類沒有任何區別。
內部類和外部類互相沒有特權, 他們不是朋友關係,他們不是父子關係,他們沒有任何關係。
所以,外部類無法自由訪問內部類,內部類也無法自由訪問外部類。
如果內部類被 protected/private限制,則該類在外部不可見。(類名被完全隱藏)
既然內部類和普通類並無區別,那爲什麼要把它寫在另一個類的內部呢?
原因:
(1)避免名字衝突
(2)如果一個類只是在模塊內部使用,則可以實現類名隱藏
當項目越來越大,避免類名的衝突成爲一個現實存在的問題。。。將一些只在模塊內部使用的類,寫成內部類
注:內部類還可以再定義內部類,沒有層數限制,但一般就寫兩層
名字空間
解決名字衝突的終極手段:namespae,名字空間
語法爲:
namespace XXX
{
//把類名和函數寫在這個大括號裏面
class YYY
{
};
} <-這裏不需要分號
使用namespace中的名字加上一個名字前綴
XXX::YYY obj;
XXX::Test();
解除前綴:using關鍵字
如果覺得每次加上前綴麻煩,可以用using關鍵字來解除前綴。(確定不會產生名字衝突)
using namespace XXX; //使用XXX裏面的所有名字
using XXX::YYY; //只使用XXX裏面的一個名字YYY
注:在某些第三方庫中是有namespace的,因此我們在使用這些庫的時候,要確定要不要用using解除名字前綴。