一、内部类的概念
如果一个类定义在另一个类的内部,那么这个类就叫做内部类。(内部类其实和一个独立的类没有区别,只是它会受到外部类访问限定符以及类域的限制,且是外部类的友元)
如果B类是A类的内部类,sizeof(A)的结果与B类无关。
二、内部类的性质
1.内部类受外部类的访问限定符和类域限制
受到访问限定符限制(内部类B是定义在外部类A的私有访问限定符内,不能直接访问内部类)
class A {
private:
int _a1 = 1;
int _a2 = 1;
private:
class B {
private:
int _b1 = 1;
int _b2 = 1;
};
};
int main()
{
//A::B b1;//编译器报错
return 0;
}
受到类域限制(内部类B在实例化对象时受到A类域的限制)
class A {
private:
int _a1 = 1;
int _a2 = 1;
static int _a3;//类内声明
public:
class B {
private:
int _b1 = 1;
int _b2 = 1;
};
};
int A::_a3 = 1;//类外初始化
int main()
{
//B b1;//错误写法
A::B b1;//正确写法
return 0;
}
2.内部类天生是外部类的友元类
内部类可以访问外部类的私有和保护成员
class A {
private:
int _a1 = 1;
int _a2 = 1;
private:
class B {
private:
int _b1 = 1;
int _b2 = 1;
public:
void Print(A* ptra)
{
cout << ptra->_a1 << " " << ptra->_a2 << endl;
}
};
};
3.内部类访问外部类的静态成员时不需要外部类的对象或类名
内部类访问外部类的普通成员时需要通过外部类的对象或者类访问,但是内部类访问外部类的静态成员时可以直接访问,无需外部类对象或者类
class A {
private:
int _a1 = 1;
int _a2 = 1;
static int _a3;//类内声明
private:
class B {
private:
int _b1 = 1;
int _b2 = 1;
public:
void Print()
{
cout << _a3 << endl;
}
};
};
int A::_a3 = 1;//类外初始化