C++ 友元类和友元函数

  • Post author:
  • Post category:其他




1.作用和应用场景

作用:我们知道类的私有属性只能在类的内部访问, 能不能通过一种途径可以在类的外部访问? 答案是有的,友元函数。

应用场景:主要的应用场景是在一些C++已经定义好的类里面,你无法访问类,不能在类里面实现,只能在外部实现的时候,只能用友元函数。



2.友元函数

a. 友元函数的作用: 可以在类的外部访问类的私有属性,但是会破坏类的封装。

b. 友元函数的格式: friend 函数返回类型 函数名(参数列表)。

c. 友元函数声明的位置和类访问修饰符无关。

//对象的成员必须初始化
class Test
{
    //声明,该函数是Test的友元函数,可以在类的外部访问类的私有成员
    friend void func(Test& x);
private:
    int a;
public:
    Test()
    {
        a = 5;
    }
    void getA() { cout<<a<<endl; };
};

//友元函数的实现
void func(Test& x)
{
    //类的外部修改私有成员变量
    x.a =10 ;
}

int main()
{
    Test a;
    //对象作为实参,必须初始化(手动写构造函数)。(不是C++编译器默认)
    func(a);
    a.getA();

    return 0;
}



3.友元类

a. 若B类是A类的友元类,则B类的所有函数都是A类的友元函数。

b. B类通常作为设计一种对数据操作或类之间传递信息的辅助类。

class A
{
    // leaf 声明了B是自己的好朋友,这样B就可以直接修改自己的私有属性
    //类B是类A的友元类,类B的所有成员函数都是类A的友元函数
    friend class B;  
private:
    int x;
public:
    A()
    {
        x = 10;
        cout << "A被创造" << endl;
    }
    ~A()
    {
        cout << "A被析构" << endl;
    }
};

class B
{
private:
    A a;
public:
    int getX()
    {
        return a.x;    //直接访问a的私有属性
    }
    B()
    {
        cout << "B被创造" << endl;
    }
    ~B()
    {
        cout << "B被析构" << endl;
    }
};

int main()
{
    //1.验证了类B是类A的友元类, 类B的所有成员函数是类A的友元函数
    //2.对于这种组合对象的构造函数的调用顺序记住:先构造的对象后被释放
    B b;
    cout<<b.getX()<<endl;
    return 0;
}

构造函数和析构函数的执行顺序:

在这里插入图片描述