友元类
除了可以声明函数为类的友元函数外,还可以将一个类声明为另一个类的友元类。例如在类A中声明类B为友元类,则类B中的所有成员函数称为类A的友元函数,能访问类A中的私有数据。
与声明友元函数类似,声明友元类也需要使用关键字friend,声明友元类的形式如下所示:
class B;
class A
{
…
friend class B; //声明类B为类A的友元
…
};
接下来通过一个案例说明友元类的使用,如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3 class Date; //声明Date类
4 class Time //定义Time类,描述时分秒
5 {
6 public:
7 Time(int con_hour, int con_minute, int con_second) //定义构造函数
8 {
9 m_nHour = con_hour;
10 m_nMinute = con_minute;
11 m_nSecond = con_second;
12
13 }
14 friend class Date; //声明Date为Time的友元类
15 private:
16 int m_nHour, m_nMinute, m_nSecond;
17 };
18 class Date //定义Date类
19 {
20 public:
21 Date(int con_year, int con_month, int con_day) //定义构造函数
22 {
23 m_nYear = con_year;
24 m_nMonth = con_month;
25 m_nDay = con_day;
26 }
27 void display_date_time(Time &ref_time); //声明display_date_time()函数
28 private:
29 int m_nYear, m_nMonth, m_nDay;
30 };
31 /*
32 * 定义display_date_time()函数,显示年月日、时分秒信息。由于Date为Time类的友元类,
33 * 则Date中的函数为Time类的友元函数,可以访问Time类的私有成员,
34 * 这里直接访问了私有成员:m_nHour、m_nMinute、m_nSecond
35 */
36 void Date::display_date_time(Time &ref_time)
37 {
38 cout << m_nYear << "-" << m_nMonth << "-" << m_nDay << " "
39 << ref_time.m_nHour << ":" << ref_time.m_nMinute
40 << ":" << ref_time.m_nSecond << endl;
41 }
42 int main()
43 {
44 Time time(17, 30, 20); //定义Time对象
45 Date date(2015, 3, 31); //定义Date对象
46 date.display_date_time(time); //显示年月日、时分秒信息
47 system("pause");
48 return 0;
49 }
运行结果如图1所示。
图1 例1运行结果
例1中将Date声明为Time的友元类,则Date类中的成员函数是Time类的友元函数,可以直接访问Time类中的私有成员,因此Date类中的display_date_time()函数直接访问了Time中的私有数据m_nHour、m_nMinute、m_nSecond,显示了年月日、时分秒的信息。
友元可以实现数据共享,但在一定程度上破坏了类的封装性,除非在提高效率上有很大帮助,一般不提倡使用友元,友元较多地用在运算符重载中。为了更好地使用友元,需要在共享和封装之间找到一个结合点。