1. 程式人生 > >C++ 巢狀類與外圍類以及區域性類對成員變數的訪問 【資料結構】

C++ 巢狀類與外圍類以及區域性類對成員變數的訪問 【資料結構】

參考資料:《資料結構c++語言描述》

概念:

在一個類中定義的為巢狀類,定義巢狀類的類稱為外圍類。巢狀類只能在外圍類中使用。

定義巢狀類的目的就是為了隱藏資訊,這樣可以提高類的抽象能力。

例子如下:


其中,類B是一個巢狀類,類A是外圍類,類B定義在類A的類體內。
若干說明:
1、從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。
2、從訪問許可權的角度來看,巢狀類名與它的外圍類的物件成員具有相同的訪問許可權規則。不能訪問巢狀類的物件中的私有成員函式,也不能對外圍類的私有部分中的巢狀類建立物件。
3、巢狀類中的成員函式可以在它的類體外定義。
4、巢狀類中說明的成員不是外圍類中物件的成員,反之亦然。巢狀類的成員函式對外圍類的成員沒有訪問權,反義亦然。因此,在分析巢狀類與外圍類的成員訪問關係時,往往把巢狀類看做非巢狀類類處理。這樣巢狀類的格式可以寫成如下格式:


4、由此可見,巢狀類僅僅是語法上的巢狀。
5、在巢狀類中說明的友元對外圍類的成員沒有訪問權。
6、如果巢狀類比較複雜,可以只在外圍類中對巢狀類進行說明,關於巢狀的詳細的內容可以在外圍類體外的檔案域中進行定義。
7、巢狀類可以訪問外圍類的靜態成員變數,即使它的訪問許可權是私有的。


區域性類:
在一個函式體內定義的類稱為區域性類。區域性類中只能使用它的外圍作用域的物件和函式進行聯絡,因為外圍作用域中的變數與改區域性類的物件無關。區域性類不能被外部所繼承。在定義區域性類時需要注意:區域性類中不能宣告靜態成員函式,並且所有成員函式都必須定義在類體內。在實際中,區域性類是很少使用的。

所有程式碼:

#include <iostream>
#include <stddef.h>
using namespace std;

//巢狀類訪問外圍類的成員變數
class GH_A{

	//const 
	const static int s_data =54;

public:
	int task_id;

	class GH_B
	{
		public:
			int attribute;
			GH_A* parent;

			//建構函式
			GH_B()
			{
				attribute =15;
				parent = (GH_A*)((char*)this - offsetof(GH_A,gh_b));
				cout<<"外圍類的private型靜態變數:"<<s_data<<endl;
			}
	}gh_b;
};

//區域性類
void fun()
{
	static int s;
	class A
	{
	public:
		void init(int i)
		{
			s = i;
		}
		void print()
		{
			cout<<"s="<<s<<endl;
		}
	};
 A m;
 m.init(10);
 m.print();
 cout<<"s="<<s<<endl;
}

int main()
{
	GH_A a;
	a.gh_b.parent->task_id = 20;
	cout<<"外圍類成員變數值被巢狀訪問並修改之後的值:"<<a.task_id<<endl;
	a.task_id = a.gh_b.attribute;
	cout<<"巢狀類訪問外圍類成員變數值:"<<a.gh_b.parent->task_id<<endl;
	cout<<"區域性類:"<<endl;

	fun();
	system("pause");

return 0;
}

執行結果: