• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C++的内嵌类

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

c++内嵌类

(2010-10-12 14:40:22)
内嵌类有两种类型:内联(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; 私有的就是只能自己用的,免得混乱 保护的就是继承类也可以

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#委托、事件剖析(上)发布时间:2022-07-14
下一篇:
C#.Net项目生成器(ibatis)使用说明发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap