友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区分,在说明时需要在前面加上关键字 friend。友元不是成员函数,但是它可以访问类中的私有成员。
友元分为友元类和友元函数,下面分别对它们进行演示。
有一个类ClassA,成员变量name是私有的,成员函数getName时公有的。
#include <string>
using namespace std;
class ClassA
{
private:
string name = "zhangsan";
public:
string getName();
};
在类ClassB中,只能访问到公有的getName函数,却不能访问私有的name变量。
这个设计其实非常合理,成员变量一般都要设置成私有。
但是,如果改成这样的代码:
ClassA.h文件:
#include <string>
using namespace std;
class ClassA
{
private:
string getName();
};
ClassA.cpp文件:
#include "ClassA.h"
string ClassA::getName()
{
return "zhangsan";
}
成员函数getName是私有的,正常情况下是不允许访问的,除非将getName的访问权限改成public,但是呢,现在这个方法只允许ClassB可以访问,其它类一律不允许访问,这时,我们就不能将getName的访问权限改成public了,可以在ClassA中使用友元(friend)关键字,将ClassB类中的某个函数设置成友元函数
或者将Class设置成友元类
。
(1)友元函数
将ClassB类中的 getNameFromClassB 函数声明为友元函数:
friend string ClassB::getNameFromClassB();
这样在 类ClassB 中的 getNameFromClassB 函数中就可以访问ClassA中私有和公有成员了:
string ClassB::getNameFromClassB()
{
ClassA classA;
return classA.getName();
}
完整的代码如下:
ClassA.h文件:
#include <string>
#include "ClassB.h"
using namespace std;
class ClassA
{
friend string ClassB::getNameFromClassB();
private:
string getName();
};
ClassA.cpp文件:
#include "ClassA.h"
string ClassA::getName()
{
return "zhangsan";
}
ClassB.h文件:
#include <string>
using namespace std;
class ClassB
{
private:
public:
string getNameFromClassB();
};
ClassB.cpp文件:
#include "ClassA.h"
string ClassB::getNameFromClassB()
{
ClassA classA;
return classA.getName();
}
调用:
ClassB clazzB;
cout << clazzB.getNameFromClassB() << endl;
(2)友元类
也可以将类ClassB设置成友元,这样的话,在ClassB中就可以访问ClassA中的任何成员了。
只需要将:
friend string ClassB::getNameFromClassB();
改成:
friend class ClassB;
即可。
在ClassB中,不仅getNameFromClassB函数可以访问ClassA的私有成员,ClassB中的其它函数也可以访问ClassA的私有成员了。
[本章完...]
网友评论