一、局部类概述
- 类可以定义在某个函数的内部,我们称这样的类为局部类
- 局部类的一些特点:
- 局部类定义的类型只在定义它的作用域内可见
- 在实际编程中,因为局部类的成员必须完整定义在类的内部(不能在局部类声明函数,然后在局部类外进行定义,这是错误的),所以成员函数的复杂性不建议设置太高
- 类似的,在局部类中也不允许声明静态数据成员,因为我们无法定义这样的成员
二、局部类不能使用函数作用域中的变量
- 局部类对变量访问的规则:
- 局部类只能访问:外层作用域定义的类型名、静态变量、枚举成员
- 如果局部类定义在某个函数内部,则该函数的普通局部变量不能被改局部类使用
- 例如:
int a, val;
void foo(int val)
{
static int si;
enum Loc { a = 1024, b };
struct Bar
{
Loc locVal; //正确,使用一个局部类型名
int barVal;
void fooBar(Loc l = a)
{
//barVal = val; //错误,val是foo函数的局部变量
barVal = ::val; //正确,使用全局变量
barVal = si; //正确,使用静态局部变量
locVal = b; //正确,使用一个枚举成员
}
};
}
三、常规的访问保护规则对局部类同样适用
- 访问规则如下:
- 外层函数对局部类的私有成员没有任何访问特权
- 当然,局部类可以将外层函数声明为友元;或者更常见的情况是局部类将其成员声明为公有的
- 在程序中有权访问局部类的代码非常有限。局部类已经封装在函数作用域中,通过信息隐藏进一步封装就显得没什么必要了
四、局部类中的名字查找
- 局部类内部的名字查找次序与其他类类似
- 在声明类的成员时,必须先确保用到的名字位于作用域中,然后再使用改名字
- 定义成员时用到的名字可以出现在类的任意位置(但是不能使用局部变量):
- 如果某个名字不是局部类的成员,则继续在外层函数作用域中查找
- 如果还没有找到,则在外层函数所在的作用域中查找
五、嵌套的局部类
- 可以在局部类的内部再嵌套一个类
- 此时,嵌套类的定义可以出现在局部类之外。不过,嵌套类必须定义在与局部类相同的作用域中
void foo()
{
class Bar
{
public:
class Nested; //声明
};
class Bar::Nested {}; //定义
}
- 局部类内的嵌套类也是一个局部类,必须遵守局部类的各种规定。嵌套类的所有成员都必须定义在嵌套类内部