嵌套类(嵌套类、结构和枚举的作用域特征——图)

来源:互联网 发布:win7指纹加密软件 编辑:程序博客网 时间:2024/04/29 09:45

嵌套类

 

    在另一个类中声明的类被称为嵌套类(nested class),它通过提供新的类型类作用域来避免名称混乱。包含类的成员函数可以创建和使用被嵌套类的对象;而仅当声明位于公有部分,才能在包含类的外面使用嵌套类,而且必须使用作用域解析操作符。

 

class Queue
{
// class scope definitions
  // Node is a nested class definition local to this class
  class Node
  {
   public:
     Node():
  };
  ...
};

 

定义嵌套类的方法,必须指出Node类是在Queue类中定义的:
Queue::Node::Node(){...}

 

嵌套类和访问权限

 

1.作用域
    如果嵌套类是在另一个类的私有部分声明的,则只有后者知道它。比如上面的Node类就是声明在Queue类的私有部分(类的默认访问权限是私有),因此Queue成员可以使用Node对象和指向Node对象的指针,但是程序的其他部分甚至不知道Node类的存在。
    对于从Queue类派生而来的类,Node类也是不可见的,因为派生类不能直接访问基类的私有部分。

 

    如果嵌套类是在另一个类的保护部分声明的,则它对于后者来说是可见的。,但是对于外部世界则是不可见的。不过这时,Queue的派生类将知道嵌套类,并可以直接创建这种类型的对象。

 

    如果嵌套类是在另一个类的公有部分声明的,则允许后者、后者的派生类以及外部世界使用它。不过,外部世界使用它时,必须使用类限定符。例如:
Queue::Node classA;  // create a classA object outside the Queue class

 

(嵌套结构和枚举的作用域与此相同)

 

 

 

嵌套类作用域特征

 

 

2.访问控制
    上面例子Queue类声明中声明Node类并没有赋予Queue类任何对Node类的访问特权,也没有赋予Node类任何对Queue类的访问特权。因此,Queue类对象只能显示地访问Node对象的公有成员。

     简而言之,类声明的位置决定了类的作用域或可见性。类可见后,访问控制规则(公有、保护、私有、友元)将决定程序对嵌套类成员的访问权限。

 

模板中的嵌套

和类模板一样,除非编译器实现了新的export关键字,否则应将类模板和方法函数模板放置一个头文件中:
template <class Item>
class QueueTP
{ class Node
  { public:
      Item item;
      Node();
      ...
  };
 public:
   QueueTP();
  ...
};

 

template <class Item>
QueueTP<Item>::QueueTP() { ... }


template <class Item>
QueueTP<Item>::Node::Node() { ... }

     (Node是利用通用类型Item来定义的)

原创粉丝点击