美文网首页C/CPLUS
C++<第十七篇>:友元

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

作者: NoBugException | 来源:发表于2022-01-21 16:29 被阅读0次

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

[本章完...]

相关文章

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

    友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区分,在说明时需要在前面加...

  • c++ 友元

    在c++中,通过关键字friend声明为友元。友元可以范围与其有好友关系的类中私有成员。友元包括友元函数和友元类。...

  • C++语言基础(03)

    1.内存分配 C/C++ 内存分区: java 创建对象 2.常函数 3.友元函数和友元类 友元函数 友元类 4....

  • C++中的友元

    友元的介绍 什么是友元?友元是C++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单项的,不能传递...

  • C++友元

    friend类: 如果class A想让class B访问它的成员,只需要在class A中将class B声明称...

  • C++友元

    我承认你是我的朋友,你才是,当有一天,我觉得你有背叛我,除了你的名,你就再也不会进入我的内心。

  • C++ 友元

    ​ 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一 般定义为公有的,依此提供...

  • C++ 友元

    小项备注时间2020 年 3 月 28 日修改时间2020 年 3 月 28 日城市北京市房山区天气晴心情你猜 0...

  • C++ 友元

    友元 待续

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

网友评论

    本文标题:C++<第十七篇>:友元

    本文链接:https://www.haomeiwen.com/subject/mwmehrtx.html