定义:
在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,但嵌套类对外围类成员的访问有所不同。
若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。
之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
#include<iostream>
class Outer {
public:
class Inner {
public:
void process(const Outer&);
static int static_elem;
private:
//Outer::Inner2 val; //error
int elem;
//Outer outer; //error,不允许使用不完整类
};
void process(const Inner& inner){
//std::cout << inner.elem << std::endl; // error;
}
private:
int val;
};
// 类外声明方式,不允许在Outer类内定义Inner的成员函数
void Outer::Inner::process(const Outer& outer) {
std::cout << outer.val << std::endl; //val 是私有的,但ok
}
int Outer::Inner::static_elem = 0; // 嵌套类中static成员类外定义方式