目录

4.4 友元

相关教程


4.4 友元

友元:友好的元素,有特殊的访问权限。

在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元。

友元的目的就是让一个函数或者类访问另一个类中私有成员

友元的关键字为 friend

友元的三种实现

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

1. 全局函数做友元

// 友元
class Building
{
public:// 全局函数做友元// test01 全局函数是 Building的友元,可以访问Building中的私有成员friend void test01(Building* b);Building(){m_SittingRoom = "客厅";m_BedRoom = "卧室";}string m_SittingRoom;
private:string m_BedRoom;
};// 全局函数
void test01 (Building *b)
{cout << "正在访问: " << b->m_SittingRoom << endl;// test01 全局函数是 Building的友元,可以访问Building中的私有成员cout << "正在访问: " << b->m_BedRoom << endl;
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
------------------------------------------------------------------------
正在访问: 客厅
正在访问: 卧室
请按任意键继续. . .

2. 类做友元

// 友元
class Building
{friend class GoodGuy;public:Building();string m_SittingRoom;private:string m_BedRoom;
};// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}class GoodGuy
{
public:GoodGuy();void visit();Building* building;
};// 类外写成员函数
GoodGuy::GoodGuy()
{// 创建建筑物对象building = new Building;
}void GoodGuy::visit()
{cout << "正在访问: " << building->m_SittingRoom << endl;cout << "正在访问: " << building->m_BedRoom << endl;
}// 全局函数
void test01 (Building *b)
{GoodGuy gg;gg.visit();
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
-------------------------------------------------------------------
正在访问: 客厅
正在访问: 卧室
请按任意键继续. . .

类外写成员函数:见上面

3. 成员函数做友元

(我的VS2019,必须class GoodGuy定义在class Building前,而且成员函数实现写在类实现后才管用,否则报错)

#include <iostream>
using namespace std;
#include <string>class GoodGuy;
class Building;class GoodGuy
{
public:GoodGuy();void visit();  // 让 visit函数可以访问Building中私有成员void visit2(); // 让 visit2函数不可以访问Building中私有成员Building* building;
};// 友元
class Building
{friend void GoodGuy::visit();public:Building();string m_SittingRoom;private:string m_BedRoom;
};// 类外写成员函数
GoodGuy::GoodGuy()
{// 创建建筑物对象building = new Building;
}void GoodGuy::visit()
{cout << "visit 正在访问: " << building->m_SittingRoom << endl;cout << "visit 正在访问: " << building->m_BedRoom << endl;
}void GoodGuy::visit2()
{cout << "visit2 正在访问: " << building->m_SittingRoom << endl;//cout << "visit2 正在访问: " << building->m_BedRoom << endl;
}// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}void test01 (Building *b)
{GoodGuy gg;gg.visit();gg.visit2();
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
--------------------------------------------------------------------------
visit 正在访问: 客厅
visit 正在访问: 卧室
visit2 正在访问: 客厅
请按任意键继续. . .

相关教程

  • 开发环境搭建:Visual Studio 2019 C++开发环境搭建
  • 推荐视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
  • 已投币三连,非常细致的视频教程,感谢up主。

c/c++教程 - 2.4.4 友元friend用法相关推荐

  1. python 包用法_Python 基础教程之包和类的用法

    Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...

  2. [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法

    [js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...

  3. java提示框easyui风格_[Java教程]jQuery EasyUI 提示框(Messager)用法

    [Java教程]jQuery EasyUI 提示框(Messager)用法 0 2013-10-10 19:00:06 jQuery EasyUI 提示框(Messager)不仅强大,而且也不用任何的 ...

  4. Redux 入门教程(一):基本用法

    一年半前,我写了<React 入门实例教程>,介绍了 React 的基本用法. React 只是 DOM 的一个抽象层,并不是 Web 应用的完整解决方案.有两个方面,它没涉及. 代码结构 ...

  5. python基础教程:startswith()和endswith()的用法

    startswith()方法 Python startswith() 方法用于检查字符串是否是以指定子字符串开头 如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则 ...

  6. 【Python教程】sort 与sorted的用法与区别

    1. sort: sort是Python中列表的方法 sort() 方法语法: list.sort(key=None, reverse=False) 有两个参数,这里不讲第一个参数,第二个参数当 re ...

  7. bat for循环_bat教程[279] reg import命令的用法

    古树屋Click to follow us C:\Users\86137>reg import /?REG IMPORT FileName[/reg:32 | /reg:64] FileName ...

  8. python补充urllib教程,Python爬虫之urllib基础用法教程

    综述 本系列文档用于对Python爬虫技术进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了. Python 版本是3.7.4 urllib库介绍 它是 Python 内 ...

  9. Python 教程:eval()和exac()详细用法以及区别

    一.eval() 1. 描述 eval()执行一个字符串,返回表达式的值. 2. 语法 eval(expression[, globals[, locals]]) expression:表达式 glo ...

最新文章

  1. Azkaban入门(启动一个Simple Example)
  2. 前线解释多线程《二》
  3. C#-获取页面源代码
  4. Ajax基于rest风格上传图片
  5. 《设计模式》3.结构型模式
  6. Mysql执行计划含义,mysql执行计划介绍
  7. python安装pygame无法找到SDL.h文件
  8. 瑞幸咖啡首席技术官也离职了:并未参加公司财务造假
  9. 轻量级神经网络ShuffleNet
  10. java 电子书下载
  11. U盘装机助理-PE环境
  12. PHP小白之路1--PHP之简易留言板设计
  13. libcef(一)编译CEF
  14. win10关闭windows聚焦_Win10聚焦锁屏壁纸无法自动更换的处理方法
  15. php 长链接生成短链接
  16. FusionStorage原理及组件
  17. 微信小程序手机摇一摇功能
  18. python Numpy 中的矩阵向量乘法(np.multiply()、np.dot()、np.matmul() 和 星号(*)、@)
  19. 《思维力:高效的系统思维》读书笔记02 - 深入理解系统化思维
  20. Android性能优化方法论

热门文章

  1. Device Tree Usage(转)https://elinux.org/Device_Tree_Usage
  2. Confluence 6 用户目录图例 - 使用 LDAP 授权,在用户第一次登陆时拷贝用户
  3. 最大连续区间和的算法总结(转)
  4. NetBeans+xdebug解决无法连接xdebug问题
  5. [转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
  6. 软件研发设计经验总结
  7. hdu 2594(kmp)
  8. apache---httpd.conf详解
  9. 小程序入门学习07--动态设置标题、转发
  10. Linux操作Oracle(6)——Oracle11g OPatch 打补丁全纪录【Oracle11g windowsX64位环境+OPatch11.2.0.3.28】及资源下载