C++ 代码中的朋友:友元

C++面向对象:友元关键字friend的使用 友元概述(需快速查阅看文末总结) 友元:顾名思义,就像朋友一样的元素 好比一个人个房屋内,有客厅和卧室,卧室比较私人(private),一般客人无法访问,只能在客厅这个公有环境(public)里面移动. 而友元的出现,就好比是自己的好基友来到了家里,可以让好基友进入自己的私人卧室. 友元让private修饰的变量属性不再绝对的私有.在必要的时候可以使用friend关键字进行修饰访问. 具体用法如下: 全局函数做友元 全局函数是指在类外以及main函数之外的函数叫全局函数,作用域是全局. bedroom是 阅读详情

为什么要使用友元

当在一个类的成员函数外,想要修改类的私有成员时,就可以考虑使用友元。

使用前提:
某个类需要实现某种功能,但是这个类自身,因为各种原因,无法自己实现。
需要借助于“外力”才能实现。


友元的两种使用形式

友元函数 和 友元类


友元函数

在main方法中定义,并实现;
在类中声明一下即可。(使用friend声明)

例:

需求:
给一个电脑的cpu从i7升级到i9

Computer.h

#pragma once
#include <string>

using namespace std;

class Computer {
public:
	Computer(void);
	~Computer(void);

	string description() const;

private:
	string cpu;

	// 把外部的全局函数pudate,声明为这个类的友元函数
	friend void update(Computer *cpu);
};

Computer.cpp

#include <iostream>
#include <sstream>
#include "Computer.h"


Computer::Computer(void)
{
	this->cpu = "i7";
}


Computer::~Computer(void)
{
}

string Computer::description() const {
	stringstream ret;

	ret << "cpu:" << cpu << endl;

	return ret.str();
}

main

#include <iostream>
#include "Computer.h"

void update(Computer *cpu) {
	cpu->cpu = "i9";
}

int main(void) {
	Computer cpu;

	cout << cpu.description() << endl;

	update(&cpu);

	cout << cpu.description() << endl;


	system("pause");
	return 0;
}

运行截图:

在这里插入图片描述
友元函数仅在只有一个或者两个友元函数时使用时挺方便的,当友元函数有多个的时候,就需要使用友元类来封装,会比较简洁。


使用类的成员函数作为友元函数

简单介绍:
有一个A类和一个B类。
在B类中有一个成员成员函数时A类的友元函数

假设A类时Computer, B类时ComputerServer
那么,在A类中需要这样声明:

friend void ComputerServer::update(Computer *cpu);

注意:
在ComputerServer.h文件中使用 class Computer;声明一下有这个类;
在ComputerSever.cpp 文件中使用 头文件#include "Computer"

功能上,以上两种方式,都是相同,应用场合不同。
一个是,使用普通的全局函数,作为自己的朋友,实现特殊功能。
一个是,使用其他类的成员函数,作为自己的朋友,实现特殊功能。


友元类

友元类,故名思意就是一个类,是一个类的友元类。
友元类里面的所有成员函数都可以访问该类的所有私有成员。

友元类就是友元函数的封装。

C++是面向对象的,目的之一:封装

封装:
优点之一,就是安全。
缺点:在某些特殊的场合,不是很方便。

友元类的作用

如果把A类作为B类的友元类,
那么A类的所有成员函数【在A类的成员函数内】,就可以直接访问【使用】B类的私有成员。
即,友元类可以直接访问对应类的所有成员!!!

例:

Computer.h

#pragma once
#include <string>
#include "ComputerServer.h"

using namespace std;

class Computer {
public:
	Computer(void);
	~Computer(void);

	string description() const;

private:
	string cpu;

	// 将ComputerServer整个类声明为Computer的友元类
	friend class ComputerServer;
};

Computer.cpp

#include <iostream>
#include <sstream>
#include "Computer.h"


Computer::Computer(void)
{
	this->cpu = "i7";
}


Computer::~Computer(void)
{
}

string Computer::description() const {
	stringstream ret;

	ret << "cpu:" << cpu << endl;

	return ret.str();
}

ComputerServer.h

#pragma once

class Computer;

class ComputerServer {
public:
	void update(Computer *cpu);
	void clear(Computer *cpu);
	void kiil(Computer &cpu);	// 使用指针和使用引用效果一样
};

ComputerServer.cpp

#include <iostream>
#include "ComputerServer.h"
#include "Computer.h"

void ComputerServer::update(Computer *cpu) {
	cpu->cpu = "i9";
}

void ComputerServer::clear(Computer *cpu) {
	cout << "正在对电脑清理垃圾【cpu:" << cpu->cpu << "】..." << endl;
}

void ComputerServer::kiil(Computer &cpu) {
	cout << "正在对电脑清理杀毒【cpu:" << cpu.cpu<< "】..." << endl;
}

main

#include <iostream>
#include "Computer.h"
#include "ComputerServer.h"

//void update(Computer *cpu) {
//	cpu->cpu = "i9";
//}

int main(void) {
	Computer cpu;
	ComputerServer server;

	cout << cpu.description() << endl;

	//update(&cpu);
	server.update(&cpu);
	server.clear(&cpu);
	server.kiil(cpu);

	cout << cpu.description() << endl;


	system("pause");
	return 0;
}

运行截图:

在这里插入图片描述

使用注意:

友元类,和友元函数,使用friend关键字进行声明即可,与访问权限无关,
所以,可以放在private/pulic/protected任意区域内。

C++类做友元 类做友元 class Building; class goodGay { public: goodGay(); void visit(); private: Building *building; }; class Building { //告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容 friend class goodGay; public: Building(); public: string m_SittingRoom; / 阅读详情

相关推荐

硬件原理图:从软件思维到硬件接口的嵌入式开发破局指南

本文为软件开发者提供了读懂硬件原理图的嵌入式开发破局指南。文章将硬件原理图类比为“硬件系统的架构图”,引导读者将软件API调用思维迁移到硬件接口理解上,详细解析了电阻、电容、二极管等常见元器件的“硬件API”功能与选型逻辑,并通过实战电路拆解,阐述了从原理图分析到驱动代码编写的完整思维链条,帮助开发者建立软硬件协同的系统级视角。

lg888的博客 496

C++友元详解

友元介绍

m0_73803550的博客 8081

数字经济新质生产力数字化转型数据要素流通交易解决方案:数据要素化演进路径与管理、公共数据授权运营平台体系、数据底座、典型应用场景

数字经济的发展依赖于数据要素的有效流通与交易,数字化转型的核心在于数据的全生命周期管理和价值释放。数据要素化通过数据资源化、资产化和资本化的“三化”过程,实现其经济与社会价值。数据管理涵盖采集、存储、加工、分析等环节,支持数据的度量与交换。公共数据、企业数据和个人数据通过场内、场外及二级市场交易实现资本化。公共数据开发利用面临隐私泄露、监督管理难等痛点,目标是构建授权运营平台体系,确保数据流通的安全与效率。平台体系包括统一门户、授权管理、运营管理、合规监督等核心功能,支持明文、密文和可信交换流通方式。数据底

weixin_44094929的博客 1003

友元(c++友元介绍)

友元介绍 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元 友元函数 友元类 友元函数 友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: friend 类型 友元函数名(参数表); 友元的作用在于提高程序的运行效率 友元函数注意事项 友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员

qq_43519552的博客 961

自抗扰控制(ADRC)原理与MATLAB实现详解

自抗扰控制(ADRC)是一种先进的鲁棒控制策略,其核心在于通过扩张状态观测器(ESO)实时估计并补偿系统总扰动。相比传统PID控制,ADRC不依赖精确数学模型,特别适合处理非线性、时变系统。从控制原理看,ADRC将系统内部动态和外部扰动统一建模,通过带宽参数化方法实现快速响应与强抗扰能力。在工程实践中,ADRC已成功应用于无人机飞控、伺服系统等场景,MATLAB仿真显示其上升时间可比PID提升46%,抗扰动恢复时间缩短60%。典型实现包含ESO设计、扰动补偿和PD控制三部分,参数整定遵循ω₀=3~5倍系统带

weixin_33585822的博客 95

哨兵一号数据下载

哨兵1号数据的下载过程

weixin_59617499的博客 5135

C++——友元(友元函数、友元类和友元成员函数详解)

友元函数是在一个类中声明的一个非成员函数,但在类的内部声明该函数为友元。这意味着该函数可以访问该类的私有成员,包括私有变量和私有函数。友元函数的声明通常位于类的声明中,但其实现则位于类外部。1、友元函数:通过friend+普通函数友元函数是在一个类中声明的非成员函数,但在类的内部声明该函数为友元。这使得该函数可以访问该类的私有成员。private:public:// 声明友元函数// Getter函数// 友元函数实现

qq_57737603的博客 5469

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

【C++ | 友元(friend)】友元函数、友元类、友元成员函数详解及例子代码

本文介绍了C++的友元函数、友元类、友元成员函数、其他友元关系,以及使用例子介绍了如何声明、定义、使用。

wkd_007的博客 1万+

开源处理器Rocket的分支预测机制研究与性能评估(二)

Rocket是基于RISC-V指令集架构的开源处理器,具有分支预测功能,其实现了GShare分支预测机制,在分析Rocket处理器分支预测处理过程、分支预测实现原理的基础上,利用模拟器进行了性能测试,并依据测试结果,对Rocket处理器分支预测参数配置给出建议。

leishangwen的专栏 5691

实用工具系列 - Xshell安装下载与使用

一、介绍 二、下载 三、安装 四、使用

Passerby_Wang的博客 1万+

C++之友元函数

友元函数:友元函数的定义、分类、三种友元函数举例,代码注意点,判断谁是谁的友元函数或类

m0_59052131的博客 2万+

一文吃透!C#上位机CAN总线通信开发:从协议解析到数据可视化

CAN底层协议仅定义了8字节数据的传输规则,实际业务需自定义应用层协议,实现多类型数据的有序传输,这是数据解析的核心。仲裁ID(16进制)数据长度(DLC)数据场格式业务含义解析规则0x0014字节0~3:温度数据温度采集(单位:℃)4字节→float类型(大端/小端需统一,如西门子PLC格式)0x0022字节0~1:转速数据电机转速(单位:r/min)2字节→short类型(Int16)0x0031字节0:bit0~bit7设备状态(8路开关量)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 846

C++:友元(看这一篇就够了)

本文介绍了C++友元,包括为什么使用友元,怎样使用友元以及友元的三种实现

孙悟空 8万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【C++】友元--最全解析(友元是什么?我们应该如何理解友元?友元可以应用在那些场景?)

在C++编程语言中,友元函数(Friend Function)是一种特殊的函数,具有访问类中私有成员和保护成员的权限,尽管它不是类的成员函数。友元函数的存在使得类的设计更加灵活,能够在需要时授予外部函数访问类的私有成员的能力。本文将详细介绍C++中的友元函数,包括其定义、使用场景、优缺点以及示例。

weixin_45031801的博客 5575

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++中什么是友元?友元的存在形式有?友元有何特点?

目录 一、友元函数 1.非成员函数 2.成员函数 3.友元函数的重载 二、友元类 三、友元与封装性 私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的...

weixin_42672977的博客 7733

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【C++】 类的新成员:static成员和类的好朋友:友元

这么长时间,我们终于把构造函数的内容解决了,初始化列表,默认构造函数,构造函数和析构函数的顺序,全缺省的默认构造函数都值得我们细细品味,本期将接触类和对象中新的部分,static成员和类的好朋友:友元

cilmy23的note 1230

什么是友元?什么可以做友元?友元能干什么?(全局函数做友元,类做友元,成员函数做友元)c/c++

例如:你的生活中有一个特别好的朋友,你允许它进入你的房间(私有场所)也允许他进入客厅(相对公有场所),但是对于其他人你是不会允许他进入你的房间的,只允许他进入客厅。类对象也有这样类似的好朋友类,可以访问本类的私有成员,这个好朋友类就叫做这个类的友元,友元也可以是全局函数和别的类的成员函数,下面一一解答。

m0_57094953的博客 1620

[C++——lesson12.友元]

本文详细解析了C++中的友元机制。友元函数(Friend Function)是一种特殊函数,通过friend关键字声明后可以访问类的私有/保护成员,但不属于类成员函数。友元分为三种:友元函数、友元类和友元成员函数。通过生活案例类比,解释了友元如同"装修设计师"可获权进入私人区域(private成员)工作。文章重点演示了友元在运算符重载(<<和>>)中的实际应用,并详细分析了友元的优缺点:优点在于直接访问私有成员、支持灵活操作符重载和提升效率;缺点是会破坏封装性、增

2401_83386596的博客 1208

c++面向对象的好朋友:友元---可分享私有成员

表中我们也可以明显的看出外部是无法访问类中的私有变量的,那怎样使得外部可以访问到类中私有成员呢?------友元就可以达到这个目的,它可以让一个函数或者一个类访问另一个类中的私有成员。友元的关键字为 friend 。 友元有三种实现: 全局函数做友元 类做友元 成员函数做友元 (个人巧记:根据友元的关键字是friend,中文翻译是朋友的意思,我们可以理解为朋友之间的分享,从而促使函数或者另一个类可以访问自己)...

qq_63691275的博客 1578

cpp自学 day16(友元)

在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术友元的目的就是让一个函数或者类 访问另一个类中私有成员。

CWNU_Dragon的博客 1631

C++友元机制详解:全局函数、类和成员函数作为友元

在C++中,友元(Friend)是一种特殊的机制,它允许一个类或函数访问另一个类的私有(private)和保护(protected)成员。友元打破了类的封装性,但有时这种"破坏"是必要的,特别是在需要提高某些特定函数或类的访问权限时。友元的关键字是friend,C++支持三种友元形式:全局函数作为友元类作为友元成员函数作为友元。

2503_90937448的博客 1259

【C++】友元五连问,你能答对几个?

什么是友元? 为什么有友元这个概念 友元的分类有哪些? 如何创建和使用友元?

翼同学 1400

C++友元的三种类型(全局函数做友元,友元类,成员函数做友元)

本文详细介绍了有关友元的一些说明:友元的定义(友元是什么?)、友元的作用、友元的分类及具体实现、创建时的注意事项。以上就是本文的所有内容,友元的主要目的是提供更灵活的访问控制,以便在某些情况下,外部函数或类能够直接操作类的内部数据,当我们需要使用到友元时,我们只需要在类中提前声明就可以,声明时通常是,在前面加关键字friend。

weixin_48452146的博客 1395

C++基础--友元

C++基础--友元 我们知道:类的公有成员能够在类外访问,私有的成员只能被类的其它成员函数访问。在C++中,可以定义友元,如果某一个函数定义为类的友元,则该函数就可以访问该类的私有成员,下面举例说明友元函数的使用。 假定我们已经定义了两个集合类变量,一个为整型数集合,另一个为实型数集合: 程序段10-7   class IntS

WITNESS 1383

C++ :友元

同类对象间无私处,异类对象间有友元 类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办? 解决方法是使用友元函数,友元函数是一种特权函数,c++允许友元访问私有成员。 可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。 目录 一、友元几点说明 二、全局函数做友元 三、类做友元 四、类中的成...

陈宸的博客 325
上一篇: C++ 文件流详解
下一篇: C++ 算术运算符 - 重载
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值