嵌套类,局部类,联合

 
嵌套类
 
   在一个类的内部定义另一个类,我们称之为嵌套类(nested class),或者嵌套类型。之所以引入这样一个嵌套类,往往是因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。
 
   虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此,它们都遵循普通类所具有的标号访问控制。
 
   若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员就是这样的一个例子。
 
   前面说过,之所以使用嵌套类的另一个原因是达到底层实现隐藏的目的。为了实现这种目的,我们需要在另一个头文件中定义该嵌套类,而只在外围类中前向声明这个嵌套类即可。当然,在外围类外面定义这个嵌套类时,应该使用外围类进行限定。使用时,只需要在外围类的实现文件中包含这个头文件即可。
 
   另外,嵌套类可以直接引用外围类的静态成员、类型名和枚举成员,即使这些是private的。
 
局部类
 
   除了前面的嵌套类,还有一种特殊的类,那就是局部类。局部类(local class)是指定义在函数体内部的类。局部类的所有成员必须完全定义在类定义体内部,这点不如其它类灵活。也因此,不能定义static数据成员。局部类可以访问的外围作用域中的名字也是有限的,只能访问在外围作用域中定义的类型名、static变量和枚举成员,不能使用定义该类的函数中的变量(但可以使用全局变量)。 局部类也可以有嵌套类,这种嵌套类本身也是局部类,遵守局部类的限制。当然,很少使用这种类类型。
 
联合
 
   联合(union)是一种特殊的类,很少用但很有用。从C中继承而来,其基本语义没有发生变化,只是具有了类的特性而已。
 
   union可以指定访问控制标号使成员有不同的访问权限,默认情况下,与struct具有一样的权限(public)。union也可以定义成员函数,包括构造函数和析构函数;但是,它不能作为基类使用,成员函数不能为虚函数。union也不能有静态数据成员或引用成员,而且,union不能有定义了构造函数、析构函数或者赋值操作符的类类型的成员。
 
   像其他内置类型一样,默认情况下union对象是未初始化的。可以用与显式初始化简单类(C-style初始化结构体方法)一样的方法显式初始化union对象。但是,只能为第一个成员提供初始化式。该初始化式必须括在一对花括号中。例如:
   union TypeValue {
      char ch;
      int  i;
      double d;
   };
   TypeValue tv = {'a'};
 
   由于union对象内部成员共用一段空间,如果使用不当可能产生错误,如错误地使用当前有效成员。为了避免这类错误,往往把union嵌套在一个类中,该类附加一个枚举成员,用来指明union成员中当前哪个成员有效。当然,带来安全的同时,也带来了额外的开销。因为这需要每次使用时进行判断,特别是当union内成员较多时,这就显得繁琐了。
 
   一个比较特殊的union类别是匿名联合(anonymous union),也就是未命名的union。因为匿名union不提供访问其成员的途径,所以其成员将作为定义匿名union的作用域的一部分直接访问,即匿名union的成员的名字出现在外围作用域中。也因此,匿名union不能有私有成员或者保护成员,也不能定义成员函数(因为这些的基本语义都需要通过对象的特殊形式访问,所以此时没有必要存在)。
 

参考文献:
[1] C++ Primer(Edition 4)
[2] Thinking in C++(Edition 2)
[3] International Standard:ISO/IEC 14882:1998
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值