一文搞懂友元函数和友元类

简介: 1.友元概念友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

1.友元概念

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

2.友元函数

试想一种场景,需要重载operator<<,然而发现没办法将operator<<重载成成员函数,因为类成员函数的第一个参数默认为this,而第一个位置正是左操作数的位置,正常来说我们输出逻辑为这样(cout<< xxx);若this抢占第一个参数,我们只能这样输出(xxx<<cout);这显然不符合逻辑,所以我们只能将它重载为全局函数。但这又无法访问私有成员变量,因此友元函数被引出来了。

语法如下:

class A
{
  friend int Add(int a, int b);  //告诉函数A,Add函数是它的好朋友,这样Add能访问A的任何成员。
private:
  int _year;
  int _month;
};
int Add(int a, int b)
{
  return a + b;
}

2.1 友元函数特性

  1. 友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
  2. 友元函数不能用const修饰

 3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。

 4.一个函数可以是多个类的友元函数。

  5.友元函数调用与普通函数调用原理相同。

3.友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类种的非公有成员。

  • 友元关系时单向的,不具有交换性。(Time是Date的友元,但反过来不成立)。
class Date
{
  friend class Time;   //告诉Date,Time是Date的友元类,Time可以访问Date的所有
private:
  int _year;
  int _month;
  int _day;
};
class Time
{
private:
  int _hour;
  int _min;
  int _sec;
};
  • 友元关系不能传递。
    如果C是B的友元,B是A的友元,不能说明C是A的友元。
  • 友元关系不能继承。

目录
相关文章
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
19 1
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
19 1
|
4月前
|
C++
C++友元函数和友元类的使用
C++中的友元(friend)是一种机制,允许类或函数访问其他类的私有成员,以实现数据共享或特殊功能。友元分为两类:类友元和函数友元。类友元允许一个类访问另一个类的私有数据,而函数友元是非成员函数,可以直接访问类的私有成员。虽然提供了便利,但友元破坏了封装性,应谨慎使用。
|
6月前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
6月前
|
设计模式 缓存 编译器
【C++友元函数】深入探索C++友元函数:从基础到应用
【C++友元函数】深入探索C++友元函数:从基础到应用
120 0
|
6月前
|
C++
c++类与对象(五):友元、内部类、临时对象、匿名对象
c++类与对象(五):友元、内部类、临时对象、匿名对象
41 0
|
11月前
|
编译器 C++
类和对象:初始化列表,静态成员,友元,内部类,匿名对象
类和对象:初始化列表,静态成员,友元,内部类,匿名对象
|
Java 编译器 C++
【C++基础】类与对象(下) 初始化列表、友元、内部类、匿名对象
【C++基础】类与对象(下) 初始化列表、友元、内部类、匿名对象
61 0
【C++基础】类与对象(下) 初始化列表、友元、内部类、匿名对象
|
C++
【C++知识点】友元类与友元函数
【C++知识点】友元类与友元函数
86 0