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

1.友元概念

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

2.友元函数

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

语法如下:

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的友元。

  • 友元关系不能继承。

猜你喜欢

转载自blog.csdn.net/weixin_45153969/article/details/132794664
今日推荐