五、友元

类的主要特点是数据隐藏,即类的私有成员无法在类的外部访问,但是,有时候需要在类的外部访问类的私有成员
解决方法就是使用友元函数,友元函数是一种特权函数, C++允许这个特权函数访问私有成员。可以理解为自己房间是私有空间,一般人都不允许访问,但是允许自己的好朋友访问,就相当于房间给好朋友开了特权

 

一、全局函数做友元函数

// 就是将全局函数放到类中做申明, 并且前面加上 friend
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

class Building
{

    // 让全局的好基友函数 变为我的好朋友 -- 友元函数
    friend void googGay(Building * building);
public:
    Building()
    {
        this->SittingRoom = "客厅";
        this->BedRoom = "卧室";
    }

    // 客厅, 卧室
    string SittingRoom;// 客厅
private:
    string BedRoom;
};

// 友元函数的目的就是访问类中的私有成员属性
// 全局函数 好基友
void googGay(Building * building)
{
    cout << "好基友正在访问" << building->SittingRoom << endl;
    cout << "好基友正在访问" << building->BedRoom << endl;  // 将好基友函数加入到友元函数就可以访问
}

void test01()
{
    Building *building = new Building;
    googGay(building);

}


int main()
{
    test01();
    return EXIT_SUCCESS;
}

二、整个类做友元类

// friend class 类名  
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

class Building;

class goodGay
{
public:
    goodGay();

    void visit();
    
private:
    Building * building;
};

class Building
{
    // 让好基友类做 Building的友元类
    friend class goodGay;
public:
    Building();

    string SittingRoom;
private:
    string BedRoom;
};

goodGay::goodGay()
{
    building = new Building;
}
void goodGay::visit()
{
    cout << "好基友正在访问 " << this->building->SittingRoom << endl;
    cout << "好基友正在访问 " << this->building->BedRoom << endl;
     
}

Building::Building()
{
    this->SittingRoom = "客厅";
    this->BedRoom = "卧室";
}

void test01()
{
    goodGay gg;
    gg.visit();
}

int main()
{
    test01();
    return EXIT_SUCCESS;
}

 

三、成员函数做友元函数

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
using namespace std;

// 只让vist可以作为 Building 的好朋友, visit2不可以访问 Building 私有属性


class Building;

class goodGay
{
public:
    goodGay();

    void visit();

    void visit2();

private:
    Building * building;
};

class Building
{
    // 让成员函数 visit 作为友元函数
    friend void goodGay::visit();
public:
    Building();

    string SittingRoom;
private:
    string BedRoom;
};

goodGay::goodGay()
{
    building = new Building;
}
void goodGay::visit()
{
    cout << "好基友正在访问 " << this->building->SittingRoom << endl;
    cout << "好基友正在访问 " << this->building->BedRoom << endl;

}

void goodGay::visit2()
{
    cout << "好基友正在访问 " << this->building->SittingRoom << endl;
    // cout << "好基友正在访问 " << this->building->BedRoom << endl; 访问不到
}

Building::Building()
{
    this->SittingRoom = "客厅";
    this->BedRoom = "卧室";
}


void test01()
{
    goodGay gg;
    gg.visit();
}
int main()
{
    test01();
    return EXIT_SUCCESS;
}

 

posted on 2022-03-14 20:31  软饭攻城狮  阅读(31)  评论(0)    收藏  举报

导航