友元的目的是让类外函数或者其他类访问到类内的私有属性。友元实现的三种方式:全局函数做友元、类做友元、成员函数做友元。

1、全局函数做友元

#include <iostream>
#include <string.h>
using namespace std;class Home{// 全局函数作为友元friend void goodfriend(Home &home);
public:Home(){bedroom = "bed room";livingroom = "living room";}string livingroom;
private:string bedroom;
};void goodfriend(Home &home){cout << home.livingroom << endl;cout << home.bedroom << endl;
}void test(){Home a;goodfriend(a);
}int main() {test();return 0;
}

2、类做友元

#include <iostream>
#include <string.h>
using namespace std;class Home{// 类作为友元friend class Person;
public:Home(){bedroom = "bed room";livingroom = "living room";}string livingroom;
private:string bedroom;
};class Person{
public:Person(){home = new Home;}void visit(){cout << home->livingroom << endl;// 作为友元即可访问该类的私有属性cout << home->bedroom << endl;}
private:Home *home;
};void test(){Person p;p.visit();
}int main() {test();return 0;
}

3、成员函数做友元

#include <iostream>
#include <string.h>
using namespace std;class Home;class Person{
public:// 不能在此处实现函数,因为Home类只进行声明并没有实现Person();void visit1();void visit2();
private:Home *home;
};class Home{// 成员函数作为友元friend void Person::visit1();
public:Home(){bedroom = "bed room";livingroom = "living room";}string livingroom;
private:string bedroom;
};// Person类中函数的实现,放在Home类实现之后
Person::Person(){home = new Home;
}
void Person::visit1(){cout << "visit1 " << home->livingroom << endl;cout << "visit1 " << home->bedroom << endl;
}
void Person::visit2(){cout << "visit2 " << home->livingroom << endl;// 访问私有属性bedroom,不能进行,因为visit2不是Home类的友元
//  cout << "visit2 " << home->bedroom << endl;
}void test(){Person p;p.visit1();p.visit2();
}int main() {test();return 0;
}

C++语法(二十一)友元的三种实现相关推荐

  1. 我的物联网项目(二十一) 摇摇车三种消费模式和城市合伙人

    我们的摇摇车支持三种消费模式: 1.投币 和传统摇摇车一样,通过一元的硬币来启动摇摇车,公司其实在做这个平台当时的初衷是不做投币的,只做app扫码,一来方便用户,毕竟这几年来流行各种扫码.二来做线上运 ...

  2. 展望二十一世纪第三个十年

    LiveVideoStack有幸生于二十一世纪的第二个十年,接下来聊聊下一个十年. 文 / 包研 距离2019年成为历史只有十几天了,十几天后我们将迎来二十一世纪第三个十年.2019对于LiveVid ...

  3. 通过指针访问二维数组的三种方法

    下面总结了一下通过指针访问二维数组的三种方法,里边涉及指针.指针数组.数组指针.指向指针的指针以及二维数组的应用,愿对于大家理解和使用指针有所参考和帮助. 程序如下: #include <std ...

  4. PHP开发日志 ━━ php、javascript生成二维码的三种方法

    最简单最实例的goolge开源方法 推荐手册:php完全自学手册 1.google开放api 代码如下: $urlToEncode="http://www.helloweba.com&quo ...

  5. 在web页面上快速生成二维码的三种实用方法

    转载自:在web页面上快速生成二维码的三种实用方法 二维码是桌面和移动端快速分享的高效手段之一,这里介绍两个不错的快速开发二维码的方法,和大家分享一下~~ 方法1:使用极客标签提供的二维码快速生成服务 ...

  6. C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

    关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...

  7. 前端一HTML:二十CSS的三种存在方式

    1. 行内样式(存在于标签之中,用style属性设置) <p style="color:red">这是内容</p> 2. 嵌入样式(也称内联样式, 存在于t ...

  8. 用malloc开辟二维数组的三种办法

    第一种办法:用指针数组:首先看一下原理图(以开辟整型二维数组三行四列为例,以下都是): 先看一下用malloc申请一维数组: int *p=(int *)malloc(10*sizeof(int)); ...

  9. 生成二维码的三种方式

    一:二维码的概念 二维条码(2-dimemsional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的图形 二: 二维码的分类 通常分为三 ...

最新文章

  1. 科学成为时尚的可行办法
  2. 路由设计技术基础(Fundamentals of routing design technology)
  3. 对不起,我就是喜欢问你Spring构造器注入原理
  4. 阿里云主机安装Memcached扩展优化WordPress
  5. 现行的web开发框架分析
  6. linux打补丁前如何备份,关于Linux下给文件打补丁
  7. 机器学习基石-作业二-第10题分析
  8. mpvue使用vant Weapp运行npm run build命令打包后失效
  9. 如何将微商管理模式流程化
  10. html5微信分享图标和文本设置,科技常识:Html5 实现微信分享及自定义内容的流程...
  11. 春季个人训练赛 5(广工新生赛)
  12. python_业余学习_分词工具jieba 正则表达式清洗微博文本特殊符号 最大匹配算法
  13. 编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。
  14. html5版堆糖,堆糖(Duitang)
  15. 郭涛 黄渤 田原09贺岁大片《高兴》DVD修正版
  16. Dede URL优化拼音命名
  17. Java:利用接口实现打印机案例(墨盒有彩色和黑白色,纸张有A4纸和B5纸)
  18. 大工21春《船舶制图》大作业离线作业
  19. CodeCraft-20 (Div. 2)(C(本原多项式) D (BFS) E (状压+dp))
  20. 解决:ERROR: Attempting to operate on hdfs journalnode as rootERROR: but there is no HDFS_JOURNALNODE_

热门文章

  1. <汇编>七种寻址方式
  2. QMI8658 - 姿态传感器学习笔记 - Ⅱ
  3. WAS上配置数据源连接失败
  4. 基础博弈论(NIm,威佐夫,巴什游戏)
  5. Vlan 单线复用之复式二层住宅网络改造实操案例(一)
  6. SpringCloud分布式框架
  7. Hadoop安装与部署
  8. UML入门1:事物和事物关系简介
  9. 《2021年度中国计算机视觉人才调研报告》正式发布
  10. 英语单词积累8.10