文章目录

  • 11 友元
    • 11.1 全局函数做友元
    • 11.2 友元类
    • 11.3 成员函数做友元

11 友元

让我们引入一个例子来讲述友元是什么。

生活中你的家有客厅,有卧室,客厅所有来的客人都可以进去,但是你的卧室是私有的。对于认识的人来说你可以允许它进去,但是对于陌生人你就不是很欢迎了。

同样地,我们把这个例子引申到类上,那么我们的友元就变成了,一个类允许另外一个类拥有访问自己的私有权限。

如果要指定友元类,只需加上关键字friend。我们来看一下它的三种实现方式:

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

11.1 全局函数做友元

让我们看一下全局函数做友元的简单用法:

#include <iostream>
using namespace std;
#include <string>class Building
{friend void goodGay(Building& building);//!侬,指定这个函数为Building的好朋友
public:Building(){m_SittingRoom = "客厅";m_Bedroom = "卧室";};string m_SittingRoom;private:string m_Bedroom;
};//全局函数
void goodGay(Building &building)
{cout << "友元全局函数正在访问:" << building.m_SittingRoom << endl;cout << "友元全局函数正在访问:" << building.m_Bedroom << endl;
}void test01()
{Building building;goodGay(building);
}int main()
{test01();
}

out:

11.2 友元类

让我们在来看看友元类是怎么一回事,这个实际上不必多说,只要你试着敲一下下面的代码,即可体会其思想。

#include <iostream>
using namespace std;
#include <string>class Building;class GoodGay
{
public:GoodGay();void visit();//参观函数 访问Building中的属性Building* building;
};class Building
{friend class GoodGay;
public:Building();string m_SittingRoom;private:string m_BedRoom; //卧室
};Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}GoodGay::GoodGay()
{//创建建筑物对象building = new Building;
}void GoodGay::visit()
{cout << "友元类正在访问:" << building->m_SittingRoom << endl;cout << "友元类正在访问:" << building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();
}int main()
{test01();
}

out:

11.3 成员函数做友元

同样地,成员函数做友元和类做友元也是大同小异,如下所示:

#include <iostream>
using namespace std;class Building;class GoodGay
{
public:GoodGay();void visit1();//这个函数可以访问Building的私有成员void visit2();//这个函数不可以访问Building的私有成员Building* building;
};class Building
{friend void GoodGay::visit1();
public:Building();string m_SittingRoom;//客厅private:string m_BedRoom;//卧室
};//类外实现成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}GoodGay::GoodGay()
{building = new Building;
}void GoodGay::visit1()
{cout << "visit1 函数正在访问:" << building->m_BedRoom << endl;cout << "visit1 函数正在访问:" << building->m_SittingRoom << endl;
};void GoodGay::visit2()
{// cout << "visit2 函数正在访问:" << building->m_BedRoom << endl;cout << "visit2 函数正在访问:" << building->m_SittingRoom << endl;
};void test01()
{GoodGay gg;gg.visit1();gg.visit2();
}int main()
{test01();
}

out:

C++从0到1的入门级教学(十一)——友元相关推荐

  1. C++从0到1的入门级教学(十二)——运算符重载

    文章目录 12 运算符重载 12.1 加法运算符重载 12.2 左移运算符重载 12.2.1 演示与说明 12.2.2 常见的友元使用:重载>>运算符 12.3 递增运算符重载 12.4 ...

  2. C++从0到1的入门级教学(六)——函数

    文章目录 6 函数 6.1 概述 6.2 函数的定义 6.3 函数的调用 6.4 值传递 6.5 函数的常见形式 6.6 函数的声明 6.7 函数的分文件编写 6 函数 6.1 概述 作用:将一段经常 ...

  3. C++从0到1的入门级教学(二)——数据类型

    文章目录 2 数据类型 2.1 简单变量 2.2 整型 2.3 sizeof关键字 2.4 实型(浮点型) 2.5 字符型 2.6 转义字符 2.7 布尔类型 2.8 数据的输入 2.9 新特性 2 ...

  4. C++从0到1的入门级教学(十三)——继承

    文章目录 13 继承 13.1 继承的基本语法 13.2 继承方式 13.3 继承的对象模型 13.4 继承中构造和析构顺序 13.5 继承同名成员处理方式 13.6 继承同名静态成员处理方式 13. ...

  5. JAVA入门级教学之(super关键字)

    目录 JAVA入门级教学之(super关键字) 1.super关键字用在构造方法中: 2.语法规则: 3.注意:super();的调用只能放在构造方法的第一行,和this();的调用规则一样 4.通过 ...

  6. JAVA入门级教学之(数据类型)

    目录 JAVA入门级教学之(数据类型) 1.数据类型的作用是什么? 2.java中的数据类型包括两种: 3.关于基本数据类型: 4.注意:字符串"abc"不属于基本数据类型,属于[ ...

  7. Dva.js 入门级教学文档-1

    Dva.js 入门级教学文档-1 简介 一.介绍 1.什么是 dva 2.dva 的作用是什么 二.环境搭建和使用 1.环境搭建 2.创建项目 3.使用 antd 三.全局架构 1.index.js( ...

  8. 爬虫实战入门级教学(数据爬取->数据分析->数据存储)

    爬虫实战入门级教学(数据爬取->数据分析->数据存储) 天天刷题好累哦,来一期简单舒适的爬虫学习,小试牛刀(仅供学习交流,不足之处还请指正) 文章讲的比较细比较啰嗦,适合未接触过爬虫的新手 ...

  9. JAVA入门级教学之(接口)

    目录 JAVA入门级教学之(接口) 接口也是一种引用类型,可以等同看做类 1.如何定义接口,语法: 2.接口中只能出现: 3.接口其实是一个特殊的抽象类,特殊在接口是完全抽象的 4.接口中没有构造方法 ...

最新文章

  1. 从虚拟化、统一映射和自动化看09年法规遵从趋势
  2. AU R-CNN:利用专家先验知识进行表情运动单元检测的R-CNN模型
  3. 机器学习——前馈神经网络
  4. 链表之单链表约瑟夫问题(一)
  5. hystrix合并请求_Hystrix中的批处理(折叠)请求
  6. 无穷级数求和7个公式_大家看,用反证法判别级数敛散性(送微积分同学)!...
  7. linux的基础知识——IP,UDP和TCP
  8. Oracle11完全卸载方法
  9. MySQL中清空表和截断表的区别(新手入门)
  10. 《数据结构C语言版》——栈和队列详解(图文并茂),从零开始的学习
  11. iOS开源项目周报0302
  12. 【重点 递归版】剑指offer——面试题16:反转链表
  13. 转:Oracle中的rownum不能使用大于的问题
  14. 开启cdn后无法显示字体图标——CDN服务器跨域问题
  15. 电脑安全证书错误怎么处理比较好
  16. 2022软件测试常见抓包工具
  17. anaconda必须安装在c盘吗_安装anaconda
  18. office最完整的CAB文件下载
  19. 用C语言代码编写一个五子棋小游戏
  20. JSHTML实现音频可视化

热门文章

  1. linux function
  2. sublime_text 3 注册序列号
  3. 解决 Visual Studio 中代码注释自动折叠的问题
  4. 使用协同过滤推荐电影
  5. leetcode 643. 子数组最大平均数 I(滑动窗口)
  6. 程序员实用小程序_我从阅读《实用程序员》中学到了什么
  7. angular dom_Angular 8 DOM查询:ViewChild和ViewChildren示例
  8. 在哪能找到陌生人聊骚_如何说服陌生人帮助您找到工作
  9. table偏见和HTML仇外心理
  10. pandas之groupby分组与pivot_table透视