c++学习笔记“类和对象”;友元函数

目录

4.4 友元

 4.4.1 全局函数做友元

 4.4.1 类做友元 

 4.4.1 成员函数做友元 


4.4 友元

生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去但是呢,你也可以允许你的好闺蜜好其友进去。

在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术

友元的目的就是让一个函数或者类 访问另一个类中私有成员

友元的关键字为friend

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元
 4.4.1 全局函数做友元
#include <iostream>
#include <string>
using namespace std;

// 全局函数做友元

class Building {
    friend void goodbye(Building* building);// 声明友元函数
    public:
        Building(){
            m_SittingRoom = "客厅";
            m_BedRoom = "卧室";
        }
    public:
        string m_SittingRoom;
    private:
        string m_BedRoom;
};
// 全局函数声明
void goodbye(Building* building) {
    cout << "好朋友全局函数,正在访问:" << building->m_SittingRoom << "!" << endl;

    cout << "好朋友全局函数,正在访问:" << building->m_BedRoom << "!" << endl;
}
void test() {
    Building building;// 实例化对象
    goodbye(&building);// 调用全局函数
}

int main() {
    test();

    return 0;
}
 4.4.1 类做友元 
#include <iostream>
#include <string>
using namespace std;

// 类做友元

class Building {
    
    friend class goodGirl;// 声明goodGirl类做为友元类;声明后,goodGirl类可以访问Building类的私有成员变量和函数
    public:
        Building();
        //Building(){
        //    m_SittingRoom = "客厅";
        //    m_BedRoom = "卧室";
        //}
    public:
        string m_SittingRoom;
    private:
        string m_BedRoom;
};
class goodGirl {
    public:
        goodGirl();

        void visit();// 参观函数;访问友元类Building的成员函数
        Building* building;// 声明一个指向Building类的指针作为友元
};

//类外写成员函数
Building::Building(){
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

goodGirl::goodGirl(){
    building = new Building();// 实例化一个Building类对象作为友元
}

void goodGirl::visit(){
    cout << "好朋友,欢迎来到" << building->m_SittingRoom << ",看看" << building->m_BedRoom << "吧!" << endl;
}

int main(){
    goodGirl girl;
    girl.visit();
    return 0;
}
 4.4.1 成员函数做友元 
#include <iostream>
#include <string>
using namespace std;

// 成员函数作为友元

class Building; // 声明Building类
class goodGay {
public:
	goodGay();// 构造函数声明
	void visit();// 让visit函数,作为goodGay的友元,访问Building中的私有成员
	void visit_2(); // 让visit_2函数,作为goodGay的友元,不能访问Building中的私有成员
	Building* building;

};

class Building {
	friend void goodGay::visit(); // 声明visit函数为goodGay的友元,访问Building中的私有成员
	public:
		Building();// 构造函数声明
    public:
        string m_SittingRoom;
    private:
        string m_BedRoom;
};

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

goodGay::goodGay() {
	building = new Building();// 实例化Building类
}

void goodGay::visit() {
	cout << "visit访问客厅:" << building->m_SittingRoom << endl;
	cout << "visit访问卧室:" << building->m_BedRoom << endl;
}

void goodGay::visit_2() {
	cout << "访问客厅:" << building->m_SittingRoom << endl;
}

int main() {
	goodGay g;
	g.visit(); // 访问客厅, 访问卧室
	g.visit_2(); // 访问卧室,不能访问私有成员
	return 0;
}

相关推荐

  1. c++学习笔记对象”;函数

    2024-06-06 22:28:02       9 阅读
  2. C++超详细知识点(五):函数

    2024-06-06 22:28:02       21 阅读
  3. C++函数C++ friend关键字)

    2024-06-06 22:28:02       36 阅读
  4. 函数

    2024-06-06 22:28:02       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 22:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 22:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 22:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 22:28:02       18 阅读

热门阅读

  1. map和set

    map和set

    2024-06-06 22:28:02      9 阅读
  2. GPT发展途径

    2024-06-06 22:28:02       9 阅读
  3. 索引的强大作用和是否创建的索引越多越好

    2024-06-06 22:28:02       7 阅读
  4. DDR write leveling失败

    2024-06-06 22:28:02       9 阅读
  5. 域名的端口号范围

    2024-06-06 22:28:02       10 阅读
  6. 软件设计模式概述

    2024-06-06 22:28:02       10 阅读
  7. JVM基础

    JVM基础

    2024-06-06 22:28:02      7 阅读
  8. 前端 实现有时间限制的缓存

    2024-06-06 22:28:02       10 阅读
  9. 深度学习之动量momentum介绍

    2024-06-06 22:28:02       8 阅读