C/C++嵌套类

Posted mick_seu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++嵌套类相关的知识,希望对你有一定的参考价值。

参考自:C++ 与“类”有关的注意事项总结(六):嵌套类与局部类(漫步云端)


类还可以定义在另一个类的内部。我们称之为 “嵌套类”。

嵌套类的目的:因为外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,同时对外隐藏该底层实现。


几个注意点:

1、从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类外使用该类名时,需要加外围类名限定。
2、从访问权限的角度来看,嵌套类名与它的外围类的对象成员名遵循相同的访问权限规则。不能访问嵌套类对象中的私有成员函数,也不能在外围类外对外围类的私有部分中的嵌套类建立对象。

3、虽然嵌套类在外围类内部定义,但它是一个独立的类,基本上与外围类不相关。它的成员不属于外围类,同样,外围类的成员也不属于该嵌套类。嵌套类的出现只是告诉外围类有一个这样的类型成员供外围类使用。并且,外围类对嵌套类成员的访问没有任何特权,嵌套类对外围类成员的访问也同样如此。(特殊情况见6)

4、若不在嵌套类内部定义其成员,则其定义只能写到与外围类相同的作用域中,且要用外围类名进行限定,不能把定义写在外围类中。例如,嵌套类的静态成员变量就是这样的一个例子。

5、为了达到隐藏底层的目的,我们可以在源文件中定义该嵌套类,而只在头文件的外围类定义中前置声明这个嵌套类即可。

6、嵌套类可以直接引用外围类的静态成员、类型名和枚举成员(即使是外围类私有的,并且无需使用外围类名限定)。类型名是一个typedef名字、枚举类型名、或是一个类名。


举个例子:

#include <iostream>

class Box 
	private:
		enum Colour 
			White = 1,
			Blue,
			Red,
			Yellow,
			Black,
		;
		static Colour color_;
		class Display 
			public:
				void Show() 
					Colour col = Black;			//  Colour是外围类的类型, Black是其枚举成员
				   	std::cout << col << std::endl;		
				   	std::cout << color_ << std::endl;	//  color_是外围类的静态变量
					
		;

	public:
		Display d_;
;

Box::Colour Box::color_ = White;

int main() 
	Box b;
	b.d_.Show();
	return 0;






以上是关于C/C++嵌套类的主要内容,如果未能解决你的问题,请参考以下文章

通过平均向量来展平嵌套列表

C / C ++如何复制没有嵌套循环的多维char数组?

C++C++自学旅程(10):巨有成就感!:C++类类型结合运用实战

嵌套对象解构和重命名

类的声明和访问级别

c语言练习题