友元类

C++友元函数/友元类 (1)在类中用friend关键字去声明函数/类,则这个函数/类就会变成友元函数/友元类;(2)友元函数/友元类的声明位置没有要求,可以在private、protected、public权限区,效果都是一样的;(3)友元函数/友元类是单向的,A在B类中被声明为友元函数/友元类,表示A是B的友元函数/友元类,但B不是A的友元函数/友元类;(4)友元函数/友元类具有和类成员一样的权限,可以访问protected和private权限的成员,但不是类的成员; 阅读详情

友元类

声明友元类:
class class_a
{friend class class_b;
 ... };


声明位置可以位于公有、私有和保护部分,其所在的位置无关紧要。

 

友元类(class_b)的所有方法都可以访问原始类(class_a)的私有成员和保护成员。

 

   由于class_b类提到了class_a类,所以编译器必须了解class_a类后,才能处理class_b类,为此,最简单的方法是首先定义class_a类。另一种方法是,使用前向声明(forward declaration)。

 

友元成员函数

 

让特定的类成员成为另一个类的友元:
(必须小心排列各种声明和定义的顺序)
class class_a
{friend void class_b::set(class_a & A,int c);
 ... };

 

   要使编译器能够处理这条语句,它必须知道class_b的定义。这意味着应将class_b的定义放到class_a的定义前面。但class_b的方法提到了class_a对象,而这又意味着class_a定义应当位于class_b定义之前。避开这种循环依赖的方法是,使用前向声明(forward declaration)。为此,需要在class_b定义的前面插入下面的语句:
class class_a;           //forward declaration
class class_b {...};
class class_a {...};

 

假如class_b声明包含了内联代码调用class_a方法:
void show(class_a & A) {A.show();}

 

   由于这将调用class_a的一个方法,所以编译器此时必须已经看到了class_a类的声明,这样才能知道class_a有哪些方法,但class_a的声明现在却位于class_b声明的后面。解决方法是,类中只包含方法声明,并将实际的定义放在class_a类之后:
class class_a;          //forward declaration
class class_b {...};  //void show(class_a & A);
class class_a {...};
//put class_b method definitions here
inline void class_b::show(class_a & A){A.show();}
(通过在方法定义中使用inline关键字,仍然可以使其成为内联方法)

 

   内联函数的链接性是内部的,这意味着函数定义必须在使用函数的文件中,或者位于头文件中,并在使用函数的文件中包含该头文件。

 

其他友好关系

   相互友元成员函数,即类class_a的一些方法作为类class_b的友元,同时类class_b的一些方法也作为类class_a的友元。对于使用class_b对象的class_a方法,其原型可在class_b类声明之前声明,但必须在class_b类声明之后定义,以便编译器有足够的信息来编译该方法:

class class_a
{ friend class class_b;
  public: void use(class_b & B);
          void show()const;
  ... };

 

class class_b
{ friend class class_a;
  public: void set(class_a & A) {A.show();}
  ... };

 

inline void class_a::use(class_b & B) { ... }

 

   由于class_b的声明位于class_a声明的后面,所以可以在类声明中定义class_b::set(),但class_a::use()方法必须在class_a声明的外部定义,使其位于class_b声明的后面。

 

   共同的友元,即当函数需要访问两个类的私有数据时。它可以是一个类的成员,同时是另一个类的友元。不过有时将函数作为两个类的友元更合理:

class class_a;        //forward declaration
class class_b
{ friend void sync(class_a & A,const class_b & B);  //sync A to B
  friend void sync(class_b & B,const class_a & A);  //sync B to A
  ...};


class class_a
{ friend void sync(class_a & A,const class_b & B);  //sync A to B
  friend void sync(class_b & B,const class_a & A);  //sync B to A
  ...};


// define the friend functions
inline void sync(class_a & A,const class_b & B) {...}
inline void sync(class_b & B,const class_a & A) {...}

 


(向前声明使编译器看到class_b类声明中的友元声明时,知道class_a是一种类型)

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码) 本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。 阅读详情

相关推荐

【AUCell打分】:评估一个基因集在单细胞转录组的每个细胞中特定的活性程度

AUCell使用曲线下面积来计算输入基因集的一个有意义的基因子集是否在每个细胞的表达基因中富集。AUC 分数在所有细胞中的分布允许探索特征的相对表达。由于评分方法是基于排名的,因此 AUCell 与基因表达单位和归一化程序无关。此外,由于细胞是单独评估的,因此可以很容易地应用于更大的数据集。

weixin_40695088的博客 1万+

C++语言学习(七)——友元

C++语言学习(七)——友元 一、友元简介 1、友元简介 面向对象编程的类的设计机制实现了数据的隐藏与封装,类的成员变量一般定义为私有成员,成员函数一般定义为公有的,是类与外部的通信接口。在实践中,类外的某些函数需要频繁地访问类的成员变量,可以将类外的函数定义为类的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但友元破坏了类的封装性和隐藏性,使得非类的成员函数可以访问类的私有成员。 友元是C++语言中的一种关系,友元关

m0_43426943的博客 248

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4881

C++学习笔记:规范

C++规范与补充1.初始化的规范写法2.常量成员函数3.传参尽量传引用4.同一个类的对象互为友元5.操作符的重载5.1 <<的重载5.2 +的重载 1.初始化的规范写法 2.常量成员函数 常变量只能调用常函数,所以在类内最好把一些函数设置成常函数,写法如下,普通变量也可调用常函数,这样可以提高代码的鲁棒性。 const complex c(2, 1); // 定义常量变量 c.real(); // 若 real() 函数不加以const修饰,则编译时会报错: error: pas

qq_42309130的博客 492

NXP S32K3 Safety软件生态全解析:RTD、SPD、SAF、SCST到底怎么选?

本文深入解析NXP S32K3系列MCU的安全软件生态,详细对比RTD、SPD、SAF和SCST四大组件的功能定位与选型策略。针对不同ASIL等级需求,提供从架构设计到工程实践的完整解决方案,帮助开发者高效实现功能安全认证,优化汽车电子系统的安全性与可靠性。

weixin_42524226的博客 323

STM32F103C8T6飞控入门:从零开始,用HAL库和MPU6050搭建你的第一架四轴无人机

本文详细介绍了如何使用STM32F103C8T6和MPU6050模块从零开始搭建四轴无人机飞控系统。通过硬件选型、电路设计、HAL库配置、姿态解算算法实现以及PID控制等步骤,帮助创客和嵌入式爱好者快速入门飞控开发。文章还提供了实用的调试技巧和常见问题解决方案,适合想要掌握四旋翼无人机核心技术的开发者。

weixin_42524750的博客 266

C/C++编程:友元

由来 我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字frien

OceanStar的博客 836

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

FastGPT 引申:借鉴 FastGPT 基于MySQL + ES 实现知识库(含表结构以及核心代码)

蜗牛的专栏 3435

【C++】友元类 ( 友元类简介 | 友元类声明 | 友元类单向性 | 友元类继承性 | 友元类作用 | 友元类和友元函数由来 | Java 反射机制 | C / C++ 编译过程 )

一、友元类简介 1、友元类引入 2、友元类声明 3、友元类单向性 4、友元类继承性 5、友元类作用 二、友元类和友元函数由来 1、友元类和友元函数引入 2、Java 反射机制 3、C / C++ 编译过程 三、友元类代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6724

海思Hi3559A/CV100 DDR4参数配置经验分享

海思Hi3559A/CV100 DDR4参数配置方法 Hi3559AV100 DDR4 驱动配置说明 1.1 Hi3559AV100 DDR4 CLK/AC 驱动配置方法 寄存器地址 DDR PHY0:0x1206d0bc DDR PHY1:0x1206f0bc 寄存器描述 − Bit[5:3]:CLK 驱动 − Bit[14:12]:2T 驱动 − Bit[20:18]:1T 驱动 驱动大小定义 − 000:Disable − 001:240ohm − 010: 120ohm − 011:80ohm −

WeChat_zhanggong345的博客 2878

1006. 换个格式输出整数 (15)-PAT乙级真题

1006. 换个格式输出整数 (15)让我们用字母B来表示“百”、字母S表示“十”,用“12…n”来表示个位数字n(&lt;10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(&lt;1000)。输出格式:每个测试用例的输出占一行,用规定的格式输出n。输入样例1...

柳婼 の blog 2242

C++ 友元类

1.在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 2.友元类 : 友元类的所有成员函数都是另一个类的友

weixin_43107240的博客 4万+

JEDEC JESD51-14 瞬态双界面测试方法详解

(瞬态双界面测试方法,用于测量具有单路径热流的半导体器件的结到壳热阻 RθJC,包括结到壳顶部 RθJCT 和结到壳底部 RθJCB)。该标准于 2010 年发布(版本 JESD51-14.1),旨在提供一种准确、可重复的瞬态方法来测量功率半导体器件(如 MOSFET、IGBT)的结到壳热阻(RthJC),取代传统的稳态测量方法(如 MIL-STD-883E METHOD 1012.1)。方法,通过比较两种不同热界面材料(TIM)下的瞬态温度响应曲线,提取 RthJC,而无需直接测量壳温(Tc)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 605

【C++】友元类

在 C++ 中,友元类(Friend Class)是指允许其他类访问它的私有成员和保护成员的类。友元类并不继承或派生自另一个类,它通过friend关键字声明,使得指定的类能够访问另一个类的私有或受保护的数据成员和成员函数。打破封装性:友元类允许不同的类直接共享数据,可以让一些类能够直接操作其他类的私有数据。简化代码:在某些场合,友元类可以减少接口的复杂度,使得类之间的操作更直接、高效。实现复杂操作:如重载运算符等功能时,友元类可以访问并修改私有成员,提供更灵活的操作。

Guiat的博客 1797

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

android 蓝牙通讯demo

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

【类模板中的友元】友元类

如果我们只需要让类模板的一个实例访问另一个类的内部成员,那么我们可以只指定其特定的类型成为友元类。引入的新标准,注意这里我们的参数必须是在类类模板的,而不是一般类,如。的类型不是类类型,因此友元类的定义对其无效,编译器会自动忽略。如果我们想让类模板全部类型都成为另一个类模板的友元类呢?的所有成员(成员变量,成员函数等),而不管这些成员在类。等,并且必须在类内使用友元内,超出了类内,也就无效了。的内部成员,而其他类型的实例化将被拒绝访问。是无效的,因为其作用域超出了类内。来声明,这是符合友元类语法的。

Antonio915的博客 1267

efm32 入门.pdf

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

为什么要使用友元,友元类

这里写目录标题为什么要使用友元友元的两种使用形式友元类使用注意 为什么要使用友元 C++是面向对象的,目的之一:封装 封装: 优点之一,就是安全。 缺点:在某些特殊的场合,不是很方便。 华为与IBM 40亿的咨询故事 IBM需要对华为各级部门做深度咨询分析, 为了提高咨询效率,由任正非直接授权,直接获取各部门的所有权限。 使用前提: 某个类需要实现某种功能,但是这个类自身,因为各种原因,无法自己实现。 需要借助于“外力”才能实现。 友元的两种使用形式 友元函数: 使用全局函数作为友元函数 需求: 计算机

m0_46376834的博客 1675

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++友元函数和友元类

友元为什么要友元?怎么用友元?友元函数友元类友元类的指针问题个人感想 为什么要友元? 为了偷懒,程序员可以少写一点代码,并且函数调用频繁的话还可以减少时间开销 怎么用友元? 友元函数 在类申明里面,给函数加上friend就可以了 #include <iostream> using namespace std; //先定义一个类 class BABA() { private: int age; public: //用来改变爸爸的年龄 void setage(int i); //友

skywf的博客 2265

友元类的使用方法

学习友元函数之后,我们再来看友元类,也是一样的道理和使用方法,如果把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问B类中的成员。使用方法也一样,在类B中进行声明即可。 还是上一节的程序功能,我们稍作更改: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

m0_60226024的博客 2854

[C++]友元函数和友元类

友元函数是非成员函数,但被允许访问类的私有成员。通过friend关键字声明友元函数,它可以访问类的私有数据。友元函数并不是类的成员,它只能访问类的私有和保护成员,而不能访问类的其他成员函数或成员变量。友元函数的访问权限仅限于该类的私有和保护成员。友元类是允许访问另一个类私有成员的类。通过关键字声明友元类,使得友元类的成员函数能够访问被声明类的私有数据。友元类和继承关系不同,它只是授权给一个类访问另一个类的私有成员,不会影响类的继承关系。

2302_80281315的博客 1063

友元函数、友元类

友元函数 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:friend 类型 函数名(形式参数);友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。 class Date { //友元函数在类内部声明 f

qq_41078889的博客 1091

什么是友元类

======================什么是友元类=======================       当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。 =======================友元类能做什么=======================       友元类可以通过自己的方法来

qq_32625545的博客 2605
上一篇: 模板类和友元函数
下一篇: 嵌套类(嵌套类、结构和枚举的作用域特征——图)
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值