嵌套结构可以访问外部结构的私有成员吗?

在《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].

原文地址:https://www.cnblogs.com/cplinux/p/5544059.html