友元函数和友元类

友元函数的特性:
1.首先它是不属于这个类的函数,它可以是全局函数,也可以是另外一个类的成员函数。
2.定义放在类中和类外没有区别。
3.声明放在类的 public 和 private 没有区别。
4.友元函数不属于类,所以没有this指针。
5.友元函数不能被继承。

友元函数的作用:
1.可以直接访问类的私有成员。
2.使用时,需要在类中加以声明。

格式如下:
friend 类型 函数名(形式参数);
#include <iostream>

using namespace std;

class A
{
private:
    int num;
    void printNum()
    {
        cout << "调用函数输出 num:" << num <<endl;
    }
    // 友元函数声明
    friend void printclassA(A &a);
};
// 友元函数定义,希望它可以访问A的私有成员(也可以在类中定义,但它不适于类)
void printclassA(A &a)
{
    a.num = 101;  //给私有变量赋值
    a.printNum(); //调用私有函数
}

int main(int argc, char *argv[])
{
    A a;
    printclassA(a);
    return 1;
}

输出:
调用函数输出 num:101

友元类的特性:
1.友元关系不能被继承。
2.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
3.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的声明。

友元类的作用:
1.如果类A希望类B可以访问它的私有成员,可以在类A把类B设置为友元类。

#include <iostream>

using namespace std;

class A
{
    // 把B设置为A的友元类,希望B可以访问A的私有成员
    friend class B;
private:
    int num;
    void printNum()
    {
        cout << "调用函数输出 num:" << num << endl;
    }
};

class B
{
public:
    void printclassA(A &a)
    {
        a.num = 101;  //给私有变量赋值
        a.printNum(); //调用私有函数
    }
};

int main(int argc, char *argv[])
{
    A a;
    B b;
    b.printclassA(a);
    return 1;
}

输出:
调用函数输出 num:101

总结,为什么要引入友元函数,它的的优缺点:
优点:在实现类之间数据共享时,减少系统开销,提高效率。
缺点:破环了封装机制。

posted @ 2023-05-21 17:11  jason8826  阅读(34)  评论(0编辑  收藏  举报