一、内部类的概念
如果一个类定义在另一个类的内部,那么这个类就叫做内部类。(内部类其实和一个独立的类没有区别,只是它会受到外部类访问限定符以及类域的限制,且是外部类的友元)
如果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;//类外初始化