C++:友元函数与友元类

概念

  1. 在类的内部使用friend 关键字取修饰 类/函数的声明,使得这个函数/类 成为 该类的友元函数/友元类
  2. 友元函数/友元类的声明可以在任意的位置进行,不论是在 public 、private、protected区域下,效果都是一样的,都是获取类的成员变量的权限!
  3. 友元函数/友元类具有访问类内部成员变量的权限,但并不是类的成员
  4. 友元函数在声明时需要使用friend修饰,但是在定义时不需要
  5. 友元函数/友元类是单向的,例如A类中有一个友元类B,B类的成员函数可以使用A类的成员变量,但是A类的成员变量不能使用B类的成员函数
  6. 友元函数不具有传递性,例如A类的内部有友元类B,B类内部有友元类C,类B可以用类A的成员变量,类C可以用类B的成员变量,但是类C不能用类A的成员变量。

友元函数的实现方式

1、友元函数是普通的全局函数

cpp 复制代码
#include <iostream>

using namespace std;

class A
{

 private:
     int A;
  public:
     print(){};
     
     //声明全局函数 person 是 类A 的友元函数
     friend void person (int &x);
}


void person(int &x)
{
   //使用了类A的成员变量age
   cout << "age=" << p.age << endl;
  
}

int main ()
{
   A p(22);
   person(p);
   return 0;
}

2、友元函数是其他类的成员函数

cpp 复制代码
#include <iostream>

using namespace std;

class A
{

 private:
     int A;
  public:
     print(){};
     
     //声明类B的成员函数 person 是 类A 的友元函数
     friend  void B::person (int &x);
}


class B
{
  private:
     int B;
  public:
     person(int &x);

}

B::person(int &x)
{
   //因为类B的成员函数person是类A的友元函数,所以看可以使用类A的成员变量age
   cout << "age=" << p.age << endl;
  
}

int main ()
{
   A p(22);

   B q;
   q.person(p);
   return 0;
  
}

友元类

cpp 复制代码
//时间类
class Time
{
   friend class Date;   
// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量

public:

 //成员函数的初始化列表
 Time(int hour = 0, int minute = 0, int second = 0)
 : _hour(hour)
 , _minute(minute)
 , _second(second)
 {}
   
private:
   int _hour;
   int _minute;
   int _second;
};


//日期类
class Date
{
public:

   //成员函数的初始化列表
   Date(int year = 1900, int month = 1, int day = 1)
       : _year(year)
       , _month(month)
       , _day(day)
   {}
   
   void SetTimeOfDate(int hour, int minute, int second)
   {
       // 直接访问时间类私有的成员变量,因为日期类是时间类的友元类
       _t._hour = hour;
       _t._minute = minute;
       _t._second = second;
   }
   
private:
   int _year;
   int _month;
   int _day;
   Time _t;
};

优缺点总结

缺点:友元函数不是类的成员但是却具有成员的权限,可以访问类中受保护的成员,这破坏了类的封装特性和权限管控;

优点:可以实现类之间的数据共享;比如上面互为友元类,则可以互相访问对方受保护的成员;

总结:友元函数是一种破坏封装特性的机制,可以让程序员写代码更灵活,但是不能滥用;

相关推荐
阿波茨的鹅3 分钟前
VSCode C++ 项目配置教程
c++·ide·vscode
扶尔魔ocy7 分钟前
【QT opencv】手动去噪--网格化获取区域坐标
开发语言·qt·opencv
程序员与背包客_CoderZ16 分钟前
C/C++版LLM推理框架Llama.cpp——入门与编码实战
c语言·开发语言·网络·c++·人工智能·语言模型·llama
喵了几个咪26 分钟前
C++ IDE:最适合 C++ 初学者的 IDE 是什么?
开发语言·c++·ide
梅梅绵绵冰34 分钟前
springmvc文件上传
java·开发语言
Hat_man_37 分钟前
虚拟机Ubuntu22.04交叉编译Qt5.15.2(ARM64)
开发语言·qt
Boop_wu38 分钟前
[Java 面试] 多线程1
java·开发语言
专注于大数据技术栈39 分钟前
java学习--main方法
java·开发语言·学习
2501_941802481 小时前
C++高性能并发编程实战:从多线程管理到内存优化与任务调度全流程解析
java·开发语言·c++
zzzsde1 小时前
【C++】哈希表实现
数据结构·c++·哈希算法·散列表