内部类的定义: 把一个类的定义写在另一个类的内部,则称里面这个类为内部类。
例如,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解除名字前缀。