C++ 类(友元函数和友元类)

文章概述

1.友元函数
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;
}

友元类

a. 若B类是A类的友元类,则B类的所有函数都是A类的友元函数。
b. B类通常作为设计一种对数据操作或类之间传递信息的辅助类。

class A
{
    //类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;
    }
    B()
    {
        cout << "B被创造" << endl;
    }
    ~B()
    {
        cout << "B被析构" << endl;
    }
};

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

构造函数和析构函数的执行顺序:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/wue1206/article/details/81118749