C++嵌套类(内部类与外部类)

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

对类嵌套往往为了帮助实现另一个类,并避免名称冲突。如下:

  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. };

通过测试,在外部类中声明一个嵌套类的对象。然后再外部类中利用该对象访问嵌套类,访问的规则与普通类相同。

在嵌套类中访问外部类

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

来自为知笔记(Wiz)

时间: 2024-08-01 05:20:32

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

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

1.嵌套类,内部类 嵌套类是指被定义在一个类内部的类: JAVA的嵌套类有很多种类:1.静态成员类:2.非静态成员类:3.匿名类:4.局部类:其中,除了静态成员类之外,其他的都是内部类,因为静态成员类更像是一个独立的类: 但是静态成员类,是外部类内部的一个成员,静态成员类的访问和其他的静态成员一样:1.通过外部类类名调用:2.如果静态成员类定义为私有,那么只能在外部类内部使用        JAVA 内部类可以很好的实现隐藏,并且内部类拥有外围类的所有元素的访问权限,可是实现多重继承,并且可以避

内部类修改外部类属性(转:http://demojava.iteye.com/blog/1075571)

public class Test {  public String demo="qw4rqwer";  public void changValue() {  this.demo=" hello word"; } class DemoOuterclass {   public  DemoOuterclass()   {    changValue();   } } public static void main(String[] args) {  Test t=n

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

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

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

昨天去笔试的时候遇到了Java的内部类的创建方式与访问权限的问题,我不懂,没写,故今天起来特意去试验一下,就有了这篇总结性的文章. Java中的内部类又分为非静态内部类(匿名内部类也是非静态的内部类)和静态内部类,两者与外部类的关系是不一样的,创建的方式也不一样. 1 非静态内部类 Java的非静态内部类在构造的时候,会将外部类的引用传递进来,并且作为内部类的一个属性,因此,内部类会隐式地持有其外部类的引用.也就是非静态内部类在构造的时候需要有一个外部类的实例传递进来进行构造,不能像普通的Jav

java:内部类与外部类的区别和联系

注意事项一:在内部类中可以随意使用外部类的成员方法以及成员变量. 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止其他类的访问.如在成员变量或者成员方法前面,加上Private 关键字,则其他类就无法调用这个类中的成员方法或则和成员变量.但是,如果这个类有成员内部类,则不受这方面的限制.也就是说,在成员内部类中可以随意引 用外部类的成员方法以及成员变量,即使这些类成员方法或者成员变量被修饰了private.如在成员外部类中定义了一个i变量,并且利用private关

c++内部类和外部类(java)

(1)简介: 内部类其实就是一种在类声明里面定义的一种局部数据类型.(非常类似于struct Node声明的),这和java的还有存在区别的. ---- 内部类的声明有public和private之分 如果声明为public,那么外面也可以用它来定义变量,比如Outer::Inner var 如果声明为private,那么外面不能用来定义变量,那么Outer::Inner var将会导致编译错误. (2)---- 内部类声明完之后就可以用来定义变量 这就和别的数据类型定义变量一样了,访问规则也一

java内部类和外部类

1.使用static可以声明一个内部类, 可以直接在外部调用 class Outer{ // 定义外部类 private static String info = "hello world" ; // 定义外部类的私有属性 static class Inner{ // 使用static定义内部类为外部类 public void print(){ // 定义内部类的方法 System.out.println(info) ; // 直接访问外部类的私有属性 } }; public void

内部类和外部类的实例变量可以共存

成员内部类:作为外部类的一个成员存在,与外部类的属性.方法并列. 内部类和外部类的实例变量可以共存. 在内部类中访问实例变量:this.属性 在内部类访问外部类的实例变量:外部类名.this.属性. 成员内部类的优点: ⑴内部类作为外部类的成员,可以访问外部类的私有成员或属性.(即使将外部类声明为PRIVATE,但是对于处于其内部的内部类还是可见的.) ⑵用内部类定义在外部类中不可访问的属性.这样就在外部类中实现了比外部类的private还要小的访问权限. 注意:内部类是一个编译时的概念,一旦编

内部类和外部类之间的相互调用

内部类: ①静态内部类中可以有非静态的方法 ②当内部类中有静态方法或者静态成员变量时,一定是静态内部类 一般内部类在外部类的成员变量位置,像这样: 1 public class Outer { 2 class Inner{ 3 4 } 5 } 1.外部类访问内部类: 内部类被static修饰:可以直接new Inner in = new Inner(); 内部类没有被static修饰:得先new出来外部类的实例,再new内部类的 Inner in = new Outer().new Inner(