在《c++编程思想》中,第五章,第三节中有一个嵌套友元。有一个句话是“嵌套结构并不能自动获得访问private成员的权限”代码如下图

即被嵌套进Holder结构的Pointer不能自动获得访问Holder私有成员a[sz]的权限,必须把Pointer声明为Holder的友元结构才行。对此做如下实验:
//test.h 文件
#ifndef TEST_H
#define TEST_H
class OuterClass{
private:
int m_i;
public:
class InnerClass{
public:
void printOuter(OuterClass vo);
void setOuter(OuterClass* ot,int i);
};
OuterClass(int i);
};
#endif TEST_H
//test.cpp文件
#include"test.h"
#include<iostream>
using namespace std;
OuterClass::OuterClass(int i):m_i(i){
}
void OuterClass::InnerClass::printOuter(OuterClass ot){
cout << ot.m_i << endl;
}
void OuterClass::InnerClass::setOuter(OuterClass* ot, int i){
ot->m_i = i;
}
//demo.cpp文件
#include"test.h"
#include<iostream>
using namespace std;
int main(){
OuterClass ot(0);
OuterClass::InnerClass inn;
inn.printOuter(ot);
inn.setOuter(&ot,100);
inn.printOuter(ot);
return 0;
}
上述代码就是没有把内部的InnerClass 声明为OuterClass的友元结构的实验,实验证明上述代码可以编译通过,也可以正确运行,运行结果如下

其实把书中代码注释掉一行也可以说明问题,

把friend struct Pointer注释掉,不声明Pointer是Holder的友元结构,Pointer里面的函数仍然可以访问a[sz].