【C++第二阶段】友元

news2024/9/24 21:21:53

你好你好!
以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录

  • 全局函数做友元
  • 类对象做友元
  • 成员函数做友元


全局函数做友元

What

在全局函数中,可以访问类中private权限下的成员属性。

How

在类对象中,通过在类名第一行写入friend void GlobalFunction();,声明此全局函数为类友元,即可在全局函数调用时访问类中成员属性。

Why

规定

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

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

关键字为friend,三种实现包括:全局函数做友元;类做友元;成员函数做友元。

code:

#include<iostream>
#include<string>
using namespace std;

class ClassMates {

	friend void init_classmates(ClassMates& classmates);
	friend void test_0207_0();

	string grade;

public :
	
	int classmates_numbers;
};

void init_classmates(ClassMates& classmates) {
	classmates.classmates_numbers = 60;
	classmates.grade = "三年二班";
}

void test_0207_0() {
	ClassMates classmates;
	init_classmates(classmates);
	cout << "班级人数为:" << classmates.classmates_numbers << "." << endl;
	cout << "班级为:" << classmates.grade << "." << endl;

}

int main() {
	cout << "hello world !" << endl;
	test_0207_0();
    
    system("pause");
    return 0;
}


可以看到,如果不在类中声明该全局函数为类的友元,则不能访问类中的私有成员。

image-20240207112801646

运行结果为:

image-20240207113842051

可以看到,将友元关键词添加到类中,可以通过全局函数访问类中的私有权限成员属性。


类对象做友元

What

类A做类B的友元,则类B可以访问类A的私有成员属性。

Code

#include<iostream>
#include<string>
using namespace std;

class Building {
public:
	Building();//构造函数
private:
	string building_bedroom;//私有成员属性,不可访问,除非友元

	friend class Person;

public:
	string building_living_room;

};

class Person {
public:
	Person();//公共权限下的构造函数
private:
	string name;
	Building building;
public:
	void visit() {
		cout << "好朋友来到了您的" << building.building_living_room << "." << endl;
		cout << "好朋友来到了您的" << building.building_bedroom << "." << endl;
	}
};

//构造函数-类外构造
Building::Building() {
	building_living_room = "客厅";
	building_bedroom = "卧室";
}

Person::Person() {
	Building building;
}

void test_0207_1() {
	Person Jessy;
	Jessy.visit();
}


int main() {
	cout << "hello world !" << endl;
	test_0207_1();
    
    system("pause");
    return 0;
}

Result

image-20240207160629212

可以看到,在类外也可以重写构造函数。

同时,将Person类作为Building的友元,可以让Person类访问Building类的所有私有属性。


成员函数做友元

What

单独的成员函数可以访问私有的成员属性,只需要在需要访问的类中声明友元。

Code

#include<iostream>
#include<string>
using namespace std;

class Building;
class Person;


class Person {
public:
	Person(string name);

	string person_name;
	

	void visit_living_room();

	void visit_bedroom();

private:
	Building* building;//创建指向building类型的指针。
};

class Building {
	friend void Person::visit_bedroom();
private:
	string building_bedroom;
public:
	Building();
	string building_living_room;
};

Building::Building() {
	building_bedroom = "卧室";
	building_living_room = "客厅";
}

Person::Person(string name) {
	person_name = name;
	building = new Building;//Building指针指向新建堆区的内存。
}
void Person::visit_living_room() {
	cout << person_name << "正在访问" << building->building_living_room << "." << endl;
}

void Person::visit_bedroom() {
	cout << person_name << "正在访问" << building->building_bedroom << "." << endl;
}
void test_0207_2() {
	string name = "Jessy";
	Person Jessy(name);
	
	Jessy.visit_living_room();
	Jessy.visit_bedroom();
}

int main() {
	cout << "hello world !" << endl;
	test_0207_2();
    
    system("pause");
    return 0 ;
}

运行结果

image-20240207172623749


以上是我的学习笔记,希望对你有所帮助!
如有不当之处欢迎指出!谢谢!

学吧,学无止境,太深了

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

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

相关文章

微软.NET6开发的C#特性——接口和属性

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。 C#经历了多年发展&#xff0c; 进行了多次重大创新&#xf…

Java面向对象 继承

目录 继承继承的好处继承具有传递性实例创建Person类Student继承Person类测试 继承 Java中的继承是面向对象编程的一个核心特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。通过继承&#xff0…

mysql 对于null字段排序处理

最近遇到一个需求 &#xff0c;需要对一个报表的多个字段进行多字段复杂条件排序 排序字段为NULL时 Mysql对于排序字段为NULL时&#xff0c;有自身默认的排序规则&#xff0c;默认是认为null 值 是无穷小 ELECT id,script_id,last_modified,live_count,next_show FROM virtua…

PKI - 05 证书申请步骤

文章目录 Pre概述第一步:时间同步第二步: 部署证书服务器第三步: 客户端产生密钥第四步: 验证证书服务器第五步: 申请个人证书第六步&#xff1a; 审核并签名证书第七步: 颁发数字证书第八步: 交换公钥 Pre PKI - 02 对称与非对称密钥算法 PKI - 03 密钥管理&#xff08;如何…

Docker Compose实例

目录 一、前提说明 二、简单的Docker容器部署案例 1. Dockerfile 配置 2. docker-compose.yml 配置 3. application.properties 配置 4. pom.xml 配置 5. 上传文件 6. 创建基础Docker镜像 7. docker-compose.yml编排 8. 停止并删除容器编排 一、前提说明 在配置好Do…

路由器如何映射端口映射?

在现代互联网中&#xff0c;随着网络应用的不断发展&#xff0c;很多用户需要进行远程访问或搭建服务器来满足自己的需求。由于网络安全的原因&#xff0c;直接将内网设备暴露在公网中是非常危险的。为了解决这个问题&#xff0c;路由器映射端口映射技术应运而生。本文将介绍什…

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

2023年第四季度硬盘容量强势增长9%

在2023年第四季度&#xff08;CQ4 23&#xff09;&#xff0c;硬盘驱动器&#xff08;HDD&#xff09;市场的总容量出货量环比增长9%&#xff0c;达到214EB&#xff0c;而单位出货量保持在2900万块不变。其中&#xff0c;近线存储&#xff08;Nearline&#xff09;硬盘的容量出…

【MySQL】MySQL复合查询--多表查询/自连接/子查询

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------------…

基于Skywalking开发分布式监控(二)

续上篇&#xff0c;上一篇主要是讲了为啥选skywalking&#xff0c;以及怎么有针对性改造SW Agent&#xff0c;现在我们继续看看如何构建自定义Trace跟踪链 要对SW Agent插件做适当剪裁&#xff0c;原来包括customize插件在内SW 8.9有100多个插件&#xff0c;如果没有作用也就罢…

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求&#xff1a;有大量的扫描件需要还原为可编辑的文本&#xff0c;很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的&#xff0c;结果用了几个开源库&#xff0c;效果不理想。后来&#xff0c;用了取巧的方法&#xff0c;直接使用了WX的OCR识别模…

STM32 新建寄存器版本MDK工程简要步骤

新建工程文件夹 新建一个工程根目录文件夹&#xff0c;并在该文件夹里新建D/M/O/P/U文件夹。 Drivers&#xff1a;存放与硬件相关的驱动层文件Middlewares&#xff1a;存放正点原子提供的中间层组件文件和第三方中间层文件Output&#xff1a;存放工程编译输出文件Projects&am…

介绍一下BFS

BFS&#xff0c;即广度优先搜索&#xff08;Breadth-First Search&#xff09;&#xff0c;是一种图形搜索算法&#xff0c;用于在图或树等数据结构中遍历或搜索节点。这种算法从根节点开始&#xff0c;沿着树的宽度遍历树的节点&#xff0c;直到找到目标节点或遍历完所有节点。…

cnpm : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\cnpm.ps1

cnpm命令被禁止使用 我已经安装cnpm &#xff0c;但是使用不了&#xff0c;重新安装也没用。 报错如下图&#xff1a; cnpm无法使用报错 解决问题 1、打开系统Windows PowerShell,使用管理员身份运行。 打开Windows PowerShell 2、输入set-ExecutionPolicy RemoteSigned&a…

FPGA_工程_按键控制的基于Rom数码管显示

一 信号 框图&#xff1a; 其中 key_filter seg_595_dynamic均为已有模块&#xff0c;直接例化即可使用&#xff0c;rom_8*256模块&#xff0c;调用rom ip实现。Rom_ctrl模块需要重新编写。 波形图&#xff1a; 二 代码 module key_fliter #(parameter CNT_MAX 24d9_999_99…

BlueLotus 下载安装使用

说明 蓝莲花平台BlueLotus&#xff0c;是清华大学曾经的蓝莲花战队搭建的平台&#xff0c;该平台用于接收xss返回数据。 正常执行反射型xss和存储型xss&#xff1a; 反射型在执行poc时&#xff0c;会直接在页面弹出执行注入的poc代码&#xff1b;存储型则是在将poc代码注入用…

grafana+prometheus+hiveserver2(jmx_exporter+metrics)

一、hiveserver2开启metrics&#xff0c;并启动jmx_exporter 1、修改hive-site.xml文件开启metrics <property><name>hive.server2.metrics.enabled</name><value>true</value> </property> <property><name>hive.service.m…

idea 配置文件,中文出现乱码如何解决

在进行 spring 项目开发时&#xff0c;项目中有 application.properties/application.yml 等配置文件&#xff0c;在配置文件中使用中文注解时可能会出现乱码的情况&#xff0c;如下&#xff1a; 这是因为 idea 配置文件的编码和其他文件的不同&#xff0c;我们需要修改配置文件…

特征工程:特征提取和降维-上

目录 一、前言 二、正文 Ⅰ.主成分分析 Ⅱ.核主成分分析 三、结语 一、前言 前面介绍的特征选择方法获得的特征&#xff0c;是从原始数据中抽取出来的&#xff0c;并没有对数据进行变换。而特征提取和降维&#xff0c;则是对原始数据的特征进行相应的数据变换&#xff0c;并…

leetcode707. 设计链表

leetcode707. 设计链表 题目 思路 1.使用虚头节点&#xff0c;模拟class的初始化 2.class中添加一个链表长度的属性&#xff0c;便于后续操作 代码 class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextclass MyLinkedList:def __init__(self)…