C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

C++局部类和嵌套类的区别

 局部类

  在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子。
  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、如果嵌套类比较复杂,可以只在外围类中对嵌套类进行说明,关于嵌套的详细的内容可在外围类体外的文件域中进行定义。


参考:C++编程思想和网络文章。

posted on 2007-05-24 17:20 梦在天涯 阅读(9463) 评论(1)  编辑 收藏 引用 所属分类: CPlusPlus

评论

# re: C++局部类和嵌套类的区别 2007-06-10 19:07 黄大仙

收藏  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

积分与排名

最新评论

阅读排行榜