1、我们知道,一个类中的成员函数或是成员变量如果用private或是protected修饰,在该类以外是不能被访问的。


2、我们定义两个类CClass_A和CClass_B来辅助说明,在A类中定义一个受保护或者私有的成员变量m_a 和 一个受保护或私有的成员函数Print_A。如下:

#pragma once      


       #include "Class_B.h"      


       #include <iostream>      


       using namespace std;      


       class CClass_A      


       {      


       public:      


              CClass_A(void);      


              ~CClass_A(void);      


              


       protected:      


       //private:      


              int m_a;      


              inline void Print_A()             


              {      


              cout <<        "调用类A的私有函数"        << endl;      
#include "StdAfx.h"      


       #include "Class_A.h"      


       #include "Class_B.h"      


              


              


       CClass_B::CClass_B(void)      


       {      


              CClass_A object_A;      


              


              object_A.m_a = 2;      


              object_A.Print_A();      


       }      


              


              


       CClass_B::~CClass_B(void)      


       {      


       }

              }      


       };


3、然后在B类的构造函数中定义一个A类的对象object_A,通过这个对象访问A类中的m_a和print_A。编译会发生错误,信息如下:

#include "StdAfx.h"      


       #include "Class_A.h"      


       #include "Class_B.h"      


              


              


       CClass_B::CClass_B(void)      


       {      


              CClass_A object_A;      


              


              object_A.m_a = 2;      


              object_A.Print_A();      


       }      


              


              


       CClass_B::~CClass_B(void)      


       {      


       }


友元:在本类之外访问本类的私有成员变量_#pragma

protected

友元:在本类之外访问本类的私有成员变量_ios_02

private


4、由此可见,在类B中无法访问类A中的protected或是private修饰的变量或函数。在C++中有一个概念,那就是友元(friend),它与封装相反,是破坏封装性的,但是在有的时候用起来很方便。如上例,只要在类A的声明中加一句声明友元的语句,告诉编译器类B是类A的朋友,那么在类B中就能访问类A中的私有及保护权限的内容了。

#pragma once      


       #include "Class_B.h"      


       #include <iostream>      


       using namespace std;      


       class CClass_A      


       {      


       public:      


              CClass_A(void);      


              ~CClass_A(void);      


              friend class CClass_B;         // 声明友元      


              


       //protected:      


       private:      


              int m_a;      


              inline void Print_A()      


              {      


              cout <<        "调用类A的私有函数"        << endl;      


              }      


       };


5、

友元:在本类之外访问本类的私有成员变量_友元_03