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

来源:互联网 发布:聊天软件下载 编辑:程序博客网 时间:2024/04/27 08:27

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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;
    }
};

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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中的私有及保护权限的内容了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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、












0 0
原创粉丝点击