关于友元的理解

本文探讨了C++中的友元概念,包括友元函数如何访问私有成员,友元类的双向关系,以及如何在保证数据安全性的前提下合理使用。重点介绍了友元的声明位置和权限控制,以及其对封装原则的影响。

友元

  • 友元是C++提供的一种破坏数据封装和数据隐藏的机制;
  • 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息;
  • 可以使用友元函数和友元类;
  • 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元;

1、友元函数

面向对象的三大特性:封装、继承和多态,封装使得成员变量和成员方法隐藏起来了,用户必须通过预留的接口来使用类,一定程度上提供了安全性。

在类定义中,使用访问说明符来指定成员权限:

  • public:类内自由访问、类外通过对象访问;
  • private:类内自由访问,类外通过对象使用共有接口访问;
  • protect:类内自由访问,类外通过对象使用共有接口访问;

如上所述,使用对象和公有接口可以访问类中的所有成员,但是如果定义了非成员函数,怎么不通过公有接口访问类中的私有、保护成员呢?

此时,友元的作用就体现出来了:可以让该非成员函数成为该类的友元函数,之后该函数就可以访问类内部的数据和方法了;

操作

class student
{
friend void print(const student&); 
public:
    student();
    ~student();
    
private:
    QString name;
};

void print(const student& s)
{
    qDebug() << "name: " << s.name;
}

注意

  • 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限;
  • 友元不是类的成员,不受它所在区域访问控制级别的约束;
  • 友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明,如果希望类的用户能够调用某个友元函数,那么就必须在友元声明之外再专门对函数进行一次声明

2、友元类

  • 若一个类为另一个类的友元,则该类的所有成员都能访问对方类的私有成员;
  • 声明语法:将友元类名在另一个类中使用friend修饰说明;
  • 类的友元关系是单向的,即类A是类B的友元,类B不是类A的友元;
class A
{
friend class B;
public:
    A();
    ~A();
    
    void display()
    {
        cout << x << endl;
    }

private:
    int x;
}

//=============================================

class B
{
public:
    B();
    ~B();
    
    void set(int i)
    {
        a.x = i;
    }
    void display()
    {
        a.display();
    }
    
private:
    A a;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝勒里恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值