天天看点

C++学习笔记:友元函数和友元类

简介

  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类,以免报错。

注意:

友元关系不可传递

友元关系单向性

友元声明的形式(友元函数和友元类)及数量不受限制

友元只是封装的补充,破坏了封装性

继续阅读