C++嵌套类
1.什么是嵌套类
将一个类的定义放到另一个类中,这个类就叫嵌套类
2.嵌套类的作用域(可见性)
嵌套类的作用域与定义的位置有关
I>声明在私有区域(private)
仅在外围类内部可见
也就是说,这种情况下,嵌套类的实例化对象可以当作外围类的数据成员,也可当作外围类的成员函数的参数或者在成员函数内部实例化。
class Outer {
private:
class Inner {
...
};
Inner objInner; //第一处
...
public:
void f(Inner &Inner); //第二处
void g();
...
};
void Outer::g() {
Inner objInner; //第三处
...
}
第一处:嵌套类的实例化对象作为外围类的成员
第二处:嵌套类的实例化对象作为外围类成员函数的参数
第三处:嵌套类的实例化对象作为外围类成员函数的局部变量
II>声明在保护区域(protected)
仅在外围类和外围类的派生类内部可见
这种情况下,嵌套类的实例化对象可作为在外围类及外围类的派生类的成员,以及它们的成员函数的参数或者在它们的成员函数内部实例化。
class Outer {
protected:
class Inner {
...
};
...
};
class Derived :public Outer {
Inner objInner; //派生类可见
...
};
除了private可见的地方,还有派生类中可见。
III>声明在公有区域(public)
外围类内、外部均可见
这种情况下,嵌套类和外围类没有明显区别,可以在类外实例化,但是要通过域解析运算符 外围类::嵌套类 实例化对象名。
class Outer {
public:
class Inner {
...
};
...
};
int main() {
Outer::Inner obj; //在类的外部实例化嵌套类
...
return 0;
}
总结:嵌套类、结构和枚举的作用域特征
声明位置 | 包含它的类是否可以使用它 | 从包含她的泪派生而来的类是否可以使用它 | 类的外部是否可以访问它 |
---|---|---|---|
私有部分 | 是 | 否 | 否 |
保护部分 | 是 | 是 | 否 |
公有部分 | 是 | 是 | 是 |
2.嵌套类与外围类的关系
I>作用域(上面已经总结)
II>嵌套类是外围类的友元类
class Outer {
private:
int data;
public:
Outer(int data) : data(data) {}
class Inner {
public:
void showOuter(Outer &obj);
};
};
void Outer::Inner::showOuter(Outer &obj) {
cout << obj.data << endl;
}
int main() {
Outer objo(3);
Outer::Inner obji;
obji.showOuter(objo);
return 0;
}
输出:
3
注意:嵌套类仅仅是友元而已,它不属于外围类,也就是说,在访问时必须给它传一个外围类的对象
III>外围类不能直接访问嵌套类
要想访问嵌套类的私有成员,嵌套类必须提供公有接口,外围类只能通过共有接口间接访问嵌套类私有成员。
3.理清关系
I>嵌套类和外围类是两个类,只不过嵌套类声明在外围类里面
II>嵌套类是外围类的友元类
III>嵌套类的可见性与在外围类中声明的位置有关
如果在public区域声明,这种情况下相当于在一个命名空间声明了一个类