学科分类
目录
C++基础

友元函数

友元函数是在类外定义的一个函数,它不是本类的成员函数,而是一个普通的函数或其他类的成员函数。若在类中声明某一函数为友元,则该函数可以操作类中的私有数据。

C++中使用关键字friend说明友元,友元函数的声明形式如下所示:

friend 函数返回值类型 友元函数名(形参列表);

友元成员函数的声明形式如下所示:

friend 返回值类型 其他类名::友元函数名(形参列表);

接下来分别讨论这两种友元函数的使用。

1、普通函数作为友元函数

通过一个案例说明友元函数的声明及使用,如例1所示。

例1

 1    #include <iostream>
 2    using namespace std;
 3    
 4    class IntClass                                           //定义IntClass类
 5    {
 6    public:
 7        IntClass (int con_n, int con_m);
 8        friend int add(IntClass &);                       //声明普通函数add()为友元函数
 9    private:
 10        int m_nN, m_nM;
 11    };
 12    
 13    IntClass::IntClass (int con_n, int con_m)
 14    {
 15        m_nN = con_n;
 16        m_nM = con_m;
 17    }
 18    
 19    int add(IntClass &refnum)                             //定义普通函数add()
 20    {
 21        //本函数是IntClass的友元函数,可以直接访问私有成员,实现两个私有数据成员的相加
 22        return refnum. m_nN + refnum. m_nM;                     
 23    }
 24    
 25    int main()
 26    {
 27        IntClass intnum(5,7);                             //创建类对象
 28        cout << "add(5, 7) = " << add(intnum) << endl;//调用add()函数
 29        system("pause");
 30        return 0;
 31    }

运行结果如图1所示。

图1 例1运行结果

例1中第8行在类中声明了友元函数add(),该函数是类外的普通函数,既然是类的友元函数,则直接访问了类的私有成员m_nN和m_nM,完成了数据相加。

2、类中的成员函数作为另一个类的友元函数

通过一个案例说明类的成员函数为另一个类的友元函数的用法,如例2所示。

例2

 1    #include <iostream>
 2    using namespace std;
 3    
 4    class IntAddend;                                         //声明IntAddend被加数类
 5    class IntAugend                                           //定义IntAugend加数类
 6    {
 7    public:
 8        IntAugend(int con_m)                               //定义构造函数
 9        {
 10            m_nM = con_m;
 11        }
 12        void add(IntAddend &ref_addend);
 13    private:
 14        int m_nM;
 15    };
 16    class IntAddend                                         //定义IntAddend被加数类
 17    {
 18    public:
 19        IntAddend(int con_n)
 20        {
 21            m_nN = con_n;
 22        }
 23        //声明IntAugend类中的add()函数为本类的友元函数,可以直接访问本类私有成员
 24        friend void IntAugend::add(IntAddend &);
 25    private:
 26        int m_nN;
 27    };
 28    void IntAugend::add(IntAddend &ref_addend)        //add()函数的定义
 29    {
 30        //直接访问IntAddendd对象ref_addend中的私有成员m_nN
 31        cout << "addend: n = " << ref_addend.m_nN << ",m =  " << m_nM << endl;
 32        //对不同类中两个整型数据成员进行相加
 33        cout << m_nM << " + " << ref_addend.m_nN << " = "
 34            << m_nM + ref_addend.m_nN << endl;
 35    }
 36    int main()
 37    {
 38        IntAugend intnum1(5);                            //定义IntAugend类对象intnum1
 39        IntAddend intnum2(3);                            //定义IntAugend类对象intnum1
 40        intnum1.add(intnum2);                            //调用add()函数实现数据相加
 41        system("pause");
 42        return 0;
 43    }

运行结果如图2所示。

图2 例2运行结果

例2中定义了一个表示加数的类IntAugend和表示被加数的类IntAddend,希望通过IntAugend类中的add()函数将两个类中的私有数据成员m_nM、m_nN进行相加。为了能让add()函数直接访问IntAddend类中的私有数据,将该函数声明为IntAddend类的友元函数。

使用友元函数有以下两点需要注意:

1、友元函数是能访问类中所有成员的函数,一个函数可以是多个类的友元函数,只需在各个类中分别说明。

2、C++中不允许将构造函数、析构函数和虚函数声明为友元函数。

点击此处
隐藏目录