C 之內部類(巢狀類)與外部類及友元

2021-08-15 15:24:14 字數 1725 閱讀 2925

1 class outer

2 5 private:

6 int m_outerint;

7 public:

8 //內部類定義開始

9 class inner

10

13 private:

14 int m_innerint;

15 public:

16 void displayin()

如果這樣你都能正常執行,天理何在?displayin中的m_outerint到底是哪個例項的資料?

所以,為了避免這樣荒唐的事情發生,語法層面就已經使得上述不可能發生:連編譯都不會通過。

提問:把上面**中的inner設定為outer的友元類之後,能解決問題嗎?

答:該提問者都不僅犯了第乙個提問者的錯誤,還誤解了友元的含義。

友元舉例:

1 class inner;

2 3 class outer

4 7 private:

8 int m_outerint;

9 public:

10 /*//內部類定義開始

11 class inner

12

15 private:

16 int m_innerint;

17 public:

18 void displayin()

12 private:

13 int m_outerint;

14 public:

15 //內部類定義開始

16 class inner

17

20 private:

21 int m_innerint;

22 public:

23 void displayin()

30 } m_xinner;

31 //end內部類

32 public:

33 void displayout(){cout《看main函式:程式執行完main函式第一句後,記憶體中便有了乙個資料塊,它儲存著out的資料,而m_xinner也在資料塊中,當然,&out和this指標(外部類)都指向該記憶體塊的起始位置,而內部類**中的this指標當然就指向m_xinner的起始記憶體了,offsetof(theclass, m_x##localclass)獲得的便是m_xinner在該記憶體塊中與該記憶體塊起始位址(這正是out的位址)的距離(偏移),即內部類this-外部類this的差值(以位元組為單位)這樣,用內部類this減去其自身的偏移,便可得到pthis。有了out的位址,基本上可以對其為所欲為了,至於為何要有char*強轉,可以go to definition of offsetof,可以看到其實現中有個關於char的轉換。

提問:巢狀類為什麼可以訪問外圍類的私有靜態函式而不可訪問非靜態函式?

因為巢狀類預設是外部類的友元類,所以可以訪問其私有成員,這其中就包含了外部類的靜態成員。而不可以訪問外部類的非靜態成員,這是因為訪問非靜態成員需要物件,在沒有外部類物件的前提下,是不能夠通過外部類物件來訪問其成員的。如果在內部類中持有外部類的物件,則可以通過該外部類物件訪問外部類中的非靜態成員。

C 之內部類(巢狀類)與外部類及友元

先上 1 class outer25 private 6 intm outerint 7public 8 內部類定義開始 9class inner 1013 private 14 intm innerint 15public 16 void displayin 17 18 end內部類 19publ...

Java基礎之內部類與外部類

1 外部類訪問內部類,需要建立內部類物件,才能對內部類進行訪問 2 內部類中方法訪問外部類私有屬性,也需要建立外部類物件進行訪問物件的私有屬性 3 jvm在載入具有外部類和內部類特徵的類的時候有什麼特點?package com.dong.first 關於內部類與外部類的使用 author admin...

C 突破封裝 友元和內部類

首先來看乙個date類,當我們想要過載實現 operator 和 operator 一般會在類的內部寫 class date istream operator istream in private int year int month int day 但是這樣會存在乙個問題,類中 this指標 隱含...