友元函数
友元函数是在类外定义的一个函数,它不是本类的成员函数,而是一个普通的函数或其他类的成员函数。若在类中声明某一函数为友元,则该函数可以操作类中的私有数据。
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++中不允许将构造函数、析构函数和虚函数声明为友元函数。