简介
C++中存在一种“朋友”关系:如果体现在函数上,我们称之为友元函数,如果体现在类上我们称之为友元类。
友元函数
首先,来讨论一下友元函数。 友元函数分为两种:一种为定义在全局的函数,我们称之为友元全局函数,另一种定义在类中并且将这个函数,声明为另外一个类的友元函数,我们就称之为友元成员函数。
友元全局函数
先看下面一个例子:
class Time
{
friend void printTime1(Time &t);
public:
Time(int hour, int min, int sec);
private:
int m_iHour;
int m_iMinute;
int m_iSecond;
};
Time::Time(int hour, int min, int sec)
{
m_iHour = hour;
m_iMinute = min;
m_iSecond = sec;
}
void printTime1(Time &t)
{
cout << t.m_iHour << ":" << t.m_iMinute << ":" << t.m_iSecond << endl;
}
此例中,printTime这个全局函数,调用了Time类中的私有成员变量,正常情况下是无法调用的,但是我们加上friend关键字后,就可以正常访问了。
注意:friend void printTime1(Time &t);
一般习惯的写在类内第一句。这是因为,一般友元会破坏封装性,写在类的最开始的位置,可以让程序员很清楚的知道哪些内容被暴露出来,减小犯错的概率。
友元成员函数
和上面的大致相同,在被访问数据类中声明
` friend void Match::printTime(Time&t);
友元类
当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。实现方法:在类A中写下
friend class B;
并且在类A前,先声明一下B类,以免报错。
注意:
友元关系不可传递
友元关系单向性
友元声明的形式(友元函数和友元类)及数量不受限制
友元只是封装的补充,破坏了封装性