C++在类的内部定义的类,叫做内部类,其实这种类本质上没什么特别之处,只不过包含在一个类的作用域中了。
从外部类的角度来看,内部类只不过是一个特殊的成员而已,跟一个namespace中看一个类一样,外部类中的方法只能访问内部类中的public成员(前提是要有内部类的对象或者访问内部类中的static成员)。
反过来,从内部类看外部类,因为内部类属于外部类的一个成员,所以对外部类的成员访问没有限制(这就跟一个类中的成员函数访问类中的任何成员变量一样没有访问权限的限制)。
但是,默认情况下,内部类得不到外部类的对象(内部类的this默认指向的是由内部类构造的对象),所以无法访问外部类中非static成员(由于static成员是属于外部类的,所以访问外部类中的static成员是没问题的)。
然而,如果给内部类的方法传递一个外部类成员的对象(变量,指针或者引用),内部类就可以访问外部类中的非静态成员了。
从这个意义上来说,内部类没有特殊之处,只不过是外部多了一层作用域的限制。
class Outter{
public:
void Inner_access1();
void Inner_access2(Inner &);
private:
int a;
static int s_a;
class Inner{
public:
int b;
static int s_b;
void Outter_access1();
void Outter_access2(Outter &);
private:
char ch;
}
}
//构造对象
int Outter::s_a{1};
int Outter::Inner::s_b{2};
Outter OA{};
Outter::Inner IB{};
//外部类访问内部类的函数
void Outter::Inner_access1(){
std::cout << b //错误,无法访问内部类public的非static成员,因为没有内部类对象
<< ch //错误,无法访问内部类private的成员,因为没有内部类对象,也没有访问权限
<< s_b;
//OK,因为外部类有权访问内部类的public成员,s_b是static,不需要内部类对象即可访问
}
void Outter::Inner_access2(Inner & A){
std::cout << A.b //OK,外部类有权访问内部类public成员,且通过对象的引用访问
<< A.ch //错误,外部类无法访问内部类private成员,即使通过对象
<< A.s_b;//OK,外部类有权访问内部类的public的静态成员
}
//内部类访问外部类的函数
void Outter::Inner::Outter_access1(){
std::cout << a //错误,内部类没有外部类的对象,不能访问非static的成员
<< s_a; //OK,内部类可以访问外部类static成员,即使没有外部类的对象
}
void Outter::Inner::Outter_access2(Outter & B){
std::cout << B.a //OK,内部类可以通过外部类的对象来访问外部类的private非静态成员
<< B.s_a; //OK,内部类可以访问外部类的static成员
}
int main(){
OA.Inner_access1(); //Error
OA.Inner_access2(IB); //Error
IB.Outter_access1(); //Error
IB.Outter_access2(OA); //OK
return 0;
}