C++面向对象:友元关键字friend的使用

友元概述(需快速查阅看文末总结)

友元:顾名思义,就像朋友一样的元素

  • 好比一个人个房屋内,有客厅和卧室,卧室比较私人(private),一般客人无法访问,只能在客厅这个公有环境(public)里面移动.
  • 而友元的出现,就好比是自己的好基友来到了家里,可以让好基友进入自己的私人卧室.

友元让private修饰的变量属性不再绝对的私有.在必要的时候可以使用friend关键字进行修饰访问.
具体用法如下:

全局函数做友元

全局函数是指在类外以及main函数之外的函数叫全局函数,作用域是全局.

bedroom是私有属性,但是可以通过让全局函数变成友元函数来进行访问.
在这里插入图片描述
在这里插入图片描述

/* 客厅public,卧室 private
但是有特殊权限的,访问私有的内容
要用到友元技术

关键字为friend

三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元 */
#include <iostream>
using namespace std;
#include <string>
class Building
{
    // goodgay这个函数是Building的一个好朋友,可以访问里面的私有成员.
    friend void goodgay(Building *buliding);
public:
    // 建筑物
    Building()
    {
        sittingRoom = "客厅";
        bedroom = "卧室";
    }

public:
    string sittingRoom;

private:
    string bedroom;
};
// 全局函数
void goodgay(Building *buliding)
{
    cout << "好基友的全局函数正在访问: " << buliding->sittingRoom << endl;

    cout << "好基友的全局函数正在访问: " << buliding->bedroom << endl;
}
void test01()
{
    Building building;
    goodgay(&building);
}
int main()
{
    test01();
    system("pause");
    return 0;
}

友元类

在这个例子中

  • GoodGay类创建了一个Building类的指针,那么在GooGay类里面就可以访问Building类的元素
  • 但是Building类中的私有成员变量bedroom访问不到
  • 在Building类中声明加上friend关键字的GoodGay类就可以让类称为友元类,就可以访问Building类中的私有成员.

此外,在类外写构造函数和方法的时候,一定要加上作用域: 类名::函数体
在这里插入图片描述

#include <iostream>
using namespace std;
#include<string>
class Building;
class GoodGay{
public:
    GoodGay();
    void visit(); // 参观函数访问building中的属性
    Building *building;
};
class Building{
    // goodgay这个类是本类的好朋友,可以访问私有的成员
    friend class GoodGay;
public:
    Building();
public:
    string sittingRoom;
private:
    string bedroom;
};
// 类外去写成成员函数
Building::Building(){
    sittingRoom = "客厅";
    bedroom = "卧室";
}
GoodGay::GoodGay(){
    // 创建建筑物的对象
    building = new Building;
}
void GoodGay::visit(){
    cout<<"好基友的类正在访问"<<building->sittingRoom<<endl;
    cout<<"好基友的类正在访问"<<building->bedroom<<endl;
}
void test01()
{
    GoodGay gg;
    gg.visit();
}
int main()
{
    test01();
    system("pause");
    return 0;
}

成员函数做友元

  • 刚刚说明了全局函数来访问私有属性,通过其他类的类内指针来访问私有属性
  • 现在还可以通过成员函数来访问私有属性.

我们先创建两个成员函数: visit()和visit2()来进行比较.
这两个成员函数都是GoodGay的成员函数,一开始他们都没有权限去访问Building的私有属性
但是,在Building类中声明了 GoodGay作用域下的visit()函数是"朋友",可以访问私有属性,于是visit()函数就可以访问卧室了

一定要记住声明作用域!
在这里插入图片描述

#include <iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:
    GoodGay();
    void visit();  
    //让visit函数可以访问building中私有成员的内容
    void visit2(); 
    //让visit2函数不可以访问building中私有成员的内容.
    Building *building;
};
class Building
{
    friend void GoodGay::visit();
    // 告诉编译器,GoodGay下的visit函数作为本类的好朋友,可以访问私有的成员.
public:
    Building();
public:
    string sittingRoom;

private:
    string beadroom;
};

Building::Building()
{
    sittingRoom = "客厅";
    beadroom = "卧室";
}

GoodGay::GoodGay()
{
    building = new Building;
}

void GoodGay::visit()
{
    cout << "visit 函数正在访问" << building->sittingRoom << endl;
    cout << "visit 函数正在访问" << building->beadroom << endl;
}
void GoodGay::visit2()
{
     cout << "visit2 函数正在访问" << building->sittingRoom << endl;
    //  cout << "visit2 函数正在访问" << building->beadroom << endl; 报错
}
void test01()
{
    GoodGay gg;
    gg.visit();
    gg.visit2();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

总结

方式代码
全局函数做友元friend 函数类型 函数名(参数);,如 friend void test(int a);
类做友元friend class 类名,如 friend class Test;
成员函数做友元friend 函数类型 类名::函数名(参数); 如 friend void Test::test(int a );
posted @ 2021-05-23 21:11  Zeker62  阅读(235)  评论(0编辑  收藏  举报