C++——友元

article/2025/9/16 17:05:10

友元概述

在讲述类的内容时说明了隐藏数据成员的好处,但是有些时候,类会允许有一些特殊的函数直接读写其私有数据成员。
使用friend关键字可以让特定的函数或者别的类的所有成员函数对私有数据成员进行读写。这既可以保持数据的私有性,又能够使特定的类或函数直接访问私有数据。
有时候,普通函数需要直接访问一个类的保护或私有数据成员。如果没有友元机制,则只能将类的数据成员声明为公共的,从而任何函数都可以无约束地访问它。
普通函数需要直接访问类的保护或私有数据成员的原因主要是为了提高效率。
例如,没有使用友元函数的情况如下:

代码:

#include<iostream>
using namespace std;class Rectangle
{
public:Rectangle(){height = 0;width = 0;}Rectangle(int top1,int top2,int bottom1,int bottom2){height = bottom2 - top2;width = bottom1 - top1;}int getHeight(){return height;}int getWidth(){return width;}protected:int height;int width;
};int rectArea(Rectangle &myRect)  //不是友元函数的定义
{return myRect.getHeight() * myRect.getWidth();
}int main()
{Rectangle rg(0,0,100,100);cout << "Result of rectArea is:" << rectArea(rg) << endl;return 0;
}

结果:
image.png
在代码中可以看到,rectArea函数的定义只能对类中的函数进行引用,因为类中的函数属性都为共有属性,对外是可见的,但是数据成员的属性为受保护属性,对外是不可见的,所以只能使用共有成员函数得到想要的值。
下面来看一下使用友元函数的情况:
代码:

#include<iostream>
using namespace std;class Rectangle
{
public:Rectangle(){height = 0;width = 0;}Rectangle(int top1,int top2,int bottom1,int bottom2){height = bottom2 - top2;width = bottom1 - top1;}int getHeight(){return height;}int getWidth(){return width;}friend int rectArea(Rectangle &myRect);  //声明为友元函数protected:int height;int width;
};int rectArea(Rectangle &myRect)  //友元函数的定义
{return myRect.height * myRect.width;//return myRect.getHeight() * myRect.getWidth(); 用这个效果是一样的,不过友元函数多了一个可以直接访问这些隐藏数据成员
}int main()
{Rectangle rg(0,0,100,100);cout << "Result of rectArea is:" << rectArea(rg) << endl;return 0;
}

结果:
image.png
在rectArea函数的定义中可以看到使用Rectangle的对象可以直接引用其中的数据成员,这是因为在Rectangle类中将rectArea函数声明为友元了。
从中可以看到使用友元保持了Rectangle类中数据的私有性,起到了隐藏数据成员的好处,又使得特定的类或函数可以直接访问这些隐藏数据成员。

友元类

对于类的私有方法,只有在该类中允许访问,其它类是不能访问的。但是在开发程序时,如果两个类的耦合度比较紧密,能够在一个类中访问另一个类的私有成员会带来很大的方便。C++提供了友元类和友元方法来实现访问其它类的私有成员。当用户希望另一个类能够访问当前类的私有成员时,可以在当前类中将另一个类作为自己的友元类,这样在另一个类中就可以访问当前类的私有成员了。例如:

#include<iostream>
#include<string.h>
using namespace std;class Item
{
private:char name[100];void outputName(){cout << name << endl;}public:friend class List;void setItemName(const char *pchData){if(pchData != NULL){strcpy(name,pchData);}}Item(){memset(name,0,128);}
};class List
{
private:Item item;
public:void outputItem(){item.setItemName("ShangHai");item.outputName();}
};int main()
{List i1;i1.outputItem();return 0;
}

结果:
image.png
在定义Item类时,使用friend关键字将List类定义为Item类的友元,这样List类中的所有方法都可以访问Item类中的私有成员。在List类的outputItem方法中,语句“item.outputName();”演示了调用Item类的私有方法outputName。

友元方法

在开发程序时,有时需要控制另一个类对当前类的私有成员的方法。例如,假设需要实现只允许List类的某个成员访问Item类的私有成员,而不允许其它成员函数访问Item类的私有数据。这可以通过定义友元函数来实现。在定义Item类时,可以将List类的某个方法定义为友元方法,这样就限制了只有该方法允许访问Item类的私有成员。
例子:

#include<iostream>
using namespace std;class Item;
class List
{
private:Item *m_pItem;
public:List();~List();void OutputItem();
};class Item
{friend void List::OutputItem();
private:char m_Name[100];void OutputName(){cout << m_Name << endl;}
public:void SetItemName(const char *pchData){if(pchData !=NULL){strcpy(m_Name,pchData);}}Item(){memset(m_Name,0,128);}
};
void List::OutputItem()
{m_pItem->SetItemName("ShangHai");m_pItem->OutputName();
}
List::List()
{m_pItem = new Item();
}
List::~List()
{delete m_pItem;m_pItem = NULL;
}
int main()
{List list;list.OutputItem();return 0;
}

结果:
image.png
上述代码中,在定义Item类时,使用friend关键字将List类的OutputItem方法设置为友元函数,在List类的OutputItem方法中访问了Item类的私有方法OutputName。

对于友元函数来说,不仅可以是类的成员函数,还可以是一个全局函数。例如:

#include<iostream>
using namespace std;class Item
{friend void OutputItem(Item *pItem);
private:char m_Name[100];void OutputName(){cout << m_Name << endl;}public:void SetItemName(const char *pchData){if(pchData != NULL){strcpy(m_Name,pchData);}}Item(){memset(m_Name,0,128);}
};void OutputItem(Item *pItem)
{if(pItem != NULL){pItem->SetItemName("by Johnson666");pItem->OutputName();}
}int main()
{Item item;OutputItem(&item);return 0;
}

结果:
image.png
在上面的代码中,定义全局函数OutputItem,在Item类中使用friend关键字将OutputItem函数声明为友元函数。而Item类中OutputName函数的属性是私有的,对外是不可见的。因为OutputItem是Item类的友元函数,所以可以引用类中的私有成员。


http://chatgpt.dhexx.cn/article/79dujVwl.shtml

相关文章

C++之友元函数

目录 1.定义&#xff1a; 1.概念&#xff1a; 2.注意 3.友元的分类&#xff1a; 4.友元函数代码分析&#xff1a; 1.友元函数出现的原因&#xff08;外部函数友元为例&#xff09;&#xff1a; 2.一个外部函数作为多个类的友元函数 3.成员函数友元&#xff1a; 4.类友…

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

友元 一般来说&#xff0c;类的公有成员能够在类外访问&#xff0c;私有的成员只能被类的其他成员函数访问。 在C中&#xff0c;可以定义友元&#xff0c;如果某一个函数定义为类的友元&#xff0c;则该函数就可以访问该类的私有函数。也可以把一个类定义为另一个类的友元。 …

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;同时可以达到事…