友元

友元分为:友元函数和友元类
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多 用

全局函数做友元函数

  1. 全局函数写到类中做声明 并且最前面写关键字 friend

  2. 友元函数可访问类的私有成员,但不是类的成员函数

  3. 友元函数不能用const修饰 友元函数可以在类定义的任何地方声明,不受类访问限定符限制

  4. 一个函数可以是多个类的友元函数

  5. 友元函数的调用与普通函数的调用和原理相同

     #include<iostream>#include<string>using namespace std;class Building{//让全局好基友函数变为我的好朋友  友元函数friend void goodGay(Building *building);public:Building(){this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";}//客厅 卧室public: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=new Building;goodGay(building);}int main(){test01();system("pause");return 0;}
    

类作为友元类

  1. 友元关系不能被继承
  2. 友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
  3. 友元关系不具有传递性,类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友

#include
#include
using namespace std;

class Building;class goodGay
{public:goodGay();void visit();private:Building * building;
};class Building
{//让好基友类 作为Building的好朋友friend class goodGay;
public:Building();public:string m_SiteingRoom;//客厅
private:string m_BedRoom;//卧室
};goodGay::goodGay()
{building = new Building;
}void goodGay::visit()
{cout << "好基友正在访问:" << this->building->m_SiteingRoom << endl;cout << "好基友正在访问:" << this->building->m_BedRoom<< endl;
}Building::Building()
{this->m_SiteingRoom = "客厅";this->m_BedRoom = "卧室";}void test01()
{goodGay gg;gg.visit();
}int main()
{test01();system("pause");return 0;
}

成员函数作为友元函数

    #include<iostream>#include<string>using namespace std;//只让visit可以作为Buildingde的好朋友,visit2不可以访问私有属性class Building;class goodGay{public:goodGay();void visit();void visit2();private:Building * building;};class Building{//让成员函数visit作为友元函数friend void goodGay:: visit();public:Building();public:string m_SiteingRoom;//客厅private:string m_BedRoom;//卧室};goodGay::goodGay(){building = new Building;}void goodGay::visit(){cout << "好基友正在访问:" << this->building->m_SiteingRoom << endl;cout << "好基友正在访问:" << this->building->m_BedRoom<< endl;}void goodGay::visit2(){cout << "好基友正在访问:" << this->building->m_SiteingRoom << endl;//cout << "好基友正在访问:" << this->building->m_BedRoom << endl;}Building::Building(){this->m_SiteingRoom = "客厅";this->m_BedRoom = "卧室";}void test01(){goodGay gg;gg.visit();gg.visit2();}int main(){test01();system("pause");return 0;}

c++中友元函数详解相关推荐

  1. Matlab中 pdist 函数详解

    学习笔记,仅供参考,有错必纠 转载自:Matlab中 pdist 函数详解(各种距离的生成); pdist Pairwise distance between pairs of objects. Sy ...

  2. c++ memset 语言_C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, si ...

  3. matlab中xcorr函数详解

    Matlab中xcorr函数详解 引言 在matlab中查找相关函数时,找到了xcov函数和xcorr函数,仔细看了帮助文档,发现虽然计算公式不一样,但是两个函数用法相同,计算出的值也相同,于是在翻了 ...

  4. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  5. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  6. java 中indexOf函数详解

    最近在解决android 中listview的查找问题,用到了indexOf 方法,仔细看了下源码,详解如下. private static int indexOf(String source, St ...

  7. PHP中preg_match函数详解

    目录 函数形式 函数功能 参数详解 pattern sbuject matches 返回值 例子 函数形式 preg_match(string $pattern, string $subject, a ...

  8. python调用php命令行,python调用php函数 python怎样调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

  9. python echo函数_python如何调用php文件中的函数详解

    前言 python调用php代码实现思路:php文件可通过在terminal中使用php命令行进行调用,因此可使用python开启子进程执行命令行代码.函数所需的参数可通过命令行传递. 测试环境 1. ...

最新文章

  1. 人脑是怎么防止梯度消失和梯度爆炸的?
  2. 抢滩“体验经济”,“真快乐”布局娱乐化零售的野心
  3. Ubuntu 下 Git 服务器的安装和初级配置
  4. 怎么判断手机在抖动_集合来了!激光头切割过程中一直抖动、跳动、上下动是什么原因?...
  5. linux编译安装madam,linux 下 使用 mdadm 创建阵列
  6. JS疑惑-1(连续赋值)
  7. 玩转控件:封装Dev的LabelControl和TextEdit
  8. javaee编程题_在JavaEE中使用CDI的简单面向方面的编程(AOP)
  9. mediarecoder 安卓_android 通过MediaRecorder实现简单的录音示例
  10. WEB前端开发规范文档
  11. 分享“消防图纸”识图方法,让你一眼秒懂!
  12. web前端开发技术----登录页面
  13. 终于搞定电子专利网上申请了
  14. 【蓝桥杯】真题训练 2014年C++A组 题4 史丰收速算
  15. blos硬盘启动台式计算机,电脑如何bios设置硬盘启动顺序?掌握这6大类型是关键!...
  16. IPFS李鑫:fil币2021年价格预测
  17. 认识 Iconfont 以及什么是 .eot、.woff、.ttf、.svg
  18. 脊髓炎起病急 该做好哪些治疗呢?
  19. 《炬丰科技-半导体工艺》 高频磷化铟芯片晶圆级背面加工
  20. 数字信号内插方法的python实现

热门文章

  1. ODAC(V9.5.15) 学习笔记(四)TCustomDADataSet(2)
  2. UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
  3. 关于性能测试的通俗解释
  4. PostgreSQL学习手册(数据库维护) 转
  5. Virtools自己编译播放器
  6. [SlickEdit] SlickEdit支持目录别名FTP控件更新
  7. 四川汶川地震祈福赈灾宣传画、报纸头版精选第二版(超多图)
  8. mac你没有权限打开应用程序_如何管理Mac的隐私权限控制
  9. 线性回归csv数据集_测试数据科学家线性回归的30个问题
  10. oracle系统库名,Oracle 札记之 一:数据库名,数据库实例名,数据库域名,操作系统环境变量...