版权声明:zhuhurry 未经博主允许不得转载 https://blog.youkuaiyun.com/zhuhurry
一、类的前向声明
有种特殊情况,当两个类需要相互引用形成一个”环形“引用时,无法先定义使用。 这时候需要用到前向申明,但是前向申明的类不能实例化。

下面的三个图展现了前向声明的用法和注意的事项:



(1)class A;即前向声明了这个A类,此时A类被声明而没有被定义(这种时候称之为前向声明),在声明之后,定义之前,类A是一个不完整类型。系统这个时候知道A是一个类型,但不知道包含哪些成员。不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数。
(2)我们一般会定义一个前向声明类的指针,并定义一个函数用于对这个指针进行赋值,注意我们不能在cpp文件中使用这个不完整类型。
二、嵌套类
所谓嵌套类,就是在类中声明的类。如下代码中,类Inner就是一个嵌套类,类Outer是外围类:

1.作用域
(1)嵌套类对于外围类的可见性
①嵌套类仅仅是声明在外围类内部的类型,而不是外围类的一个成员
②外围类不具备嵌套类所定义的成员,不能通过外围类类对象直接访问嵌套类中的成员,只能通过嵌套类对象来访问嵌套类的成员
③对于外围类来说,嵌套类和其他的类没有任何区别;外围类通过创建嵌套类对象来能访问嵌套类对象的public成员,不能访问嵌套类对象的protected及private成员
(2)外围类对于嵌套类的可见性
①嵌套类不具备外围类所定义的成员,既不能通过嵌套类对象来访问外围类的成员,只能通过外围类对象来访问外围类的成员
②嵌套类能通过嵌套类对象来访问外围类的public成员,不能访问外围类的protected及private成员
③嵌套类可以直接引用外围类的静态成员、类型名和枚举成员,即使这些是private的。
(3)嵌套类对于外围类外部的可见性
①不管嵌套类在外围类中被public、protected还是private修饰,对于外围类而言,外围类任何成员都可以访问这个嵌套类。
②但是当嵌套类在外围类中被protected和private修饰时,不能被外围类外部访问,当被public修饰时,可通过外围类类名::来访问。
2.代码解析
(1)如何实现嵌套类的成员函数?

(2)外围类外部如何创建一个嵌套类的对象?

(3)嵌套类如何访问外围类中的成员?
难点:对与嵌套类来说,外围类是一个不完整类型。类似前向声明
①把外围类的变量和函数静态化,不管是否被private修饰,嵌套类中都可以直接访问。

②外围类对于嵌套类来说是一个不完整类型,类似前向声明,只知道有这些一个类型并没有定义,不知道有什么成员变量,可通过参数的指针、引用方式来用外围类的成员变量和函数。

③下面这种方法,在外围类中创建嵌套类对象,而后通过外围类对象访问嵌套类对象,潜逃类中可计算外围类对象的地址,最后通过该地址访问外围类的中成员。

(4)外围类如何访问嵌套类中的成员?
很简单,直接实例化对象而后访问。
三、局部类
在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关。局部类不能被外部所继承。在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。在实践中,局部类是很少使用的。下面是一个局部类的例子。
