当前位置: 首页 > article >正文

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);
};

http://www.kler.cn/a/389474.html

相关文章:

  • 【C++】类与对象的基础概念
  • group_concat配置影响程序出bug
  • Nginx配置自带的stub状态实现活动监控指标
  • 网页web无插件播放器EasyPlayer.js点播播放器遇到视频地址播放不了的现象及措施
  • STM32学习笔记------GPIO介绍
  • OSS文件上传
  • 分享三个python爬虫案例
  • ServletContext介绍
  • 别再为视频转文字烦恼啦!这10个转换工具帮你一键搞定。
  • UE5 随机生成地牢关卡
  • Python酷库之旅-第三方库Pandas(206)
  • 信息安全数学基础(47)域的结构
  • 浔川 AI 翻译 v5.0 上线时间相关公告
  • canal配置之一:admin配置
  • 手边酒店多商户版V2源码独立部署_博纳软云
  • 多智能体系统的构建
  • C++线程
  • 【大数据学习 | kafka高级部分】kafka的快速读写
  • 道品科技水肥一体化在农业生产中的必要性与应用领域探讨
  • 微服务架构面试内容整理-消息驱动-RocketMQ
  • redis RDB持久化技术
  • mysql第二次作业---单表和多表查询
  • Rust性能优化与调试之性能基准测试
  • 如何使用SparkSQL在hive中使用Spark的引擎计算
  • 全网最详细的自动化测试(Jenkins 篇)
  • 企业知识库管理系统的创新模式及其智能化转型