C 之巢狀類與外圍類及友元

2021-07-11 18:08:54 字數 1268 閱讀 8170

class outer

private:

int m_outerint;

public:

//內部類定義開始

class inner

private:

int m_innerint;

public:

void displayin()

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

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

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

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

友元舉例:

class inner;

class outer

private:

int m_outerint;

public:

/*//內部類定義開始

class inner

private:

int m_innerint;

public:

void displayin()

private:

int m_outerint;

public:

//內部類定義開始

class inner

private:

int m_innerint;

public:

void displayin()

} m_xinner;

//end內部類

public:

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 中的友元為封裝隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視內部的秘密。友元的正確使用能提高程式的執行效率,但同時也破壞了類的封裝...

c 友元函式與友元類

友元函式和友元類的需要 類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢...

c 友元函式與友元類

友元函式和友元類的需要 類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員,但是如果將資料成員都定義為公有的,這又破壞了隱藏的特性。另外,應該看到在某些情況下,特別是在對某些成員函式多次呼叫時,由於引數傳遞,型別檢...