c++学习——友元、全局友元函数、友元类

news2024/12/24 21:47:59

友元

类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办?
解决方法是使用友元函数,友元函数是一种特权函数,c++允许这个特权函数访问私有成员。
这一点从现实生活中也可以很好的理解∶
比如你的家,有客厅,有你的卧室,那么你的客厅是Public 的,所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的闺蜜好基友进去。
程序员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。

友元语法

friend关键字只出现在声明处
其他类、类成员函数、全局函数都可声明为友元
友元函数不是类的成员,不带 this指针
友元函数可访问对象任意成员属性,包括私有属性

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

class Building
{
	//声明这个全局函数为Building类的友元
	//这个函数不是成员函数
	friend void GoodGay(Building &bd);
public:
	Building()
	{
		keting = "客厅";
		woshi = "卧室";
	}
public:
	string keting;
private:
	string woshi;
};

void GoodGay(Building &bd)
{
	cout << "好基友访问:" << bd.keting << endl;
	cout << "好基友访问:" << bd.woshi << endl; 
}

void test01()
{
	Building my;

	GoodGay(my);
}

int main()
{
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

在这里插入图片描述

友元类

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

class Building
{
	//声明GoodF类为Building的友元类
	friend class GoodF;
	friend class GoodF2;
public:
	Building()
	{
		keting = "客厅";
		woshi = "卧室";
	}
public:
	string keting;
private:
	string woshi;
};

class GoodF
{
public:
	void func(Building &bd)
	{
		cout << "访问:" << bd.keting << endl;
		cout << "访问:" << bd.woshi << endl;
	}
};

//1、通过传入参数来访问类的私有成员
void test01()
{
	Building bd;
	GoodF f;
	f.func(bd);
}

//2、通过类内指针来访问类的私有成员
class GoodF2
{
public:
	GoodF2()
	{
		cout << "无参构造" << endl;
		pbu = new Building;
	}
	void func()
	{
		cout << "访问:" << pbu->keting << endl;
		cout << "访问:" << pbu->woshi << endl;
	}
	//拷贝构造
	GoodF2(const GoodF2 &f2)
	{
		cout << "拷贝构造" << endl;
		//1、申请空间
		pbu = new Building;//new之后就有了数据
	}
	~GoodF2()
	{
		cout << "析构函数" << endl;
		if (pbu!=NULL)
		{
			cout << "pbu" << endl;
			delete pbu;
		}
	}
public:
	Building *pbu;
};

void test02()
{
	GoodF2 f;
	f.func();

	GoodF2 f2 = f;
}

int main()
{
	//test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}


类的成员函数成为另一个友元函数

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>
//1、编译器只能看到类的声明不能看到类的结构
class Building;//声明类
class GoodGay
{
public:
	void func(Building &bud);
};

class Building
{
	//声明GoodGay类的成员函数func成为Building类的友元
	friend void GoodGay::func(Building &bud);
public:
	Building()
	{
		keting = "客厅";
		woshi = "卧室";
	}
public:
	string keting;
private:
	string woshi;
};

void GoodGay::func(Building &bud)
{
	cout << "访问:" << bud.keting << endl;
	cout << "访问:" << bud.woshi << endl;
}

void test()
{
	Building bud;
	GoodGay GF;
	GF.func(bud);
}

int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}

友元的注意事项
在这里插入图片描述

防止空指针调用成员函数

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

class Maker
{
public:
	Maker()
	{
		a = 20;
	}
	void printMaker()
	{
		if (this == NULL)
		{
			cout << "this==NULL" << endl;
			return;
		}
		cout << this->a << endl;

	}
private:
	int a;
};

void test()
{
	Maker *m = NULL;//this指针指向NULL,NULL里面没有a
	m->printMaker();
}

int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}

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

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

相关文章

python 自动编译VS项目

目录 一、python自动编译项目 1、环境变量 1) CMAKE 2&#xff09;VS 2、CMAKE 生成VS项目 1) cmake 命令介绍 2&#xff09;python 调用cmake 命令 3、devenv编译VS项目 1) devenv介绍 2&#xff09;devenv命令行开关 3) 自动编译VS项目 一、python自动编译项目 …

04 布隆过滤器BloomFilter

是什么 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff09;是 1970 年由布隆提出的。它实际上是一个很长的二进制数组一系列随机hash算法映射函数&#xff0c;主要用于判断一个元素是否在集合中。通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景&a…

C++ 和机器学习:使用 C++ 执行 ML 任务的简介

C 和机器学习&#xff1a;使用 C 执行 ML 任务的简介 介绍 C 是一种高性能编程语言&#xff0c;非常适合机器学习( ML ) 任务。尽管它在 ML 中可能不像 Python 或 R 那样流行&#xff0c;但它在速度和内存效率方面具有优势。 在本文中&#xff0c;我们将概述使用 C 执行 ML 任务…

“双碳同行者大会”成功举办,绿色家居企业参与其中

2023年5月27日 &#xff0c;由万科集团创始人、深石集团创始人王石先生创立的碳中和社区品牌“生物圈三号”在深圳大梅沙成功举办了“回归未来双碳同行——生物圈三号双碳同行者大会暨全球运河穿越新书发布会”。 生物圈三号作为社区碳中和综合解决方案平台&#xff0c;为建筑、…

Word控件Spire.Doc 【其他】教程(5):在 Word 中嵌入媒体文件

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

Axios请求失败重刷接口

需求背景 页面接口请求时偶尔会出现 Network Error 异常报错&#xff0c;重新请求就会请求成功 接口没办法捕获异常原因&#xff0c;前端来做一次重刷解决问题 net::ERR_SSL_PROTOCOL_ERRORnet::ERR_CONNECTION_REFUSED 解决思路 记录请求map&#xff08;以url为唯一标识&…

Live800:智能客服机器人有哪些核心功能?

随着互联网的普及和用户服务要求的不断升级&#xff0c;许多企业已经开始关注在线客服系统以及智能客服机器人的应用。 那么&#xff0c;智能客服机器人在解决企业痛点的过程中&#xff0c;充分使用了哪些核心功能呢&#xff1f; 一、自然语言处理 客户提问的方式千奇百怪&am…

Hindawi官宣上线8本新刊!这6本被踢SCI期刊,EI正常在检

Hindawi官宣&#xff1a;8本新刊上线 2023年5月23日&#xff0c;Hindawi官宣与IET的8本合作期刊在完全开放获取模式下全面上线&#xff0c;所有期刊名称仍然保留IET抬头&#xff0c;但将由Hindawi全面负责出版、主持和运营等相关事宜。 No.1 IET BioMetrics 该期刊关注生物识…

linux shell编程规范和变量

一、shell简述 概念&#xff1a;shell解释器&#xff0c;翻译官功能&#xff0c;与内核进行沟通的应用程序。 把代码翻译为二进制&#xff0c;让内核处理&#xff0c;负责接收用户输入的操作指令&#xff08;命令&#xff09;并进行解释&#xff0c;将需要执行的操作传递给内核…

功能上新| GPU篇:SoC GPU信息、GPU Counter性能指标

在玩家要求游戏更流畅、画质更精美的今天&#xff0c;优化GPU过度使用导致的性能问题成了大多数游戏开发团队关注的核心。当项目的GPU压力达到一定阈值时&#xff0c;卡顿、掉帧、发热、降频等问题便随之而来&#xff0c;严重影响用户体验。 为了解决项目的GPU压力问题&#x…

Kafka的常用命令

提前说明&#xff1a;下述所有命令都是需要进入到Kafka服务的的bin目录下执行&#xff0c;即下图所示目录。 1.查看主题列表 kafka-topics.sh --list --bootstrap-server ip:端口 2.创建主题 如下为创建一个单分区单副本的主题的命令示例&#xff1a; kafka-topics.sh --c…

Hack The Box - sequel关卡

TASK 1 任务 1 During our scan, which port do we find serving MySQL? 在扫描过程中&#xff0c;我们发现哪个端口为 MySQL 提供服务&#xff1f; 3306TASK 2 任务 2 What community-developed MySQL version is the target running? 目标运行的是哪个社区开发的MySQL版…

基于nodejs+Vue的少儿编程课程网上报名系统express+vscode

近年来&#xff0c;随着网络技术的不断发展&#xff0c;越来越多人在网站查询各种信息&#xff0c;少儿编程网上报名系统对用户和管理员都有很大帮助&#xff0c;少儿编程网上报名系统通过和数据库管理系软件协作来实现用户与管理员之间的一个很好的操作平台&#xff0c;基于这…

【大数据学习篇11】广告点击流实时统计

学习目标/Target 掌握广告点击流实时统计实现思路 掌握利用Kafka生产用户广告点击流数据 了解数据库设计 掌握如何创建Spark Streaming连接 掌握利用Spark Streaming读取业务数据 掌握利用Spark读取黑名单用户 掌握利用Spark Streaming过滤黑名单用户 掌握利用Spark St…

bug:使用useClipboard不生效问题

背景 使用vueuse/core的useClipboard来实现复制功能&#xff0c;没有生效。 原因 useClipboard 的底层是是使用navigator.clipboard实现的。但是在 http协议 中&#xff0c;navigator.clipboard打印undefined&#xff08;如下图&#xff09;&#xff0c;导致在http协议中使用…

旅行商问题TSP

目录 蚁群算法 Hopfield网络 遗传算法 免疫算法 蚁群算法 求解思路 Hopfield网络 Hopfield网络适合求结果的次优解&#xff0c;可以保证解向能量函数最小值方向收敛&#xff0c;但不能确保达到全局最小点。 实现能量函数 网格能量的最小值对应于最佳或者次最佳的路径距离。…

MySQL部署PXC集群-全网最详细

MySQL部署PXC集群 一&#xff0c;PXC了解 1.PXC介绍 Percona XtraDB Cluster&#xff08;简称PXC&#xff09; 是基于Galera的MySQL高可用集群解决方案 Galera Cluster是Codership公司开发的一套免费开源的高可用方案 PXC集群主要由两部分组成&#xff1a;Percona Server …

计算机网络开荒1-概述

文章目录 一、网络基本概述1.2 InternetInternet组成Internet服务角度 1.3 网络协议 二、计算机网络结构2.1 计算机网络结构2.1.1 网络边缘2.1.2 接入网络 物理介质2.1.2.1 DSL2.1.2.2 电缆网络2.1.2.3 家庭网络接入2.1.2.4 企业网络接入2.1.2.5 无线网络接入 2.1.3 网络核心 三…

肉豆蔻酰六肽-4 /myristoyl hexapeptide-4, sympeptide230

简介----肉豆蔻酰六肽-4 肉豆蔻酰六肽-4为胜肽系列应用最早和最广泛的多胜肽&#xff0c;国内外知名品牌普遍采用作为抗皱配方重要成分&#xff0c;在很多抗皱护肤产品中经常出现它的身影。它可以穿透真皮增加胶原蛋白&#xff0c;通过从内至外的重建来逆转皮肤老化的过程&…

感应雷电浪涌的防线,SPD浪涌保护器

SPD - Surge Protective Device SPD 是防止雷击导致故障的避雷器&#xff0c;代表浪涌保护设备。一般指浪涌保护器&#xff0c;浪涌保护器&#xff0c;也叫防雷器&#xff0c;是一种为各种电子设备、仪器仪表、通讯线路提供安全防护的电子装置。 IEC/ EN61643-11 &#xff08…