关于C++中的友元函数的总结

2023-05-16

转载自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html


关于C++中的友元函数的总结

1.友元函数的简单介绍

1.1为什么要使用友元函数

在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了

使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。

实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

1.2使用友元函数的优缺点

1.2.1优点:能够提高效率,表达简单、清晰。

1.2.2缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。

2.友元函数的使用

2.1友元函数的参数:

因为友元函数没有this指针,则参数要有三种情况:

2.1.1 要访问非static成员时,需要对象做参数;

2.1.2 要访问static成员或全局变量时,则不需要对象做参数;

2.1.3 如果做参数的对象是全局对象,则不需要对象做参数;

2.2友元函数的位置

因为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段且没有区别。

2.3友元函数的调用

可以直接调用友元函数,不需要通过对象或指针

2.4友元函数的分类:

根据这个函数的来源不同,可以分为三种方法:

2.4.1普通函数友元函数

2.4.1.1 目的:使普通函数能够访问类的友元

2.4.1.2 语法:

声明: friend + 普通函数声明

实现位置:可以在类外或类中

实现代码:与普通函数相同

调用:类似普通函数,直接调用

2.4.1.3代码:

class INTEGER

 {

  friend void Print(const INTEGER& obj);//声明友元函数

 };

void Print(const INTEGER& obj)

{

   //函数体

}

void main()

{

  INTEGER obj;

  Print(obj);//直接调用

}

2.4.2类Y的所有成员函数都为类X友元函数—友元类

2.4.2.1目的:使用单个声明使Y类的所有函数成为类X的友元,它提供一种类之间合作的一种方式,使类Y的对象可以具有类X和类Y的功能。

2.4.2.2语法:

声明位置:公有私有均可,常写为私有(把类看成一个变量)

声明: friend + 类名(不是对象哦)

2.4.2.3代码:

class girl;

class boy

{

public:

  void disp(girl &);

};

void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数

{

  cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量

}

class girl

{

private:

  char *name;

  int age;

  friend boy; //声明类boy是类girl的友元

};

main函数就不写了和普通调用时一样的。

 

2.4.3类Y的一个成员函数为类X的友元函数

2.4.3.1目的:使类Y的一个成员函数成为类X的友元,具体而言:在类Y的这个成员函数中,借助参数X,可以直接以X的私有变量

2.4.3.2语法:

声明位置:声明在公有中 (本身为函数)

声明:friend + 成员函数的声明

调用:先定义Y的对象y---使用y调用自己的成员函数---自己的成员函数中使用了友元机制

2.4.3.3代码:

实现代码和2.4.2.3中的实现及其相似只是设置友元的时候变为friend void boy::disp(girl &);自己解决喽……

 

小结:其实一些操作符的重载实现也是要在类外实现的,那么通常这样的话,声明为类的友元是必须滴。

 

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

4.1 成员函数有this指针,而友元函数没有this指针。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C++中的友元函数的总结 的相关文章

  • RGB颜色对照表

    修改字体颜色 xff0c 大小使用示例如下 xff1a lt font color 61 FFB6C1 size 61 5 face 61 34 隶书 34 gt color 61 FFB6C1 size 61 72 face 61 34
  • 顿悟系列-JS对象键值修改,删除

    在Angular开发中 xff0c 遇到了JS对象键值对的知识实际运用 xff0c 不常见 xff0c 但实用 假设我们需要把 var a 61 a 34 张三 34 b 34 24 34 c 34 帅哥 34 a这个对象的键值全部改变自己
  • OVN简介

    作者简介 xff1a 郑敏先 xff0c 就职于诺云系统 xff08 上海 xff09 有限公司 工作地点为南京的诺云研发中心 担任解决方案工程师 本人博客为 xff1a http blog csdn net zhengmx100 一 为什
  • Windows 实现 读取 HDFS 上 文件内容

    前几天一直在搞HDFS文件的下载与上传 xff0c 但是在集群内部可以 xff0c 在集群外部却出现了错误 xff0c 照说 xff0c HDFS的保密协议应该没那么高吧 xff0c 不解中 后来才发现自己网上找的代码 xff0c 却并未理
  • 图像地点场景类型识别(PlaceCNN)实践

    从图像中判断图像场景所处的地点类型 xff0c 是图像理解的一种常见任务 本质上场景类别标注数据足够的情况下 xff0c 它可以属于图像分类的一种 xff0c 因此直接利用现有成熟的网络架构如ResNet就可以实现较高精度的图像涉及场所的识
  • 【2021最新】Keras自定义Loss函数+接受输入+KerasTensor天坑解决方法

    文章目录 自定义函数 43 输入方法第一个错误第二个错误 自定义函数 43 输入方法 环境配置 xff1a Tensorflow2 4 xff0c keras2 4 3 Keras自定义Loss函数 xff0c 增加输入的方法 xff0c
  • 从零使用OpenCV快速实现简单车牌识别系统

    从零使用OpenCV快速实现简单车牌识别系统 这篇文章献给所有第一次听说车牌识别ANPR但需要短时间实现的苦逼同学们 最近的小学期实训做的是一个车牌识别系统 xff0c 说实话真不知道学校怎么想的 xff0c 虽然说图像处理也算的上是数字媒
  • SUMO交通仿真-核心概念和基础知识速览

    文章目录 sumo环境变量设置注意事项路网配置JOSM对地图进行 96 清洗 96 交通需求建模route amp trip输入数据方法流量路由分配 检测线圈车辆属性设置速度分布 特殊设置驾驶员状态事故仿真 仿真运行设置sumocfg 输出
  • Haar分类器原理1——矩形特征与积分图

    引言 Haar分类器又称Viola Jones识别器 xff0c 是Viola和Jones分别在2001年的 Rapid Object Detection using a Boosted Cascade of Simple Features
  • window打开服务的dos命令

    微软系统必备的dos命令 开始 gt 运行 输入以下命令 xff0c 或者win 43 R xff0c 输入以下命令 1 gpedit msc 组策略 2 sndrec32 录音机 3 Nslookup IP地址侦测器 4 explorer
  • 如何在windows server 2003服务器上创建web服务器和ftp服务器

    将xp客户机和server2003设置为同一网段VMnet1上 配置web服务器的IP地址 配置xp客户机的IP地址 检测xp客户机和web服务器是否互通 将文件解压缩到d盘 xff0c 查看到三个文件夹 安装web服务组件 打开开始 管理
  • Kali Linux 2020.3如何安装中文输入法

    安装ibus拼音输入法 sudo apt get install ibus ibus pinyin 设置ibus为首选默认输入法 im config 输入法配置的重要提示信息 xff0c 点击OK即可 是否确认更改设置输入法 xff0c 点
  • Markdown编辑器

    Markdown编辑器 按照Markdown编辑器的使用环境 xff0c 可以将它们归纳为三类 平台集成工具 xff1a 各大在线博客 社区平台自带的写作工具 xff0c 比如CSDN 博客园 简书等 独立软件类 xff1a 下载到自己机器
  • devstack安装OpenStack Pike版本 (OVN+VLAN)

    控制节点配置文件 Sample DevStack local conf This sample file is intended to be used for your typical DevStack environment that 3
  • Fiddler抓包Java请求遇到的问题(一)

    Fiddler 解决无法监听 Java 的 HttpUrlConnection 请求 官网 https www telerik com fiddler Q JavaTraffic jre DproxySet 61 true DproxyHo
  • Win10系统正确设置MTU值加快WIFI速度的方法

    MTU是Maximum Transmission Unit缩写 xff0c 中文名 xff1a 最大传输单元 工具 原料 硬件 xff1a 电脑 操作系统 xff1a Windows 10 方法 步骤 第一步 xff1a 查询自己电脑的MT
  • CentOS-7 安装Lustre-2.10.1文件系统

    注 xff1a 原创文章 xff0c 转载请注明出处 一 文档说明 Lustre 是一种强大的平行 分布式文件系统 xff0c 通常用于HPC行业 主要组建包括 xff1a 元数据服务器 Metadataservers xff0c MDSs
  • 【华为练习题】求麻将清一色和牌问题

    华为练习题 求麻将清一色和牌问题 题目 题目描述 xff1a 清一色是麻将番种之一 xff0c 指由一种花色的序数牌组成的和牌 数字1 9 xff0c 每个数字最多有4张牌 我们不考虑具体花色 xff0c 我们只看数字组合 刻子 xff1a
  • 使用vscode开发stm32

    vscode 下载地址 xff1a https code visualstudio com 安装插件 xff1a Cortec Debug Cortex Debug Device Support Pack STM32F1 图1 vscode

随机推荐

  • typedef 的用法

    typedef 的用法 以下是参考部分 此部分参考自 xff1a http blog sina com cn u 572f7666010008dm 用途一 xff1a 定义一种类型的别名 xff0c 而不只是简单的宏替换 可以用作同时声明指
  • C语言变参的使用

    C语言中有很多变参的使用 xff0c 例如printf 的原型是int printf const char fmt xff0c 那么C语言是如何解析和处理这些变参的呢 xff1f 下面进行简单的总结 xff1a C语言中定义了下面的一些宏
  • strstr函数的精彩之处

    在C的库函数里面有很多精彩的代码 xff0c 仔细分析会体会到这些写法和思路的巧妙之处 写strstr函数的时候要判断两个字符换str1和str2什么时候开始匹配 xff0c 什么时候结束 xff0c 这两点都是比较容易做到的 xff0c
  • RISC与CISC

    作者 xff1a Austin Wang 链接 xff1a http www zhihu com question 20783321 answer 72598657 这里简单来谈一下 xff0c ARM和X86之间为什么不太具有可比性的问题
  • NandFlash和NorFlash的区别

    一 xff0e NAND和NOR的比较 NOR和NAND是现在市场上两种主要的非易失闪存技术 Intel于1988年首先开发出NOR flash技术 xff0c 彻底改变了原先由EPROM 和EEPROM一统天下的局面 紧接着 xff0c
  • 安装 CORD 之前需要了解的术语

    CORD Central Office Re Architected as a Data Center 是ONF组织推动的开源的边缘计算的项目 CORD 项目的官方资料包括源代码 xff0c 安装指导等 本文对官方安装指导涉及的一些术语进行
  • SoC嵌入式软件架构设计之一:系统内存需求评估

    博主 xff1a 吴跃前 转载自 xff1a http www cnblogs com yueqian scut p 4015046 html SoC嵌入式软件架构设计之一 xff1a 系统内存需求评估 内存是SoC System on C
  • S5PV210启动过程分析

    刚刚接触 S5PV210 xff0c 看了官方的数据手册感觉跟以前用的 STM32 单片机根本不在一个层面上 xff0c 当然两者的用途不同 xff0c 不具备可比性 可能之前习惯使用 STM32 等单片机 xff0c 现在接触 S5PV2
  • ARM支持的4种堆栈工作方式

    1 满递增堆栈 xff1a 堆栈指针指向最后压入堆栈的数据 xff0c 且由低地址向高地址生成 2 满递减堆栈 xff1a 堆栈指针指向最后压入堆栈的数据 xff0c 且由高地址向低地址生成 3 空递增堆栈 xff1a 堆栈指针指向下一个要
  • 前变址、回写前变址、后变址

    根据数据传输传输的时机以及在指令执行后基址寄存器是否被更新 xff0c 寄存器变址有前变址 回写前变址和后变址暗中方式 执行指令的时候 xff0c 如果先进行变址运算 xff0c 后传递数据 xff0c 那么这种方式就是前变址方式 如图1所
  • ubuntu 配置 tftp 服务器

    注意 xff1a 1 tftpboot为根目录 2 已经是root权限不用再加sudo 临时获取权限 3 使用netstat au grep tftp xff0c 保证tftp是启动的 出现 udp 0 0 tftp 则说明tftp服务已经
  • STM32启动文件详解

    先在RAM中分配系统使用的栈 xff0c RAM的起始地址为0x2000 0000 然后在RAM中分配变量使用的堆 然后在CODE区 flash 分配中断向量表 xff0c flash的起始地址为0x0800 0000 xff0c 该中断向
  • C语言细节之定义与声明

    什么是定义什么是声明 xff0c 似乎这俩个东西一样但是又有所区别 xff0c 思考一下 xff0c 如果你不能直接说出这二者的根本区别 xff0c 那么本文对你还是有点用处的 首先什么是定义 xff1f C 43 43 Primer 第四
  • 关于数据存储大小端模式的C语言题目

    int main int a 5 61 1 2 3 4 5 int ptr1 61 int amp a 43 1 int ptr2 61 int int a 43 1 printf 34 x x 34 ptr1 1 ptr2 return
  • 窥探引用和指针

    C语言面试题里面经常会出现一道题目 xff1a 向某个指定的内存地址写入特定的数据 xff0c 譬如向0x1234写入100 xff0c 做法如下 int 0x1234 61 100 解释一下就是将0x1234利用 int 强制转换为地址
  • STM32F101xxT6中VBAT 管脚上的怪现象

    转自 xff1a http bbs elecfans com forum php mod 61 viewthread amp tid 61 458808 amp extra 61 问题 xff1a 问题由某 UPS 制造公司提出 其工程师在
  • ST-LINK接口定义

    ST LINK接口定义 https www cnblogs com jieruishu p 9980350 html ST LINKIII管脚定义及接法 xff1a ST LINK IIILED灯三种状态含义 xff1a 常亮 xff1a
  • 罗德里格斯公式推导

    罗德里格斯公式推导 第一部分 向量 v 61 v x v
  • Ubuntu中的vi

    Windows中的常用编辑器 xff0c 如自带的notepad 比较好用的notepad 43 43 xff0c UltraEditor xff0c SlickEditor Linux中常用编辑器 xff0c 自带的最古老的vi 比较好用
  • 关于C++中的友元函数的总结

    转载自 xff1a http www cnblogs com BeyondAnyTime archive 2012 06 04 2535305 html 关于C 43 43 中的友元函数的总结 1 友元函数的简单介绍 1 1为什么要使用友元