zoukankan      html  css  js  c++  java
  • 嵌套结构可以访问外部结构的私有成员吗?

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

  • 相关阅读:
    Python杂记
    设置Python打印格式
    SFTP和FTS协议的区别
    C#6.0语法糖剖析(一)
    .NET Framework 4.0之Tuple(元组)
    以Self Host的方式来寄宿Web API
    以Web Host的方式来寄宿Web API
    IIS在默认情况并不支持对PUT和DELETE请求的支持
    ASP.NET Web API 特性
    在Windows下编写并运行第一个ASP.NET 5 Preview Web API程序
  • 原文地址:https://www.cnblogs.com/cplinux/p/5544059.html
Copyright © 2011-2022 走看看