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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PSOPT在Ubuntu22.04下的安装

求解器pospt的原链接如下&#xff1a; PSOPT/psopt: PSOPT Optimal Control Software (github.com) 在该文件夹下提供了安装的指导文件&#xff0c;文件内容如下&#xff1a; 在 Ubuntu 22.04 中&#xff0c;如果按照适用于 Ubuntu 20.04 的说明执行 PSOPT 代码&#xff0c;目…

详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

596. 超过5名学生的课

596. 超过5名学生的课 题目链接&#xff1a;596. 超过5名学生的课 代码如下&#xff1a; # Write your MySQL query statement below selectclass from (select class,count(student) as num from Courses group by class) as t where num > 5

AI炒股:获取个股的历史成交价格并画出K线图

任务&#xff1a;获取贵州茅台的近几个月的价格数据&#xff0c;绘制k线图&#xff1b; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 用AKShare库获取股票贵州茅台&#xf…

PID算法在电机速度控制上的应用

目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …

Python怎么给图片加水印

在Python中&#xff0c;可以使用PIL&#xff08;Python Imaging Library&#xff09;库或者其更活跃的分支Pillow来给图片添加水印。下面是一个简单的示例&#xff0c;展示如何使用Pillow给图片添加文本水印&#xff1a; from PIL import Image, ImageDraw, ImageFont# 打开原…

3072. 将元素分配到两个数组中 II Rust 线段树 + 离散化

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…

winscp无法上传,删除,修改文件并提示权限不够的分析

使用winscp删除文件,报了个错如下 根据这个错就去百度,网上大部分都是通过下面这种方法解决: 在winscp端进行设置 输入主机名(即IP地址)、用户名和密码,然后点击高级 在箭头所指位置输入sudo + sftp应用程序的路径 先查询 sudo find / -name sftp-server -print点击Sh…

如何让 AI 自动阅读文档样例,编写符合你需求的代码?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 痛点 我本科读的计算机专业。当时编程&#xff0c;讲究的就是个扎实。例如哈夫曼编码用来压缩解压文件&#xff0c;那真的是自己一行行代码写过来的。更…

【Pytorch】计算机视觉项目——卷积神经网络TinyVGG模型图像分类(如何使用自定义数据集)

目录 一、前言二、工作流程回顾三、详细步骤流程1. 环境配置2. 数据准备数据集下载数据存储结构&路径查看图片 3. 数据转换4. 自定义数据集&#xff08;Custom Dataset &#xff09;4.1 方法一&#xff1a;使用ImageFolder加载数据集信息查看张量转图片创建DataLoader 4.2 …

大型ERP设计-业务与功能指引:委托加工二(有偿供料)

委托加工二&#xff08;有偿提供材料&#xff09; 前言&#xff1a;在对ORACLE和SAP的核心模块功能全面解读的基础上&#xff0c;给出大型ERP设计的建议-业务与功能指引&#xff0c;企业选型、开发大型ERP软件的公司和ERP顾问可以参考。模块包括财务、计划与制造、供应链、项目…

Android AAudio——C API创建AudioTrack(六)

虽然 AAudio 试图提供一种直接的硬件访问途径,但在某些场景下,如处理兼容性问题、使用系统服务(如 AudioFlinger)或者在某些设备上,使用 AudioTrack 可能是最有效或最合适的途径。这并不违背 AAudio 的初衷,因为它的目标是提供高性能的音频处理,而不是避免使用系统服务。…

Java Web学习笔记12——JavaScript字符串

String&#xff1a; String字符串对象创建方法有两种&#xff1a; 方式一&#xff1a; var str new String("Hello String"); 方式二&#xff1a; var str "Hello String"; 常见的属性和方法&#xff1a; <!DOCTYPE html> <html lang"…

SwiftUI中ContentUnavailableView的使用(iOS 17、tvOS 17推出的新组件)

iOS 17为SwiftUI带来了一个新的组件ContentUnavailableView&#xff0c;它允许我们向用户呈现一个空状态&#xff0c;而不需要创建自定义错误或者无内容视图。 ContentUnavailableView易于使用&#xff0c;可自定义&#xff0c;并且具有用于空搜索状态的预定义视图。 建议在无…

【考研数学】基础到强化如何衔接? 强化阶段该怎么用书?

我的个人经验在强化阶段之前&#xff0c;只需要基本题型都掌握就足够了。 就比如1800基础篇的习题&#xff0c;你盖住答案自己能做对八九成&#xff0c;那就进入强化绝对够够的了。&#x1f609; 强化的时候&#xff0c;你的正确率可能骤降到三四成&#xff0c;但是完全不用慌!…

【C语言】详解函数(下)(庖丁解牛版)

文章目录 1. 前言2. 数组做函数形参3. 函数嵌套调用和链式访问3.1 嵌套调用3.2 链式访问 1. 前言 详解C语言函数(上)的链接&#xff1a;http://t.csdnimg.cn/EGsfe 经过对函数的初步了解之后,相信大家已经对C语言标准库里的函数已经有初步的认知了&#xff0c;并且还学会了如…

C++面试经验分享

C面经 文章目录 C面经智能指针**内存泄露与智能指针****智能指针有什么类型&#xff0c;各自的原理有什么区别 / 解释下智能指针的实现原理****shared_ptr怎么实现多指针指向同一个地址****引用计数如何保证不同类实例的指针之间共享同步****循环引用会在什么情况下产生&#x…

MATLAB基础应用精讲-【数模应用】二元Logit分析(补充篇)(附python和R语言代码实现)

目录 几个高频面试题目 Logistic与多重线性回归区别 什么情况下用Logistic回归 算法原理

设计模式-工厂方法(创建型)

创建型-工厂方法 简单工厂 将被创建的对象称为“产品”&#xff0c;将生产“产品”对象称为“工厂”&#xff1b;如果创建的产品不多&#xff0c;且不需要生产新的产品&#xff0c;那么只需要一个工厂就可以&#xff0c;这种模式叫做“简单工厂”&#xff0c;它不属于23中设计…