类可以定义在某个函数的内部,这样的类被称为局部类(local class)。 注意是定义而不是声明,这就意味着在函数内部声明这个类的同时就要进行实现,换句话说,局部类的所有数据成员和成员函数必须定义在类的内部。
局部类的使用注意事项
- 局部类的定义:局部类定义在某个函数内部,局部类中不能声明静态数据成员,但可以声明静态成员函数。
- 谁可以访问局部类(作用域):局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。当然,外部函数不能访问局部类的私有成员。
- 局部类可以访问哪些资源(访问权限):局部类只能访问外部作用域定义的类型,静态变量以及枚举成员,不能访问外部类的非静态资源,因为这个时候外部类的实例还没有被创建;局部类不能使用函数作用域中的变量。
- 局部嵌套类:在局部类的内部再嵌套一个类,这个类就是局部嵌套类。局部嵌套类的定义可以出现在局部类之外且与局部类相同的作用域中。
局部类示例
#include <iostream>
using namespace std;
class A {
public:
int a;
static int cnt;
void fun1() {cout<<"A::fun1"<<endl;}
void f()
{
//局部类
class Local{
public:
int x;
void fun2() {
cout<<"Local::fun2,cnt="<<cnt<<endl;
//cout<<"Local::fun2,a="<<a<<endl;
/*编译error:error: use of non-static data member 'a' of 'A' from nested type 'Local'*/
//cout<<"Local::fun2,x="<<x<<endl;
/*error: reference to local variable 'x' declared in enclosing function 'A::f'*/
}
void fun3();
//局部嵌套类
class LocalInner{
public:
int c;
void fun4()
{
cout<<"LocalInner::fun4,c="<<c<<endl;
}
};
};
}
};
//编译error: no member named 'Local' in 'A',因为:局部类必须定义(即实现)在函数的内部,不能在函数外部实现。
// void A::Local::fun3() {
// cout<<"Local::fun3"<<endl;
// }
void test_fun() {
//Local d; //编译error:error: unknown type name 'Local',因为:局部类定义的类型只在定义它的作用域内可见,即局部类只在定义它的函数内部有效,在函数外部无法访问局部类。
A a;
a.f();
}
int main()
{
test_fun();
return 0;
}
说明:
- Local是局部类,定义在类A的f()成员函数中;
- LocalInner是局部嵌套类,定义在局部类Local中;
- fun2和fun3是局部类Local的成员函数,必须在声明的同时进行定义;
- Local可以访问外部类A的静态数据成员cnt,不可以访问类A的非静态数据成员a,如下:
//cout<<"Local::fun2,a="<<a<<endl; //编译error:error: use of non-static data member 'a' of 'A' from nested type 'Local'
-
Local局部类不能使用函数作用域中的变量,即下面的代码会发生编译错误:
cout<<"Local::fun2,x="<<x<<endl; 编译错误:error: reference to local variable 'x' declared in enclosing function 'A::f'