C++中友元关系是什么

C++中友元关系是什么,第1张

目录

文章目录

前言

一:友元关系

二:友元的分类

三:友元函数的特点:

四:友元函数的语法定义:

五:友元类的特点

六:友元关系的特点:

总结


前言

C++中封装的概念非常重要,但是有一种方法是可以打破封装的,它是什么呢?


一:友元关系

了解友元:
类的特性之一就是封装,封装的目的就是保护数据,把数据藏起来,但是友元偏偏就对着干
友元存在的意义就是C++为用户提供打破这种封装的手段
一定要明白一件事情,提供这个手段给你,不是让你拿着用着玩,如果说给你拿着玩,为什么还会
有封装呢,所以一定要记住友元用的时候一定要谨慎,在迫不得已的情况下使用,能不用就不用,能避免就避免

二:友元的分类


友元分为友元函数和友元类
友元函数描述的是类与函数之间的关系
友元类描述的是类与类之间的关系

三:友元函数的特点:


一:只是一个函数,友元函数不是类的成员,通过类对象是无法访问的,所以写成一个普通的全局函数是完全没有任何问题的
二:但是在这个函数中有权通过访问类中的所有成员
三:无论声明在类中的任何访问属性下都可以,不影响它的调用和访问

四:友元函数的语法定义:


在类中声明另外一个跟它没有关系的函数为友元函数,函数前面加个friend就完事了。
这样就可以访问原来访问不到的类中的成员,而这个友元函数的声明在任何访问属性下都可以,也就是上面写的友元函数的特点三。
代码举例
 

#include
using namespace std;
class Classname
{
public:
    Classname();
    ~Classname();

private:
    int val;
};

Classname::Classname()
{
}

Classname::~Classname()
{
}
void funcName(ClassName*p_obj)
{
    //p_obj->val; 希望用这个指针去访问这个类中的val是肯定访问不到的
    //cout<val<


上述代码解释了,友元函数只是一个函数,友元函数不是类的成员,通过类对象是无法访问的
但是我们现在可以有一种手段去实现这个事情,那就是友元函数,
我们现在再来解释一下为什么说,在这个函数中有权通过访问类中的所有成员(连私有成员都可以访问
)
那么怎么实现呢,我们就给它这个权限,将这个函数声明为友元的就可以了
 

#include
using namespace std;
class Classname
{
public:
    Classname();
    friend void funcName(ClassName*p_obj);//这就实现了友元函数的定义,在类中声明一个函数
    //前面加个friend就可以了
private:
    int val;
};

Classname::Classname()
{
    val = 9;
}

Classname::~Classname()
{
}
void funcName(ClassName*p_obj)
{
    cout << p_obj->val << endl;
}
int main()
{
    Classname obj;
    funcName(&obj);
    return 0;
}


输出结果为p_obj->val = 9, 既然私有成员都能访问到,那么其他的也就洒洒水啦
需要注意的是函数和类之间本来没有任何联系。声明了友元之后就给了它一个权限,可以去访问类中的任何一个成员,只要按照语法去定义了,其他的代码怎么样都无所谓,反正就是可以访问到了


五:友元类的特点


一:友元类是一个单独的类,是原本互不相关的类,突然之间有了联系,其中的一个类声明了类外一个类,也就是类中声明了一个友元类,在友元类中可以访问该类中的所有成员
二:在A类中声明了友元类,友元B中可以访问A类中的所有成员
代码解释:

#include
using namespace std;
class A
{
public:
    A();
    firend class B;//这就声明了一个友元类
private:
    int m_a;
};

A::A()
{
    m_a = 0;
}

class B
{
public:
    B();
    void test(A*p_obj)
    {
        cout << "" << p_obj->m_a << endl;
    }
private:
    int m_b;
};

B::B()
{
    m_b = 9;
}

int main()
{
    A obj_a;
    A obj_b;
    obj_b.test(&obj_a);
}
输出结果为p_obj->m _a0

综上所述,你也可以总结出友元关系的特点了


六:友元关系的特点:


一、单方向:B是A的朋友,B可以访问A的数据,A不可以访问B的数据。
二、不传递:A是B的朋友,B是C的朋友,A和C没有朋友关系
三、不继承:A是B的朋友,B是C的父亲,A和C没有关系


总结:

能不用友元就不用

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/706934.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)