博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
局部类与嵌套类
阅读量:4141 次
发布时间:2019-05-25

本文共 1514 字,大约阅读时间需要 5 分钟。

 

 
局部类
  在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子。
  
int
 a;
  
void
 fun()
 
{
      
static int s;
     
class A
     
{
    
public:
    
void init(int i) { s = i; }
       }
;
      A m;
      m.init(
10);
  }
局部类的另一个用途是用来实现类型转化,如下代码:
class
 Interface
{
public:
   
virtual void Fun() = 0;  
}
;
template 
<
class
 T, 
class
 P
>
Interface
*
 MakeAdapter(
const
 T
&
 obj, 
const
 P
&
 arg)
{
    
int x;
   
class Local : public Interface
   
{
   
public:
      Local(
const T& obj, const P& arg)
         : obj_(obj), arg_(arg) 
{}
      
virtual void Fun()
      
{
          x 
= 100;
         obj_.Call(arg_);
      }
   
private:
      T obj_;
      P arg_;
   }
;
   
return new Local(obj, arg);
}
  
嵌套类
  在一个类中定义的类称为嵌套类,定义嵌套类的类称为外围类。
  定义嵌套类的目的在于隐藏类名,减少全局的标识符,从而限制用户能否使用该类建立对象。这样可以提高类的抽象能力,并且强调了两个类(外围类和嵌套类)之间的主从关系。下面是一个嵌套类的例子:
 
class
 A
  
{
   
public:
    
class B
    
{
    
public:
      …
    
private:
      …
    }
;
    
void f();
    
private:
    
int a;
  }
   其中,类B是一个嵌套类,类A是外围类,类B定义在类A的类体内。
  对嵌套类的若干说明:
  1、从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类的作用
域内(外?)使用该类名时,需要加名字限定。
  2、
从访问权限的角度来看,嵌套类名与它的外围类的对象成员名具有相同的访问权限规则。不能访问嵌套类的对象中的私有成员函数,也不能对外围类的私有部分中的嵌套类建立对象。
  3、嵌套类中的成员函数可以在它的类体外定义。
  4、嵌套类中说明的成员不是外围类中对象的成员,反之亦然。嵌套类的成员函数对外围类的成员没有访问权,反之亦然。
因此,在分析嵌套类与外围类的成员访问关系时,往往把嵌套类看作非嵌套类来处理。这样,上述的嵌套类可写成如下格式:
  class A
  {
  public:
    void f();
  private:
    int a;
  };
    class B
  {
    public:
    …
  private:
    …
  };
  由引可见,嵌套类仅仅是语法上的嵌入。
  5、在嵌套类中说明的友元对外围类的成员没有访问权。
  6、如果嵌套类比较复杂,可以只在外围类中对嵌套类进行说明,关于嵌套的详细的内容可在外围类体外的文件域中进行定义。

转载地址:http://ogzti.baihongyu.com/

你可能感兴趣的文章
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>