学科分类
目录
C++基础

友元类

除了可以声明函数为类的友元函数外,还可以将一个类声明为另一个类的友元类。例如在类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,显示了年月日、时分秒的信息。

友元可以实现数据共享,但在一定程度上破坏了类的封装性,除非在提高效率上有很大帮助,一般不提倡使用友元,友元较多地用在运算符重载中。为了更好地使用友元,需要在共享和封装之间找到一个结合点。

点击此处
隐藏目录