当前位置: 首页 > news >正文

友元类和友元函数

友元函数的定义:

友元函数是在类定义中被声明为 “朋友” 的非成员函数。它可以访问类的私有成员和保护成员(变量和方法),就好像它是类的成员函数一样。友元函数的声明以friend关键字开头,在类的内部进行声明,但它的定义在类的外部,和普通函数一样。

代码如下:

#include <iostream>
using namespace std;
class A
{   
public:friend void set_show(int x, A &a); //该函数是友元函数的声明
private:int data;  //私有的成员变量
protected:int pro=8;  //受保护的成员变量
};
void set_show(int x, A &a)//友元函数定义,为了访问类A中的成员变量data以及pro
{a.data = x;cout << a.data << endl;cout << a.pro <<endl;         
}
int main(void)
{class A a;set_show(1,a);return 0;
}

友元类的定义:

友元类是被另一个类声明为 “朋友” 的类。友元类的所有成员函数都可以访问声明它为友元的类的私有成员和保护成员。友元类的声明也是在类的内部使用friend关键字进行,格式为friend class 友元类名。

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。但是另一个类里面也要相应的进行声明。

代码如下:

class A {
public:friend class C;//友元类的声明
private:int data;
};
class C {  //友元类定义,为了访问类A中的成员
public:void set_show(int x, A& a){a.data = x;cout << a.data << endl;}
};
int main(void)
{class A a;class C c;c.set_show(1, a);//1return 0;
}

友元的作用:

友元提供了不同类的成员函数之间,类的成员函数和一般函数之间进行数据共享的机制。

通过友元,一个普通函数或者另一个类中的成员函数可以访问类中的私有成员和保护成员。友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和

数据的隐藏性,导致程序可维护性变差。一个函数可以是多个类的友元函数,但是每个类中都要声明这个函数,友元函数的声明和权限无关。

注意事项

1.破坏封装性

友元机制虽然方便,但它在一定程度上破坏了类的封装性。封装性是面向对象编程的重要特性之一,它隐藏了类的内部实现细节,使得类的内部数据结构和操作不易被外部代码随意访问和修改。过度使用友元可能会导致代码的可维护性降低,因为外部代码可以直接访问类的私有成员,使得类的内部实现对外部代码的依赖增加。

2.谨慎使用友元类

当一个类被声明为另一个类的友元类时,友元类的所有成员函数都可以访问被访问类的私有成员。这可能会导致意外的访问和修改。

例如,如果B类是A类的友元类,那么B类中的所有成员函数(fast)都可以访问和修改A类的私有成员。所以在设计时,要确保友元类中的函数确实有合理的理由访问另一个类的私有成员。

class A {int dis = 5;int pri = 4;void work(){cout << "work" << endl;}
protected:int pro = 1;
public:friend class B;//类B作为类A的友元类
};
class B {
public:void fast(){A a;//访问A类中的私有成员dis和受保护的成员procout << "dis: " << a.dis << "pro: " << a.pro << endl;//访问A类中的私有成员方法a.work();//修改A类中的私有成员变量pria.pri = 12;cout << "修改后的pri: " << a.pri << endl;}
};
int main()
{B b;b.fast();return 0;
}

3.友元关系不能被继承。因为友元关系是基于类的明确声明,而不是基于继承关系。

4.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。

5.友元关系不具有传递性。若类 B是类 A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

6.友元声明的位置和范围

在C++中,友元声明只是一种授权,它不遵循常规的访问控制和作用域规则。友元函数或友元类的声明可以放在类的私有、保护或公共部分,这只是一种声明位置的选择,不影响其作为友元访问类私有成员的能力。但是,友元函数本身的定义(如果是普通函数)或者友元类的成员函数定义(如果是友元类)还是要遵循常规的函数定义规则和作用域规则。例如,友元函数的定义通常需要在类的外部进行(除非是内联函数),并且要保证能够正确地访问所需的类对象和成员。

http://www.lryc.cn/news/486933.html

相关文章:

  • Sulfo-Cy5-Iodoacetamide能够发出明亮的荧光信号,使得生物样本的精细结构得以清晰呈现
  • Python中的TCP
  • CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用
  • Flink新版Source接口源码解析
  • SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力
  • 一次失败的wxpython安装macOS M1
  • 【大数据技术基础 | 实验十一】Hive实验:新建Hive表
  • 【yarn】yarn rest api每日job数量分析
  • 蓝桥杯单片机第十一届省赛(第一场)
  • hive复杂数据类型Array Map Struct 炸裂函数explode
  • FIFO架构专题-FIFO是什么
  • Pythony——多线程简单爬虫实现
  • 如何修改 a 链接的样式
  • 第6章 详细设计-6.5 软硬件接口文档设计
  • 【pyspark学习从入门到精通14】MLlib_1
  • C++全局构造和初始化
  • 安全见闻-泷羽sec课程笔记
  • 游戏引擎学习第17天
  • 【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
  • 【学习笔记】量化概述
  • 同步互斥相关习题10道 附详解
  • 【Python · PyTorch】卷积神经网络 CNN(LeNet-5网络)
  • Git 拉取指定分支创建项目
  • CF862B Mahmoud and Ehab and the bipartiteness(二分图的性质)
  • React Native 全栈开发实战班 :数据管理与状态之React Hooks 基础
  • 传奇996_22——自动挂机
  • faiss 提供了多种索引类型
  • 比rsync更强大的文件同步工具rclone
  • 《业务流程--穿越从概念到实践的丛林》读后感一:什么是业务流程
  • 解决docker mysql命令行无法输入中文