我把你当朋友,你就能访问我的一切(是真的一切);但你不将我当作朋友,我就不能访问你的一切。

定义与使用

在类A中,用friend关键字可以将一个全局函数声明为该类的“朋友”,也可以将另一个类声明为该类的“朋友”。

(1)friend声明语句:位置自由,一般放在类体大括号的最前头。

(2)朋友的权利:可以无限地访问该类的所有成员。不受protected/private的限制

class Object
{//将全局函数Print声明为“朋友”friend void Print(Object* p);//将类Something声明为“朋友”friend class Something;
};

来看一个简单的例子:

#include "pch.h"
#include <iostream>
#include "stdio.h"class Object
{friend void Print(Object* p);friend class Something;
public:Object(int v): value(v){}
private:int value;
};void Print(Object* p)
{printf("value:%d \n", p->value);
}class Something
{
public:void Test(Object* p){printf("value:%d \n", p->value);}
};int main()
{Object a(5);Print(&a);Something s;s.Test(&a);return 0;
}

注意:朋友关系是单向的,Something类可以自由访问Object类,但反过来不行。

负面作用:friend是不常用的语句,它破坏了访问修饰符的作用,对类的封装构成威胁。

正面作用:在封装一个模块时,模块中的多个类,那么他们之间可以互为朋友以便操作。也就是说模块内部都是朋友,可以互相使用,但外部的人就得受访问修饰符的限制。(一般只有这种情况才会用到friend)

友元函数和类的成员函数的区别

(1)成员函数有this指针,而友元函数没有this指针。

(2)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。

【C++】类的朋友(friend)相关推荐

  1. 类微信朋友圈图片放大效果,点击图片放大动画

    要用到的 就是坐标转换方法 - (CGRect)convertRect:(CGRect)rect toView:(UIView *)view; 1:我这里演示的是 tableviewHeader上子v ...

  2. C++友元函数和友元类(三)

    友元类 不仅可以将一个函数声明为一个类的"朋友",还可以将整个类声明为另一个类的"朋友",这就是友元类.友元类中的所有成员函数都是另外一个类的友元函数. 例如将 ...

  3. public 函数_Chapter18:友元函数和友元类

    这一章的问题从"如何畅通无阻的访问另一个类"开始,类的属性有private.protected.public,根据继承权限有不同的访问方式.但是类之间的关系不一定是继承,有时一个类 ...

  4. c ++查找字符串_C ++朋友功能| 查找输出程序| 套装2

    c ++查找字符串 Program 1: 程序1: #include <iostream> using namespace std; class Sample1 { int A, B; f ...

  5. 深入浅出VC++串口编程--第三方类

    串口类 从本系列文章连载三.四可以看出,与通过WIN32 API进行串口访问相比,通过MScomm这个Activex控件进行串口访问要来的方便许多,它基本上可以向用户屏蔽多线程的细节,以事件(发出On ...

  6. 初入c++(三)this指针,友元函数,友元类

    1.c++中的this指针 指向当前对象,通过它可以访问当前对象的所有成员.当前对象就是正在使用的对象: 在类的内部使用,可以访问所有的成员,public,private,protect this只能 ...

  7. 微信如何定时发朋友圈?一招教你解决

    在人们依赖微信进行沟通.获取信息的同时,微信营销也不可避免,在微信朋友圈推广自己的产品或服务,成为至今最为火爆的一种营销方式.朋友圈营销的优势是信任,缺点是容易透支信任. 或许你发现了朋友圈的价值,也 ...

  8. 友元(友元函数、友元类、类成员函数的友元)

    友元(友元函数.友元类.类成员函数的友元) (friend)友元机制:允许一个类将对其非公有成员的访问权限授予指定的函数或者类. 我们可以将友元大致分为3类: 友元函数 友元类 类成员函数的友元 一: ...

  9. 日期类的实现(C++)

    目录 注意: 1.作用域 2.实例化 3.this指针 4.std 1).std是什么? 2).为什么将cout放到名字空间std中? 3).std都是什么时候使用? 5.C语言"/&quo ...

最新文章

  1. Docker学习(五)-----Docker查看日志
  2. poj1564 Sum It Up dfs水题
  3. LeetCode Minimum Height Trees(拓扑排序)
  4. Python之pandas:pandas中常见的数据类型转换四大方法以及遇到的一些坑之详细攻略
  5. 乱骑共享单车?黑名单见!
  6. 惠普服务器c盘格式化提示win7系统盘,通过U盘重装系统,已经格式化C盘提示如下...
  7. 重新配置Domino服务器
  8. 精品软件 推荐 TM2013 性能不好的电脑可以用这软件替代QQ
  9. 蚂蚁课堂视频笔记思维导图-3期 三、性能优化专题
  10. python os模块安装方法_Python模块——os模块详解
  11. 云计算十字真言及其在小博无线的实践
  12. Python+selenium批量把网页文档保存为PDF
  13. IOS收起键盘的几种办法(摘抄自唐巧《iOS开发进阶》)
  14. 幻灯片自动播放的实现
  15. Java— 齐头并进完成任务—多线程
  16. 安全管家安卓_飞鸟清理管家app下载-飞鸟清理管家官方版下载v1.0.5
  17. Nette框架未授权任意代码执行漏洞分析
  18. 跟着Cell学作图 | 12.韦恩图(Vennerable包)
  19. 具有更高电流SIO通道的四路IO-Link主机:线性设计注意的ADI电源---凯利讯半导体
  20. 【词目】:勿谓言之不预也

热门文章

  1. div id 与div class 的区别
  2. ps42k20服务器出现问题_香港代理服务器和香港服务器有什么不同,如何选择?-行业新闻...
  3. 组合保险策略及相应模拟测算工具----Discrete Hedging: Guaranteed CPPI Structures
  4. Python 列表(list)
  5. Android重点面试题
  6. NOIP2018 模拟测试 day1 战棋游戏
  7. 算法学习第一周union find solution
  8. Java多线程sleep和wait的区别
  9. 盘点那些具有特色的写作软件
  10. python之numpy数组的花式索引