嵌套类nested class,即在外围包括类enclosing class 内定义一个类。嵌套类的名字在外围类中可见。外围类对嵌套类的成员无特殊访问权,反之也是。 如果外围类是一个模版,那么嵌套类也是一个模版。
嵌套类的构造函数最好在其类外定义
template <class T>
Outter<T>::Inner::Inner(const T&t)
|
通常将嵌套类定义在外围类的private成员里,这样嵌套类的全部成员可以定义为public,省去了定义友元函数。嵌套类和外围类可以分别定义,放在不同的头文件之中。
template <class T> class Outter{
private:
struct Inner;
}
template <class T> Outer::struct Inner{
//
}
|
在看到嵌套类完整定义之前,外围类是不完整类型。
嵌套类如有静态成员,也需要放在外层作用域中。
template <class T>
int Outter<T>::Inner::static num=128;
|
外围类的对象只有外围类中定义的数据成员,静态类也是如此。外围类可以通过定义指向嵌套类的指针或引用访问嵌套类的数据成员。
当有语句 Outter
时,只实例化了一个外围类对象,并没有实例化嵌套类对象即使外围类含有指向嵌套类成员的指针或引用。只有用到嵌套类对象时才会实例化它,比如通过指向嵌套类的指针或引用操作。
对嵌套类名字的查找会在普通类之前进行。编译器会首先处理外围类的嵌套类。
class out{
public:
int i;
class in{
public:
int s;
in(){s=i;};
};
};
|
报错 `class out::in' has no member named `i'。
局部类 local class 指定义在函数体内的类,受到的保护限制比嵌套类要多,只在局部作用域可见,所有成员函数必须定义在类体内。局部类只能看到外围函数内定义的类型名,静态变量和枚举,外围函数的局部变量是看不到的。
void func(){
int i;
//enum loc {a=129;b};
class in{
public:
int s;
//loc d;
in():s(i){};
};
}
|
报错 practice.cpp:40: use of `auto' variable from containing function
practice.cpp:34: `int i' declared here
改为static int i;即可。枚举在此不知原因编译不过。
通常局部类所有成员均为public,没有必要为私有,还得需友元。
阅读(606) | 评论(0) | 转发(0) |