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 友元函数特性
- 友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
- 友元函数不能用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的友元。 - 友元关系不能继承。