C++内部类(嵌套类)

	class A//外部类
	{
	public:
		class B//内部类
		{
		public:
			B()
			{
				b1 = 10;
				b2 = 20;
			}
			void fun2()
			{
				cout << b1 << endl;
				cout << b2 << endl;
			}
		private:
			int b1;
		public:
			int b2;
		};
	public:
		A()
		{
			a1 = 1;
			a2 = 2;
		}
		void fun1()
		{
			cout << a1 << endl;
			cout << a2 << endl;
		}
	private:
		int a1;
	public:
		int a2;
	};
	
	int main()
	{
		A a;
		a.fun1();
	
		cout << "\n";
	
		A::B b;
		b.fun2();
	
		system("pause");
		return 0;
	}

C++内部类(嵌套类)_第1张图片

一般情况,内部类不能访问外部类成员(数据成员,函数成员)
同样,外部类不能访问内部类成员
外部类定义的静态成员可以被内部类直接访问。

	class A//外部类
	{
	public:
		class B//内部类
		{
		public:
			void fun2()
			{
				//a1++;//非静态成员不能访问
				a2++;//A::a2
				a3++;
			}
		};
	public:
		A() : a1(1){}
	public:
		int a1;
		static int a2;
	private:
		static int a3;
	};
	int A::a2 = 2;
	int A::a3 = 3;


请看下面例子,修改后的fun1函数和fun2函数

	//内部类方法fun2
	void fun2()
	{
	
		cout << b1 << endl;
		cout << b2 << endl;

		//下面是后添加的代码,都是编译会报错的
		cout << A::a1 << endl;//不可以访问外部类属性
		cout << A::a2 << endl;//不可以访问外部类属性
		fun1();//不可以访问外部类方法

	}

	//外部类方法fun1
	void fun1()
	{
		cout << a1 << endl;
		cout << a2 << endl;
		
		//下面后添加的代码,都是编译会报错的
		cout << B::b1 << endl;//不可以访问内部类属性
		cout << B::b2 << endl;//不可以访问外部类属性
		fun2();//不可以访问内部类方法
	}		

为了让内部类可以访问外部类成员,外部类可以访问内部类成员

class A//外部类
{
public:
	class B//内部类
	{
	public:
		B()
		{
			b1 = 10;
			b2 = 20;
		}
		void fun2()
		{
			cout << b1 << endl;
			cout << b2 << endl;

			A aa;
			cout << aa.a1 << endl;
			cout << aa.a2 << endl;
		}
	private:
		int b1;
	public:
		int b2;
	};
public:
	A()
	{
		a1 = 1;
		a2 = 2;
	}
	void fun1()
	{
		cout << a1 << endl;
		cout << a2 << endl;

		B bb;
		cout << bb.b2 << endl;
		//cout << bb.b1 << endl;//由于内部类中b1是私有属性,所以不能访问
	}
private:
	int a1;
public:
	int a2;
};

int main()
{
	A a;
	a.fun1();

	cout << "\n";

	A::B b;
	b.fun2();

	system("pause");
	return 0;
}

C++内部类(嵌套类)_第2张图片

通过main函数中,修改外部类A的属性a2的值

	int main()
	{
		A a;
		a.a2 = 99;//这是后加的代码,修改a2的值
		a.fun1();
	
		cout << "\n";
	
		A::B b;
		b.fun2();
	
		system("pause");
		return 0;
	}

结果:
C++内部类(嵌套类)_第3张图片
发现出现问题,内部类中访问外部类的a2的值应该为修改后的99,怎么还是2呢???

这是由于,我们在内部类B中的方法fun2里,有 A aa; 的代码,这里申请的空间和main的 A a; 申请的空间是不同的,也是不同的对象,所以在main函数中的a对象修改成员,不会改变fun2函数里的aa对象的成员数值

下面是改变后的内部类,并解决了上面的问题

	class A//外部类
	{
	public:
		class B//内部类
		{
		public:
			B(){}
			B(A *p) : a(p) 
			{
				b1 = 10;
				b2 = 20;
			}
			void fun2()
			{
					
				cout << a->a1 << endl;
				cout << a->a2 << endl;
			}
		private:
			int b1;
		public:
			int b2;
		private:
			A *a;
		};
	public:
		A()
		{
			a1 = 1;
			a2 = 2;
		}
		void fun1()
		{
			/*B bb;
			cout << bb.b2 << endl;*/
			//cout << bb.b1 << endl;//由于内部类中b1是私有属性
		}
	private:
		int a1;
	public:
		int a2;
	};
	
	
	int main()
	{
		A a;
		a.a2 = 99;
	
		A::B &b = A::B(&a);
		b.fun2();
	
		system("pause");
		return 0;
	}

在这里插入图片描述

你可能感兴趣的:(C/C++)