嵌套类和局部类

  

嵌套类和局部类在工作中极少使用,且均可在设计上替代,这里仅做简要介绍。
1)局部类
局部类就是将类定义在函数中,形如:
int val=100;
空白foo (int val)
{

  
 <代码> struct酒吧
  {
  
  };
  
  类酒吧:InsideClass//定义InsideClass类
  {
  
  }; 
  

}
2)嵌套类
嵌套类就是将一个类定义在另一个类中,形如:
类接口
{
公共:
虚拟空间有趣()=0;
};

模板& lt; T类,类P>
界面*人(const T&obj, const P&arg)
{
int x;
类地方:公共接口
{
公共:
本地(const T&obj, const P&arg)
: obj (obj),参数 (arg) {}
虚拟空间有趣()
{

}
私人:
T, b P
,
};
返回新的地方(obj, arg);
}

  

嵌套类必须声明在类的内部,但是可以定义在类的内部或者外部。在外层类之外定义一个嵌套类时,必须以外层类的名字限定嵌套类的名字。
嵌套类的名字只在外围类可见。
类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员。嵌套类可以访问外围类的成员(通过对象,指针或者引用)。
一个好的嵌套类设计:嵌套类应该设成私有。嵌套类的成员和方法可以设为公开。
嵌套类可以直接访问外围类的静态成员,类型名(类型),枚举值。

  

  

(内部类与外部类)
1.1作用域
嵌套类的声明位置决定了嵌套类的作用域,即它决定了程序的那部分可以创建嵌套类的对象。

  

如果嵌套类声明在一个类的私有部分,则只有嵌套类的外部类可以知道它。上面的类就是这种情况。

  

如果嵌套类声明在一个类的保护部分,对于后者是可见的,对于外界是不可见的。派生类知道该嵌套类,并且可以直接创建这种类型的对象。

  

如果嵌套类声明在一个类的公有部分,则允许后者,后者的派生类以及外部世界使用,然后在外部使用时,必须加上外部类的外部类作用域限制符,如:使用NestedClass时,应该这样定义远胜于::NestedClass nestedInstance。

  

嵌套结构和枚举的作用域于此相同。许多程序员使用公有的枚举提供客户使用的类常量。

  

下面表格总结了,嵌套类,结构,枚举的作用域特征。

  

1.2访问权限
在外部类中声明嵌套类并没有赋予外部类任何对嵌套类的访问权限,也没有赋予任何嵌套类对于外部类的访问权限。与一般类的访问控制相同(私有,公有,保护)。

  


局部类
类可以定义在某个函数的内部,这样的类被称为局部类,局部类定义的类型只在定义它的作用域内可见。
局部类不能使用函数作用域中的变量。
局部类已经封装在函数作用域中,通过信息隐藏进一步封装就显得没什么必要了。
可以在局部类的内部再嵌套一个类,此时,嵌套类的定义可以出现在局部类之外且与局部类相同的作用域中。

  

(c++不能在函数中定义函数c + +在类中定义的函数也就是成员函数。)这个类以及由它创建的对象,都局限在该函数作用域中;必须在类内实现所有的成员函数,不能拿到类外,因为函数是不可以嵌套定义的;若类内含有静态数据成员,必须在该函数外初始化;类内不可含有静态函数成员;类中不可使用包裹它的函数所定义的除静态外的局部变量。

  

c++内部类与java内部类的区别就是:
c++的内部类对象没有外部类对象的指针,不能访问外部类对象的非静态成员;java的非静态内部类对象有外部类对象的指针,能访问外部类对象的非静态成员。

  

1局部类演示示例
int;
空白有趣()
{
静态int年代;
a
{
公共:
空白init (int i) {s=i;}
}; m
,
m.init (10);
}

  

2局部类的另一个用途是用来实现类型转化界面

类{
公共:
虚拟空间有趣()=0;
};

模板& lt; T类,类P>
界面* MakeAdapter (const T&obj, const P&arg)
{
int x;
类地方:公共接口
{
公共:
本地(const T&obj, const P&arg)
: obj (obj),参数 (arg) {}
虚拟空间有趣()
{
x=100,
obj 打电话给(arg) ,
}
私人:
T obj ,
P参数
,
};
返回新的地方(obj, arg);
}

  

。内嵌类
是在类体内定义的又一个类。外面的类叫外围类。这个类以及由它创建的对象,都局限在外层类作用域中;

  

外界能否使用内层类,全在于访问权限;若能使用,定要以外围类::内层类格式来用;

嵌套类和局部类