内部类和局部类
什么是内部类
如果类A定义在类B里,那么类A就是一个内部类(也叫嵌套类)
class Person
{
class Man // 内部类
{
};
};
内部类的特点
支持三种类内权限(public、private、protected)
想要在外部使用内部类,创建内部类对象,就要设置为public权限
class Person
{
public:
class Man
{
};
};
int main()
{
Person::Man man;
getchar();
return 0;
}
如果变成private或者protected,那么在外部就不可访问了。(protected可以在子类访问)
class Person
{
protected: // private:
class Man
{
};
};
int main()
{
Person::Man man;
getchar();
return 0;
}
读到这里,相信已经可以明白内部类的特点了。那就是可以控制访问权限的一种途径,当想要控制某个类的访问权限时,就可以设置为内部类。
应用场景:某个类只用在某个类内部,不会用在外面任何地方。这种情况就可以定义为内部类。
内部类的成员函数,可以访问外部类的所有成员(包括private的)
class Person
{
private:
int m_age;
public:
class Man
{
void run()
{
Person person;
person.m_age = 10; //访问外部类私有成员
}
};
};
但是,反过来却不行,也就是外部类不可以访问内部类的私有成员。
内部类的成员函数,可以直接访问外部类的static成员
类中static静态成员的访问方式,可以看我之前的博文。
也就意味着static成员的访问,必须在对象或者类的范围下。但是内部类就不需要这种约束,可直接访问:
class Person
{
private:
static int m_age;
static void display()
{
}
public:
class Man
{
int m_height;
void run()
{
m_age = 10; // 不需要类名指定或者对象访问,直接就可以访问
display();
}
};
};
不会影响外部类的内存布局
意思就是,外部类创建对象时,对象内存空间里并没有内部类,而像以前一样,只拥有自己的成员变量。
比如下面的例子:
class Person
{
private:
int m_age;
public:
class Man // 内部类
{
int m_height;
};
};
在创建Person对象时,对象内存空间只有m_age,并没有m_height。只有在创建Person::Man对象时,该对象的内存里才有m_height。
这就叫内部类的出现,并不影响外部类对象的内存布局。
内部类声明和实现分离
- 内部类的成员函数声明和实现分离
class Person
{
private:
int m_age;
public:
class Man
{
int m_height;
void run(); //仅仅声明成员函数
};
};
void Person::Man::run() // 外部实现成员函数,注意是Person::Man::
{
Person p;
p.m_age = 10;
}
- 内部类本身声明和实现分离
class Person
{
private:
int m_age;
public:
class Man; // 仅仅声明内部类
};
class Person::Man // 内部类的实现
{
int m_height;
void run(); // 内部类成员函数的声明
};
void Person::Man::run() // 内部类成员函数的实现
{
Person p;
p.m_age = 10;
}
什么是局部类
在一个函数内部定义的类称为局部类
void test()
{
class Local
{
};
}
既然是局部类,说明这个类的使用范围只在这个函数内部,函数外部是不可以使用的。
应用场景:某个类只用于特定函数,其他地方用不到,就可以设置为局部类
局部类的特点
类内的成员函数声明和实现都要写在类内
不可以写在类外面
只能写在类里面
局部类内部不可以定义static成员变量
因为static成员变量使用前必须初始化,而且要放在类外面初始化。这在局部类是不被允许的
局部类的成员函数不可以直接访问函数的局部变量(static局部变量除外)
不允许引用封闭函数的局部变量。因为test函数调用的时候,才创建栈空间,给local_value变量内存。成员函数run调用时也开辟栈空间。一个栈空间是无法访问另一个栈空间内存的,所以会报错。
变成static局部变量就可以,因为static局部变量在整个程序运行过程中只有一份内存,不是存于栈空间,所以run函数的栈空间就可以访问该空间的static变量
局部类的出现不影响函数的内存布局
也就意味着类Local变成test函数的局部类,那么test函数在调用时,分配的栈空间里并没有局部类什么事。局部类还是存于别的内存空间,就跟定义在外部一样。
局部类的出现只影响该类的访问范围,除此以外不影响任何东西。
因为类的定义,仅仅是定义,会被放在代码区。只有创建对象的时候,才会调用类内的东西。 要理解类的定义和对象的定义的区别。
总结
-
想要类A仅仅为类B服务,那就将类A设置为类B的内部类
-
想要类A仅仅为函数C服务,那就将类A设置为函数C的局部类
-
一旦设置成内部类或者局部类,就可以访问外部类或者函数的变量了,就可以操作它们的东西,这是很方便的
-
我的理解,内部类就相当于类中的私有成员函数,仅仅为类服务,在Python中也叫静态方法。局部类也是一样的道理