【C++】嵌套类访问外围类的私有成员
名词
先简单说下两个名词:
外围类 = 把另一个类 “包在自己里面” 的类 → 本文就是
CExternal;
嵌套类 = 被包在别人里面的类 → 本文就是CNested。
问题
当嵌套类为public属性时,能否访问外围类的私有成员?
行不行,直接上代码看结果:
头文件:
#ifndef NESTEDCLASS_H
#define NESTEDCLASS_H// 外围类
class CExternal
{
public:CExternal();~CExternal();// 定义一个嵌套类class CNested{public:CNested(CExternal *pExternal);int selfAdd();private:CExternal *m_pExternal;};// 声明嵌套类的指针CNested *m_pNested;
private:int m_nCnt;};#endif
实现文件:
#include <iostream>
#include <string>
#include "NestedClassTest.h"using namespace std; // 声明命名空间CExternal::CExternal(): m_pNested(new CExternal::CNested(this)), m_nCnt(520)
{cout << "计数初始值:" << m_nCnt << endl;
}
CExternal::~CExternal()
{
}CExternal::CNested::CNested(CExternal *pExternal): m_pExternal(pExternal)
{
}
int CExternal::CNested::selfAdd()
{return ++m_pExternal->m_nCnt;
}int main()
{CExternal external;int nRet = external.m_pNested->selfAdd();cout << "计数值是否自增:" << nRet << endl;system("pause");
}
运行结果:

答案
显而易见,即便当嵌套类为public属性时,也能访问外围类的私有成员。
当然,当嵌套类为private和protected属性时,其也可以访问外围类的私有成员。
理解——为什么嵌套类能访问外围类的私有成员?
我们可以类成:
CExternal是 “一栋房子”,CNested是房子里的 “专属管家”—— 管家是房子的一部分,住在房子里,而房子就是 “外围” 的那个主体。
此时:
“嵌套类(不管是public还是private的),只要它能拿到外围类的实例指针(类比为管家手里有房子的钥匙),就能访问外围类的所有成员 —— 包括 private 的!(类比为主人的私人卧室)”
