和嵌套类不同,局部类的成员有严格的限制。局部类的成员全部都必须定义在类内部,包括成员函数。
不允许定义static成员。
只能访问外层作用域中的类型名、静态变量、枚举成员。
如果局部类在函数内部,不能访问函数的局部变量。
常规的访问保护规则对局部类同样适用,外层函数对局部类的私有成员没有任何访问特权 。
局部类中的名字查找,和一般的名字查找类似,现在本地作用域,再到外层作用域,……,最后到全局作用域。
int a, val;
void foo(int val){
static int si;
enum Loe { a = 1024, b};
struct Bar{ // Bar 是 foo 的局部类
Loc locVal; // 正确:使用一个局部类型名
int barVal;
void fooBar(Loc l = a){ // 正确:默认实参是Loc::a
barVal = val; // 错误:val是foo的局部变量
barVal = ::val; // 正确:使用一个全局对象
barVal = si; // 正确:使用一个静态局部对象
locVal = b; // 正确:使用一个枚举成员
}
};
}
// 局部类内部定义嵌套类
void foo ()
class Bar {
public:
//...
class Nested; // 声明Nested嵌套类
};
class Bar::Nested { // 定义Nested类,可以在局部类Bar相同作用域中定义Bar的成员。
//...
};
}