在一个类中定义的类被称为嵌套类,定义嵌套类的类被称为外部类。对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。

对类嵌套往往为了帮助实现另一个类,并避免名称冲突。如下:
  1. class queue
  2. {
  3. private:
  4. struct Node{ Item item;struct Node *next };
  5. ...
  6. };
由于struct在默认情况下其成员为公有的,   所以Node实际上是一个嵌套类。

  • 作用域
嵌套类的声明位置决定了嵌套类的作用域,即它决定了程序的那部分可以创建嵌套类的对象。
如果嵌套类声明在一个类的私有部分,则只有嵌套类的外部类可以知道它。上面的类就是这种情况。在queue这个类中,queue成员可以使用Node对象或Node对象的指针,但是程序的其他部分甚至不知道存在Node类。对于queue派生下来的类,也不知道Node的存在。
如果嵌套类声明在一个类的保护部分,对于后者是可见的,对于外界是不可见的。派生类知道该嵌套类,并且可以直接创建这种类型的对象。
如果嵌套类声明在一个类的公有部分,则允许后者,后者的派生类以及外部世界使用。然后在外部使用时,必须加上外部类的外部类作用域限制符。
  1. class team
  2. {
  3. public
  4. struct Coach{...};
  5. ...
  6. };
使用Coach时,应该这样定义 team::Coach teach1;

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

下面表格总结了,嵌套类、结构、枚举的作用域特征。
声明位置 包含它的类是否可以使用它 从包含它的类派生下来的类是否可以使用它 外部是否可以使用它
公有
私有
保护
  • 访问权限
    在外部类中声明嵌套类并没有赋予外部类任何对嵌套类的访问权限,也没有赋予任何嵌套类对于外部类的访问权限。与一般类的访问控制相同(私有,公有,保护)。

  • 代码测试
在外部类访问嵌套类
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. i = 10; //不能访问
  7. mytest::i = 10;//不能访问
  8. }
  9. private:
  10. class mytest
  11. {
  12. int i;
  13. int j;
  14. };
  15. };
不能直接访问mytest的成员,试着通过对象访问。
  1. class test
  2. {
  3. public:
  4. test()
  5. {
  6. cc.i = 10; //通过对象可以访问,如果i为私有则不可访问
  7. }
  8. private:
  9. class mytest
  10. {
  11. public:
  12. int i;
  13. int j;
  14. };
  15. mytest cc;
  16. };
通过测试,在外部类中声明一个嵌套类的对象。然后再外部类中利用该对象访问嵌套类,访问的规则与普通类相同。

在嵌套类中访问外部类
 因为嵌套类中没有任何对外部类的访问权限。因此只有在嵌套类中定义了改对象,才能够访问其非静态成员,但此时外部类是一个不完整的类型(类没有定义完成)。因此想在嵌套类内部访问外部类是无法做到的。

C++嵌套类(内部类与外部类)的更多相关文章

  1. Java嵌套类,内部类和外部类

    1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类 ...

  2. 【转】C++之内部类(嵌套类)与外部类及友元

    [转]http://baike.baidu.com/link?url=Md223wQoT5s-3cZ5xRnj1pGmvm310DKAuh-HDrcEdc2l24rwobHrdEc_Mi4Z3BGP0 ...

  3. C++之内部类(嵌套类)与外部类及友元

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 先上代码: class Outer { public: Outer(){m_outer ...

  4. C++之内部类(内部类就是外部类的友元类,单向友元。只是内部类比友元类多了一点权限)

    1. 内部类的概念 如果一个类定义在另一个类的内部,这个内部类就叫做内部类.注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类.外部类对内部类没有任何优越的访问权限. ...

  5. java 编程基础 Class对象 反射 :获取类的构造方法,方法,成员变量,内部类,外部类,父类,实现的接口,修饰符等...

    类 Class  每个类被加载之后,系统就会为该类生成一个对应的Class对象,通过该Class对象就可以访问到JVM中的这个类. 我们在Java中获取Class对象一般有三种方式: (1), 使用C ...

  6. java内部类 和外部类的区别

    java 内部类和静态内部类的区别  详细连接https://www.cnblogs.com/aademeng/articles/6192954.html 下面说一说内部类(Inner Class)和 ...

  7. Java内部类与外部类的那些事

    昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类) ...

  8. 内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

    内部类访问外部类的变量必须是final吗? 如下: package com.java.concurrent; class A { int i = 3; public void shout() { cl ...

  9. java内部类和外部类

    1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world& ...

随机推荐

  1. android studio 一个项目如何打包多个apk

    1.修改app的build.gradle文件 假设我们同一套代码编译2个app:demo1和demo2 android { ... productFlavors { // demo1 demo1 { ...

  2. CSIC_716_20191116【常用模块的用法 time ,datetime, random, os, sys, hashlib】

    import time import datetime import os import sys import random import hashlib time模块 时间戳(Timestamp) ...

  3. Python自学:第四章 在for循环中执行更多操作(2)

    # -*- coding: GBK -*- magicians = ['alice', 'david', 'carolina'] for magician in magicians: print(ma ...

  4. eax,ebx,ecx,edx,esi,edi,ebp,esp寄存器的作用

    位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比方说:add eax,-2 ;   //可以认为是给变量eax加上-2这样的一个值. 位寄存器有多种用途,但每一个都有"专长 ...

  5. Activity详解三 启动activity并返回结果 转载 https://www.cnblogs.com/androidWuYou/p/5886991.html

    首先看演示: 1 简介 .如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int ...

  6. Big Number HDU - 1212

    As we know, Big Number is always troublesome. But it's really important in our ACM. And today, your ...

  7. POJ-1976-A Mini Locomotive-dp

    A train has a locomotive that pulls the train with its many passenger coaches. If the locomotive bre ...

  8. <小知识>记录

    lis = [2,3,"k",["qwe",20,["k1",["tt",3,"1"]],89],& ...

  9. 【CF900D】Unusual Sequences

    题目 智力下降严重 显然要反演了呀 首先必须满足\(x|y\),否则答案是\(0\) 我们枚举这个数列的\(gcd\)是\(d\)或者\(d\)的倍数 于是答案就是 \[\sum_{x|d}[d|y] ...

  10. UMP系统功能 容灾