内嵌类

内嵌类有两种类型:内联(inner)类和静态内嵌(static nested)类。
主要的区别:
一、内联类可以访问定义在外围类(enclosing class)中的实例变量。静态内嵌类不可以。

二、内联类是完全封装在外围类中的。而静态内嵌类可以被外部代码使用,只要不是private的。如静态内嵌类Entry用来遍历Map对象中的key-value对。在Map之外的代码上下文,需要用Map.Entry来引用这个类。

因此,将内嵌类声明为静态的首要原因是,让其他类可以使用它。虽然可以将类声明为顶层类(top-level,也就是非内嵌类),但可能希望把他紧密地绑定在容器类中。例如Map.Entry被紧密地绑定到Map;因为如果缺少Map,Entry类就没有存在的意义。
第二个原因是,允许将其序列化。不能序列化内联类对象,因为他们能够访问外围类的实例变量。



嵌套类的使用本质上应基于概念分级。比如我要定义一个Class Tree,另外我还要定义一个树叉类,Class Branch不是好的选择,因为它有二义性,可能是树叉,也可能是河叉,但Class Tree_Branch又显得啰嗦,好的选择是使用嵌套类:
class Tree
{
public:
class Branch
{
...
};
};

class River
{
public:
class Branch
{
...
};
};

如果你需要在class Tree或Class River成员函数之外访问Class Branch,你就应该象上面那样将嵌套类申明成Public。访问树叉时应该写成Tree::Branch,访问河叉则应写成River::Branch,此时,外层的类实际上起名称空间的作用,以区别树叉和河叉并非同一回事。
如果只在外层类的成员函数中访问嵌套类,则应该象下面这样申明成Private或Protected:
class Tree
{
private:
class Branch
{
...
};
};

例:stl迭代器 vector<int>::iterator it; for (it = v.begin(); it != v.end(); it++) cout << *it; 私有的就是只能自己用的,免得混乱 保护的就是继承类也




参考:http://www.cnblogs.com/kyleada/archive/2011/05/19/2051243.html

http://www.cnblogs.com/charley_yang/archive/2011/04/05/2005897.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值