友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
试想一种场景,需要重载operator<<,然而发现没办法将operator<<重载成成员函数,因为类成员函数的第一个参数默认为this,而第一个位置正是左操作数的位置,正常来说我们输出逻辑为这样(cout<< xxx);若this抢占第一个参数,我们只能这样输出(xxx<
语法如下:
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;
}
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类种的非公有成员。
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的友元。
友元关系不能继承。