C/CPLUS

C++<第十七篇>:友元

2022-01-21  本文已影响0人  NoBugException

友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区分,在说明时需要在前面加上关键字 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的私有成员了。

[本章完...]

上一篇 下一篇

猜你喜欢

热点阅读