首页 > 其他分享 >友元的讲解与使用

友元的讲解与使用

时间:2024-06-02 17:29:47浏览次数:23  
标签:友元 television remote void 讲解 音量 使用 VolumeUp

友元的讲解与使用


类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办?

友元语法

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

友元函数

在这里插入图片描述
在这里插入图片描述

class A1
{
public:
	A1()
	{
		a1 = 100;
		a2 = 200;
	}
	int getA1()
	{
		return this->a1;
	}
	//声明一个友元函数
	friend void setA1(A1 *p, int a1); //这个函数是这个类的好朋友
	
protected:
private:
	int a1;
	int a2;
};

void setA1(A1 *p, int a1)
{
	p->a1 = a1;
}
void main()
{
	A1 mya1;
	cout<<mya1.getA1()<<endl; 
	setA1(&mya1, 300); //通过友元函数 修改A类的私有属性
	cout<<mya1.getA1()<<endl;

	system("pause");
}

在这里插入图片描述

友元类

  1. 若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数
  2. 友员类通常设计为一种对数据操作或类之间传递消息的辅助类

在这里插入图片描述

友元类注意

  1. 友元关系不能被继承。
  2. 友元关系是单向的,类A是类B的朋友,但类B不一定是类A的朋友。
  3. 友元关系不具有传递性。类B是类A的朋友,类C是类B的朋友,但类C不一定是类A的朋友。

思考: c++是纯面向对象的吗?

如果一个类被声明为friend,意味着它不是这个类的成员函数,却可以修改这个类的私有成员,而且必须列在类的定义中,因此他是一个特权函数。c++不是完全的面向对象语言,而只是一个混合产品。增加friend关键字只是用来解决一些实际问题,这也说明这种语言是不纯的。毕竟c++设计的目的是为了实用性,而不是追求理想的抽象。

运用练习

请编写电视机类,电视机有开机和关机状态,有音量,有频道,提供音量操作的方法,频道操作的方法。由于电视机只能逐一调整频道,不能指定频道,增加遥控类,遥控类除了拥有电视机已有的功能,再增加根据输入调台功能。

提示: 遥控器类可作为电视机类的友元类。

class Remote;

class Television{
	friend class Remote;
public:
	enum{ On,Off }; //电视状态
	enum{ minVol,maxVol = 100 }; //音量从0到100
	enum{ minChannel = 1,maxChannel = 255 }; //频道从1到255
	Television(){
		mState = Off;
		mVolume = minVol;
		mChannel = minChannel;
	}

	//打开电视机
	void OnOrOff(){
		this->mState = (this->mState == On ? Off : On);
	}
	//调高音量
	void VolumeUp(){
		if (this->mVolume >= maxVol){
			return;
		}
		this->mVolume++;
	}
	//调低音量
	void VolumeDown(){
		if (this->mVolume <= minVol){
			return;
		}
		this->mVolume--;
	}
	//更换电视频道
	void ChannelUp(){
		if (this->mChannel >= maxChannel){
			return;
		}
		this->mChannel++;
	}
	void ChannelDown(){
		if (this->mChannel <= minChannel){
			return;
		}
		this->mChannel--;
	}
	//展示当前电视状态信息
	void ShowTeleState(){
		cout << "开机状态:" << (mState == On ? "已开机" : "已关机") << endl;
		if (mState == On){
			cout << "当前音量:" << mVolume << endl;
			cout << "当前频道:" << mChannel << endl;
		}
		cout << "-------------" << endl;
	}
private:
	int mState; //电视状态,开机,还是关机
	int mVolume; //电视机音量
	int mChannel; //电视频道
};

//电视机调台只能一个一个的调,遥控可以指定频道
//电视遥控器
class Remote{
public:
	Remote(Television* television){
		pTelevision = television;
	}
public:
	void OnOrOff(){
		pTelevision->OnOrOff();
	}
	//调高音量
	void VolumeUp(){
		pTelevision->VolumeUp();
	}
	//调低音量
	void VolumeDown(){
		pTelevision->VolumeDown();
	}
	//更换电视频道
	void ChannelUp(){
		pTelevision->ChannelUp();
	}
	void ChannelDown(){
		pTelevision->ChannelDown();
	}
	//设置频道 遥控新增功能
	void SetChannel(int channel){
		if (channel < Television::minChannel || channel > Television::maxChannel){
			return;
		}
		pTelevision->mChannel = channel;
	}

	//显示电视当前信息
	void ShowTeleState(){
		pTelevision->ShowTeleState();
	}
private:
	Television* pTelevision;
};


//直接操作电视
void test01(){

	Television television;
	television.ShowTeleState();
	television.OnOrOff(); //开机
	television.VolumeUp(); //增加音量+1
	television.VolumeUp(); //增加音量+1
	television.VolumeUp(); //增加音量+1
	television.VolumeUp(); //增加音量+1
	television.ChannelUp(); //频道+1
	television.ChannelUp(); //频道+1
	television.ShowTeleState();
}

//通过遥控操作电视
void test02(){
	//创建电视
	Television television;
	//创建遥控
	Remote remote(&television);
	remote.OnOrOff();
	remote.ChannelUp();//频道+1
	remote.ChannelUp();//频道+1
	remote.ChannelUp();//频道+1
	remote.VolumeUp();//音量+1
	remote.VolumeUp();//音量+1
	remote.VolumeUp();//音量+1
	remote.VolumeUp();//音量+1
	remote.ShowTeleState();
}

标签:友元,television,remote,void,讲解,音量,使用,VolumeUp
From: https://blog.csdn.net/2401_83614570/article/details/139393192

相关文章

  • JAVA使用ForkJoinPool实现子任务拆分进行数值累加代码示例
      SumTask.javaimportjava.util.concurrent.RecursiveTask;/***定义任务和拆分逻辑*RecursiveTask<Long>这个是有返回值的*如果不需要返回值可以用RecursiveAction*/publicclassSumTaskextendsRecursiveTask<Long>{/***累加的开始值......
  • SpringBoot基于OpenAPI3的接口文档管理快速集成和使用
    你好,这里是codetrend专栏“SpringCloud2023实战”。本文主要简单介绍SpringCloud2023中进行接口文档管理,方便前后端开发和文档维护。文档管理工具基于开源的knife4j封装的openapi3。前言OpenAPI3.0(前身为Swagger)是一种RESTfulAPI文档规范。OpenAPI3.0规范是一种易于阅读和理......
  • python系列&AI系列:Gradio库的安装和使用教程
    Gradio库的安装和使用教程Gradio库的安装和使用教程一、Gradio库的安装二、Gradio的使用1、导入Gradio库2、创建Gradio接口3、添加接口到Gradio应用4、处理用户输入和模型输出5、关闭Gradio应用界面三、Gradio的高级用法1、多语言支持2、自定义输入和输出格式3、模型版......
  • 在 C# 中实现枚举的最佳使用
    一.介绍在C#编程语言中,枚举(enumeration)的缩写,是一种独特的数据类型,由一组命名常量(称为枚举器)组成。枚举用于建立一系列相互关联的整数常量,通过为这些常量分配描述性名称来增强代码的可读性和可管理性。二.C#中的枚举具有许多优点1.增强可读性和可维护性:枚举允许使用......
  • 如何在Spring中使用@Query注解?
    在Spring中,@Query注解是一种非常强大的工具,它允许你在Repository接口中直接定义查询语句。使用@Query注解,你可以执行JPQL(JavaPersistenceQueryLanguage)查询或者原生SQL查询,从而实现复杂的数据库查询而无需编写自定义的数据访问代码。使用@Query注解的基......
  • MyBatis中的接口代理机制及其使用
    1.MyBatis中的接口代理机制及其使用@目录1.MyBatis中的接口代理机制及其使用2.实操2.1准备工作2.2insert增加操作2.3delete删除操作2.4update修改操作2.5select查询一条记录操作2.6select查询多条记录操作3.总结:4.最后:MyBatis中的接口代理类机制,MyBatis框架......
  • 使用Qt对word文档进行读写
    目录开发环境原理使用的QT库搭建开发环境准备word模板测试用例结果Gitee地址开发环境vs2022+Qt5.9.1+msvc2017_x64,在文章最后提供了源码。原理Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。使用的QT库除了基本的gui、core、widget库......
  • 使用python绘制小提琴图
    使用python绘制小提琴图小提琴图效果代码小提琴图小提琴图(ViolinPlot)是一种结合了箱线图和核密度估计图的图形,用于显示数据分布的情况。它不仅展示了数据的四分位数、最大值和最小值,还通过密度曲线展示了数据的分布形状。相比于传统的箱线图,小提琴图可以提供更多关......
  • 使用clip模型计算图文相似度
    使用clip模型计算图文相似度clip模型模型架构训练过程应用场景clip安装计算图文相似度clip模型CLIP(ContrastiveLanguage-ImagePretraining)是由OpenAI开发的一种深度学习模型,旨在将自然语言处理和计算机视觉任务结合起来。它通过一种名为对比学习(Contrastive......
  • 【云原生进阶之数据库技术】第二章-Oracle-使用-3.3.2-Oracle Data Guard原理
    2DataGuard原理解析2.1数据同步原理        DG的核心组件包括:主数据库:负责处理所有的写操作,并将这些操作记录在重做日志(RedoLogs)中。备用数据库:可以是物理备用数据库(PhysicalStandby)或逻辑备用数据库(LogicalStandby)。物理备用数据库通常是只读的,而逻辑备用......