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)
{
}
protected
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、