「地表最强」C++核心编程(七)类和对象--友元

环境:
编译器:CLion2021.3;操作系统:macOS Ventura 13.0.1

文章目录

  • 一、全局函数做友元
  • 二、类做友元
  • 三、成员函数做友元

地表最强C++系列传送门:
「地表最强」C++核心编程(一)内存分区模型
「地表最强」C++核心编程(二)引用
「地表最强」C++核心编程(三)函数提高
「地表最强」C++核心编程(四)类和对象----封装
「地表最强」C++核心编程(五)类和对象----对象初始化和清理
「地表最强」C++核心编程(六)类和对象----对象模型和this指针
「地表最强」C++核心编程(七)类和对象----友元
「地表最强」C++核心编程(八)类和对象----运算符重载
「地表最强」C++核心编程(九)类和对象----继承
「地表最强」C++核心编程(十)类和对象----多态
「地表最强」C++核心编程(十一)文件操作

在类中定义的成员属性往往是private,外界是无法访问的。若有特殊需求想让外界可以访问这些私有属性,可以把允许访问的这个外界设置为本类的友元。

一、全局函数做友元

class Building {
    //告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容
    friend void goodGay(Building *building);

public:
    string m_SittingRoom; //客厅
private:
    string m_BedRoom; //卧室

public:
    Building() {
        this->m_SittingRoom = "客厅";
        this->m_BedRoom = "卧室";
    }
};

void goodGay(Building *building) {
    cout << "好基友正在访问: " << building->m_SittingRoom << endl;//ok
    cout << "好基友正在访问: " << building->m_BedRoom << endl;//ok,若不将goodGay设为友元则err
}

二、类做友元

class Building {
    //告诉编译器 goodGay类是本类的好朋友,可以访问到Building类中私有内容
    friend class goodGay;

public:
    string m_SittingRoom; //客厅
private:
    string m_BedRoom;//卧室

public:
    Building();
};


class goodGay {
private:
    Building *building;

public:
    goodGay();
    void visit();//访问Building的属性
};

Building::Building() {//类外实现成员函数
    this->m_SittingRoom = "客厅";
    this->m_BedRoom = "卧室";
}

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

void goodGay::visit() {
    cout << "好基友正在访问" << building->m_SittingRoom << endl;//ok
    cout << "好基友正在访问" << building->m_BedRoom << endl;//ok
}

三、成员函数做友元

class Building {
    //告诉编译器  goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
    friend void goodGay::visit();

public:
    string m_SittingRoom; //客厅
private:
    string m_BedRoom;//卧室

public:
    Building();
};

class goodGay {
private:
    Building *building;
public:
    goodGay();
    void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
    void visit2();
};

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

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

void goodGay::visit() {
    cout << "好基友正在访问" << building->m_SittingRoom << endl;
    cout << "好基友正在访问" << building->m_BedRoom << endl;
}

void goodGay::visit2() {
    cout << "好基友正在访问" << building->m_SittingRoom << endl;
//    cout << "好基友正在访问" << building->m_BedRoom << endl;//err,因为只声明了visit是友元而没有把visit2声明为友元
}

你可能感兴趣的:(C++,c++,开发语言)