18. 友元

一、什么是友元

  在程序中,有些私有成员,也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。友元的目的就是让一个函数或者类访问另一个类中私有的成员。友元的关键字为 friend

二、全局函数做友元

  新建一个 house.h 头文件,用来保存类的声明:

#pragma once
#include <iostream>

using namespace std;

class House
{
    // goodFriend()全局函数是House类的友元,可以访问House类的私有成员
    friend void goodFriend(House * house);
public:
    string living_room;

private:
    string bedroom;

public:
    House(void);
};

  新建一个 house.cpp 源文件,用来实现构造方法和成员方法:

#include "house.h"

using namespace std;

House::House(void) : living_room("客厅"), bedroom("卧室") {}

  在包含 main() 函数的文件中包含刚才定义的头文件,然后使用。

#include <iostream>
#include "house.cpp"

using namespace std;

// 全局函数
void goodFriend(House * house)
{
    cout << "好朋友正在访问你的:" << house->living_room << endl;
    cout << "好朋友正在访问你的:" << house->bedroom << endl;
}

int main(void)
{
    House house;
    goodFriend(&house);

    return 0;
}

三、类做友元

  新建一个 good_friend.h 头文件,用来保存类的声明:

#pragma once
#include <iostream>
#include "house.h"

class House;

class GoodFriend
{
public:
    void visit(House *house);
};

  新建一个 good_friend.cpp 源文件,用来实现构造方法和成员方法:

#include "good_friend.h"

using namespace std;

void GoodFriend::visit(House *house)
{
    cout << "好朋友正在访问你的:" << house->living_room << endl;
    cout << "好朋友正在访问你的:" << house->bedroom << endl;
}

  修改一个 house.h 头文件:

#pragma once
#include <iostream>

using namespace std;

class House
{
    // GoodFriend是House类的友元类,可以访问本类中私有成员
    friend class GoodFriend;
public:
    string living_room;

private:
    string bedroom;

public:
    House(void);
};

  在包含 main() 函数的文件中包含刚才定义的头文件,然后使用。

#include <iostream>
#include "house.cpp"
#include "good_friend.cpp"

using namespace std;

int main(void)
{
    House house;

    GoodFriend good_friend;
    good_friend.visit(&house);

    return 0;
}

四、成员函数做友元

  修改一个 house.h 头文件:

#pragma once
#include <iostream>
#include "good_friend.h"

using namespace std;

class House
{
    // GoodFriend类中的visit()函数是House类的友元函数,可以访问本类中私有成员
    friend void GoodFriend::visit(House *house);
public:
    string living_room;

private:
    string bedroom;

public:
    House(void);
};
posted @ 2023-05-02 20:13  星光映梦  阅读(44)  评论(0编辑  收藏  举报