友元 基础详解版 (友元函数、友元类、友元非成员函数和友元成员函数)

article/2025/9/17 11:57:37

友元

一般来说,类的公有成员能够在类外访问,私有的成员只能被类的其他成员函数访问。

在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有函数。也可以把一个类定义为另一个类的友元。

友元函数

如果在某个类的定义中用friend声明了一个外部函数(或者是其他类的成员函数,既可以是public型,也可以是private型)后,这个外部函数称为类的友元函数。

C++提供一种允许外部类和函数存取类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元(或友元函数),使其具有类成员函数的访问权限,但友元本身不是类的成员,它不属于任何类

使用:

  • 关键字:friend开头的函数原型,声明可以放在类的私有部分,或者公有部分,无区别,都说明是该类的一个友元函数,但它不是该类的成员函数,不属于任何类;
  • 友元函数的定义,可以在类的内部或外部;
  • 在类外定义友元函数时,与普通函数的定义一样,不应在函数名前用类名加以限制。因此友元函数不像成员函数那样在调用时使用对象名,友元函数要多类的成员进行访问,必须在参数表中显式指明要访问的对象。
  • 友元函数是能访问类的所有成员的普通函数,一个函数可以是多个类的友元函数,只需要在各个类中分别声明;
  • 调用与一般函数的调用方式及原理一致;
  • C++不允许将构造函数、析构函数和虚函数声明为友元函数

友元的非成员函数

友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,需要在类的定义中加以声明,声明时只需在友元的名称前加关键字**friend**,

friend 函数原型;

非成员函数的友元函数有如下特点。

  • 在类内只需对函数进行声明,声明位置没有要求,可以出现在类的任何地方,包括在privatepublic部分。
  • 函数定义要放在类外,具体定义位置没有要求。
  • 友元函数不能直接访问类的成员,必须通过访问对象来实现。为此,必须传递类对象作为函数参数,采用传值、传指针或传引用方式均可,出于对程序执行效率的考虑,建议使用类对象的引用作为参数。
  • 友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用作用域限定符“::”指示属于哪个类,只有成员函数才使用“::”作用域符号。
  • 一个函数可以同时作为多个类的友元函数。

非成员形式的友元函数代码如下所示。

//友元函数的例子
#include <iostream>
#include <math.h>
using namespace std;
class Point
{
public:Point(double i, double j)                                  //构造函数,带默认参数值{x = i;y = j;}void disp(){cout<<"("<<x<<","<<y<<")"<<endl;}private:double x;double y;friend double dis(Point &a, Point &b);                      //友元函数的声明
};double dis(Point &a, Point &b)                                 //类外,友元函数的定义
{double dx=a.x-b.x;                                         //友元函数可以访问类的private成员double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);
}int main()
{Point p1(3.0,4.0);                                        //声明两个Point类的对象p1和p2;Point p2(6.0,8.0);p1.disp();                                                //显示p1和p2点的信息p2.disp();                    cout<<"Distance is "<<dis(p1,p2)<<endl;                   //友元函数的调用return 0;
}

友元的成员函数

除了一般的函数可以作为类的友元外,一个类的成员函数也可以作为另一个类的友元。这样的函数不仅可以访问本类的所有成员,还可以访问其友元类的所有成员。需要注意的是,当在一个类中的某个成员函数定义为另一个类的友元函数时需要首先定义此类。

例如,要定义类A的某个函数为类B的友元函数,那么需要先定义类B,然后再进行类A的成员函数与B友元的定义。

对于一个友元成员来说,它不仅可以访问自己所在类中的私有成员和公有成员,同时还可以的一个对声明为友元类的类的成员进行访问。使用友元成员可以使得两个类之间出现互相访问“门”。这样解决了由于类的保护机制而出现的其他类绝对不允许访问的情况。

成员形式的友元函数代码如下所示。

//友元函数的例子
#include <iostream>
using namespace std;
class Point;                                                 //声明Point类:在line类的dis函数中传递对象参数。因此必须在line类之前对Point类                                                              //声明,且由于PoInt类的定义在后面,只能对Point对象采取传引用或传指针处理;
class line                                                    //友元函数所在的类必须选定义,即line类必须定义在Point类前面
{public:double dis(Point &p1, Point &p2);                         //友元函数的原型,作为line类的成员函数
};class Point
{
public:Point(double i, double j)                                  //构造函数,带默认参数值{x = i;y = j;}void disp(){cout<<"("<<x<<","<<y<<")"<<endl;}private:double x;double y;friend double line::dis(Point &a, Point &b);               //友元的声明
};double line::dis(Point &a, Point &b)                           //line类内的成员函数dis()的实现,作为Point类的友元函数;
{double dx=a.x-b.x;                                         //友元函数可以访问类的private成员double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);
}int main()
{line line1;                                               //声明一个line类的对象line1;Point p1(3.0,4.0);                                        //声明两个Point类的对象p1和p2;Point p2(6.0,8.0);p1.disp();                                                //显示p1和p2点的信息p2.disp();                    cout<<"Distance is "<<line1.dis(p1,p2)<<endl;                   //友元函数的调用return 0;
}

在这里插入图片描述

友元类

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。

定义友元类的语句格式如下:

friend class 类名(即友元类的类名);

其中:friendclass是关键字。类名必须是程序中的一个已定义过的类。

//类B是类A的友元类
class A
{
Public:friend class B;
};

友元类B中的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
当把B声明为A类的友元类时,并不一定要求先定义B,只要先对其进行声明即可,这点区别于友元的成员函数。

  • 友元关系是单向的,不具有交换性。若类X是类Y的友元,类Y不一定是类X的友元,要看在类中是否有相应的声明。
  • 友元关系不具有传递性。若类X是类Y的友元,类Y是Z的友元,类X不一定是类Z的友元,同样要看类中是否有相应的申明。
  • 友元关系不能被继承。

http://chatgpt.dhexx.cn/article/7EsTe58O.shtml

相关文章

win7快捷方式去箭头_win7旗舰版桌面图标快捷方式箭头变成黑块怎么办?

大家在使用win7的过程中&#xff0c;发现桌面图标快捷方式箭头变成黑块&#xff0c;这时我们应该怎么解决呢&#xff0c;请继续往下看&#xff01; 操作过程&#xff1a; 1、在winr调出运行窗口&#xff0c;键入regedit.exe&#xff0c;回车&#xff0c;打开注册表编辑器。 依次…

去掉桌面快捷方式箭头和快捷方式字样--美化桌面快捷方式

去掉桌面快捷方式箭头和快捷方式字样--美化桌面快捷方式&#xff0c;如图&#xff1a; 下载地址&#xff1a; https://download.csdn.net/download/lhyhr/12700649

恢复Windows7快捷方式小箭头的方法

电脑重新安装了一个Windows7的纯净版系统&#xff0c;结果快捷方式的小箭头不见了。在网上查到的各种修改注册表的方式都试过之后&#xff0c;依然无效。 后来看到有人介绍可以使用软件恢复&#xff0c;于是下载了一个软件&#xff1a;Windows快捷方式小箭头管理&#xff0c;结…

Windows系统桌面快捷方式图标去除小箭头

在注册表”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons“项下新建字符串值&#xff0c;命名为29&#xff0c;数据为&#xff1a;”%systemroot%\system32\imageres.dll,197“。 注销重新登录后小箭头即不显示&#xff0c;反之则删除名…

win8电脑怎么把计算机快捷方式,Win8怎么隐藏桌面快捷方式小箭头_Win8去掉快捷方式箭头-192路由网...

本文主要介绍了Win8电脑上&#xff0c;去掉桌面快捷方式小箭头的方法。Win8电脑桌面上的快捷方式&#xff0c;默认是有一个小箭头的&#xff0c;看起来非常不美观。 因此&#xff0c;很多用户想把Win8快捷方式上的小箭头去掉&#xff0c;却又不知道应该如何设置。 其实去掉Win8…

去除win10桌面图标快捷方式小箭头

同样用命令行来解决&#xff0c;管理员打开CMD&#xff0c;输入下面代码 &#xff08;也可以做成bat批处理文件&#xff0c;管理员运行&#xff09; 移除小箭头&#xff1a; reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Ic…

Win11清除桌面快捷方式小箭头

Win11清除桌面快捷方式小箭头 1.WinR输入regedit&#xff0c;进入注册表。 2.找到路径\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons 选择右边名称为29的项&#xff08;部分电脑系统没有Shell Icons这个选项&#xff0c;那么在上一级…

玩机技巧|去除Windows桌面快捷方式图标左下角上的小箭头

当我们下载了软件之后在桌面上左下角都会有一个快捷方式的小箭头&#xff0c;如何去掉这个小箭头让桌面图标变得更加清爽一些呢。现在教大家一个简单的办法。 修改注册表 编辑代码 管理员身份运行 选择去除小箭头 检测 恢复小箭头 修改注册表 去除这个小箭头的方法很简单&…

win10去掉快捷方式小箭头(win10桌面快捷方式小箭头怎么去掉)

桌面快捷方式小箭头怎么去掉 在我的电脑处右击——属性——高级——性能中的设置——视觉效果中选择调整为最佳外观&#xff0c;确定后即可。或者选择自定义&#xff0c;然后在窗口里把“在桌面上为图标标签使用阴影”这条前面的勾去掉就行了。 WIN10怎么去掉快捷方式小箭头&am…

如何恢复快捷方式上的小箭头

接上一篇博客&#xff0c;我们应该怎么把已经去掉的小箭头恢复。 第一步&#xff0c;新建一个txt文本文档&#xff0c;输入中括号内的内容&#xff1a; 【 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\PIPFile] “IsShortcut”"" [HKEY_CLASSES_ROOT\…

win11删除快捷方式的小箭头.bat

步骤 新建一个txt文件&#xff0c;改名为xxx.bat右键&#xff0c;编辑&#xff0c;修改内容为&#xff1a; reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197…

去除Ubuntu 20桌面图标的快捷方式箭头

去除Ubuntu 20桌面图标的快捷方式箭头 当创建快捷方式到桌面时&#xff0c;图标上会显示一个快捷方式箭头&#xff0c; 真的很难看&#xff0c;想要隐藏&#xff0c;但又无法找到设置的地方在哪里&#xff0c; 于是我想到一个简单粗暴的方法&#xff0c;直接将这个图片替换成…

Win10 去除桌面快捷方式箭头

Win10去除桌面快捷方式小箭头 新建文本文档&#xff0c;将下面的代码复制进去&#xff0c;保存。重命名文件&#xff0c;改为 文件名.bat&#xff0c;保存。(注意这里的后缀必须是bat格式。) 然后右键&#xff0c;以管理员身份运行该文档&#xff0c;即可去除小箭头。 reg …

linux去除快捷方式箭头,焦点去除Win8快捷方式箭头软件

焦点去除Win8快捷方式箭头软件是焦点工作室为Win8用户打造的去除箭头专属软件&#xff1b;软件界面依旧延续了界面简洁、通俗明了、便捷实用的经典特色。。 相关软件软件大小版本说明下载地址 焦点去除Win8快捷方式箭头软件是焦点工作室为Win8用户打造的去除箭头专属软件&#…

解决win10去掉桌面快捷方式箭头的方法

大家安装完一个软件后&#xff0c;都会在桌面上自动生成一个快捷方式&#xff0c;还会在左下角出现一个小箭头&#xff0c;很多用户觉得看起来不美观&#xff0c;那有什么办法可以去掉快捷方式上面的小箭头吗&#xff1f; 操作过程&#xff1a; 1、按下键盘上的“WinR”直接打开…

好用的网页在线客服工具

在线实时聊天是线上店铺吸引并留住客户的有力工具&#xff0c;在线聊天能够提高潜在客户的服务体验&#xff0c;而好用的网页在线客服工具可以成为客服人员的好帮手。 前言 线下门店有专职的销售人员在场&#xff0c;客户遇到问题随时可以进行咨询&#xff0c;极有可能直接促成…

2022淘宝中秋营销攻略,请查收!

又一年中秋快到了&#xff0c;开淘宝店的同行小伙伴们打算上啥促销活动呀&#xff1f;以怎样的形式开展呢&#xff1f;这篇中秋营销攻略来得很及时啦&#xff01;你一定要看哦&#xff01; 一、活动策划&#xff08;运营须知&#xff09; 中秋大家可能第一时间想到就是月饼啊&…

简单几招教您玩转客服营销,提高宝贝转化率!

其实&#xff0c;做淘宝的卖家都明白&#xff0c;宝贝卖不出去很多都是因为没有及时的催付&#xff0c;因此导致流失了很多订单。从顾客的行为合理分析来看&#xff0c;恰当时机进行催付&#xff0c;不仅可以提高店铺销售额&#xff0c;降低推广成本&#xff0c;同时可以达到事…

【客服准则】浅谈服务差异化对转化的重要性

大家发现吗&#xff1f;售卖相同类目的店铺&#xff0c;除去产品质量、付费推广等因素&#xff0c;客户服务的差异化直接影响着店铺的成交转化率。 据中商情报网《2017.12~2021.12网络购物用户规模及使用情况》显示&#xff1a;“80-90 后”网购普及最高&#xff0c;“95 后”消…

差评回复模板

昨天一个做电商的朋友告诉我&#xff1a;她又摊上了好几条差评。有多少商家和我朋友一样&#xff0c;每次遇到差评都不知道怎么回复呢&#xff1f;今天小编无偿分享一些处理差评的回复模板给各位&#xff0c;大家可以酌情收录。 首先大家无论是劝顾客删评&#xff0c;还是劝删评…