模板类与友元

目录

分类

一、非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数;

代码

分析

运行结果

二、约束模板友元:模板类实例化时,每个实例化的类对应一个友元函数;并且这个模板友元适用多种类模板(最常用)

代码

分析

1)构造约束模板友元函数的步骤

2)编译器在实例化某种数据类型的模板类时,也会实例化这种数据类型的模板函数

3)友元模板函数适应于多种类模板,如AA和BB;

4)优点(与非模板友元对比)

运行结果

三、非约束模板友元:模板实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数;(模板 函数,实际开发一般不用)

代码

分析

运行结果


分类

模板类的友元函数有三类

1)非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数;

2)约束模板友元:模板类实例化时,每个实例化的类对应一个友元函数;

3)非约束模板友元:模板实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数;

一、非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数;

代码

#include<iostream>
using namespace std;
template<class T1,class T2>
class AA//AA是类模板,是类的通用描述,改变不存在叫AA的类
{
	private:
	T1 m_x;
	T2 m_y;
	public:
		friend void show(AA<T1,T2>&a)
		{
			cout<<"x="<<a.m_x<<",y="<<a.m_y<<endl;
		}
		AA(const T1 x,const T2 y):m_x(x),m_y(y){
		}
};

int main()
{
	//是类名AA<int,string>
	AA<int,string>aa(88,"我是一只小猫咪");
	show(aa);
	return 0;
}

分析

非模板友元:友元函数不是模板函数,而是利用模板类参数生成的函数,只能在类内实现。

该方法生成的友元函数只能用于该模板类,不能用于其他模板类;

运行结果

二、约束模板友元:模板类实例化时,每个实例化的类对应一个友元函数;并且这个模板友元适用多种类模板(最常用)

 代码

#include<iostream>
using namespace std;

//约束模板友元:模板实例化时,每个实例化的类对应一个友元函数
template<typename T>
void show(T&a);					//第一步:在模板类定义的前面,声明友元函数,为了让模板类知道友元函数模板的存在

template<class T1,class T2>
class AA//AA是类模板,是类的通用描述,改变不存在叫AA的类
{							
	private:			
		T1 m_x;
		T2 m_y;//第二步:在模板类中,再次声明友元函数模板,让编译器知道需要实例化的友元函数模板
		friend void show<>(AA<T1,T2>&a);	//这行代码让类模板和函数模板扯上关系
	public:
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
};
template<class T1,class T2>
class BB//AA是类模板,是类的通用描述,改变不存在叫AA的类
{							
	private:			
		T1 m_x;
		T2 m_y;//第二步:在模板类中,再次声明友元函数模板,让编译器知道需要实例化的友元函数模板
		friend void show<>(BB<T1,T2>&a);	//这行代码让类模板和函数模板扯上关系
	public:
		BB(const T1 x,const T2 y):m_x(x),m_y(y){}
};
//编译器在实例化某种数据类型的模板类时,也会实例化这种数据类型的模板函数
//通用版本友元函数
template<typename T>			//第三步:友元函数模板的定义
void show(T&a)
{
	cout<<"通用:x="<<a.m_x<<",y="<<a.m_y<<endl;
}
//因为友元函数是函数模板,所以可以有具体化版本
//具体化版本友元函数
template<>			
void show(AA<int,string>&a)		//第四步:具体化版本
{
	cout<<"具体:x="<<a.m_x<<",y="<<a.m_y<<endl;
}

int main()
{
	//是类名AA<int,string>
	AA<int,string>aa(88,"我是一只小猫咪");
	show(aa);	//使用具体化的版本
	BB<char,string>bb('2',"我是一只小猫咪");
	show(bb);	//使用通用的版本	,友元函数适应多种函数模板
	return 0;
}

分析

1)构造约束模板友元函数的步骤

①第一步:在模板类定义的前面,声明友元函数,为了让模板类知道友元函数模板的存在

②第二步:在模板类中,再次声明友元函数模板,让编译器知道需要实例化的友元函数模板

③第三步:友元函数模板的定义

④第四步:具体化版本

2)编译器在实例化某种数据类型的模板类时,也会实例化这种数据类型的模板函数

3)友元模板函数适应于多种类模板,如AA和BB;

4)优点(与非模板友元对比)

①可以具体化

②支持多个版本

运行结果

三、非约束模板友元:模板实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数;(模板 函数,实际开发一般不用)

代码

#include<iostream>
using namespace std;

//非类模板约束的友元函数:模板实例化时,每个函数都是每个每个类的友元
template<class T1,class T2>
class AA//AA是类模板,是类的通用描述,改变不存在叫AA的类
{							
	private:			
		T1 m_x;
		T2 m_y;
		template<typename T>		//把show函数模板声明为友元函数模板
		friend void show(T&a);		//和普通函数声明为友元函数是类似的
	public:
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
};

//通用版本函数模板
template<typename T>			
void show(T&a)
{
	cout<<"通用:x="<<a.m_x<<",y="<<a.m_y<<endl;
}
//函数模板具体化版本
template<>			
void show(AA<int,string>&a)		
{
	cout<<"具体:x="<<a.m_x<<",y="<<a.m_y<<endl;
}

int main()
{
	//是类名AA<int,string>
	AA<int,string>a1(88,"我是一只小猫咪");
	show(a1);	//使用具体化的版本
	AA<char,string>a2('2',"我是一只小猫咪");
	show(a2);	//使用通用的版本	
	return 0;
}

分析

1)非约束模板的友元函数,模板实例化时,如果实例化了n个类,也会实例化n个友元函数,每个实例化的类都拥有n个友元函数;不科学

2)对于程序员来说,这种友元函数和约束模板友元函数是没有区别的;

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pg事务:事务ID

事务ID pg中每个事务都会分配事务ID&#xff0c;事务ID分为虚拟事务ID和持久化事务ID&#xff08;transactionID&#xff09;。pg的事务ID非常重要&#xff0c;是理解事务、数据可见性、事务ID回卷等等的重要知识点。 虚拟事务ID 只读事务不会分配事务ID&#xff0c;事务ID是…

Chrome Performance 页面性能分析

Chrome Performance 页面性能分析 背景介绍 性能优化是前端开发一个非常重要的组成部分&#xff0c;如何更好地进行网络传输&#xff0c;如何优化浏览器渲染过程&#xff0c;来定位项目中存在的问题。Chrome DevTools给我们提供了2种常用方式 Audits和Performance&#xff0c…

三分钟看懂JDK、JRE和JVM的区别和联系

节选自JavaGuide(Github 标星 134k star!「Java学习 + 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识) JVM Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同…

【C++】21年精通C++之泛型编程和模板初阶知识

❤️前言 大家好&#xff01;今天和大家一起学习关于C泛型编程和模板初阶的相关知识。 正文 我们之前已经学习了C中非常重要的一个特性——函数重载&#xff0c;函数重载很好地提高了我们代码的可读性。但是对于适配多种参数的某种函数来说&#xff0c;我们如果使用函数重载就…

Maven安装和配置(详细版)

Maven安装和配置 Maven安装1、安装链接&#xff1a;2、配置环境变量&#xff1a; Maven配置1、修改Maven仓库下载镜像及修改仓库位置&#xff1a;2、在Idea上配置Maven&#xff1a; 测试Maven安装能否安装jar包 Maven安装 1、安装链接&#xff1a; Maven – Download Apache …

阿里云服务器 之 mqtt服务器搭建及使用

本文主要是对mqtt的学习使用&#xff0c;其中服务器是基于阿里云服务器的mqtt功能&#xff0c;客户端使用的是mqttx软件。 一、服务器部分搭建说明 1、如果是首次使用&#xff0c;则需要经过注册与认证的步骤。 2、找到"产品与服务"-->"物联网平台"&…

【MySQL】多表查询

上一篇介绍了外键约束,外键约束是用于连接两张数据表的,所以在此基础上就有了多表查询 之前的查询都是单表查询,这里我们会将多个数据表的数据结果返回在一张表上 文章目录 1.多表关系2.多表查询2.1 多表查询分类2.2 内连接2.3 外连接2.4 自连接2.5 联合查询2.6子查询 1.多表关…

微信小程序nodejs+vue+uniapp超市网上购物商城系统

超市购物系统用户端要求在系统的安卓手机上可以运行&#xff0c;主要实现了管理端&#xff1b;首页、个人中心、用户管理、商品分类管理、商品信息管理、商品入库管理、订单信息管理、订单配送管理、订单评价管理、退货申请管理、换货申请管理、系统管理&#xff0c;用户端&…

【大数据学习篇7】小试牛刀统计并且分析天猫数据

本项目基于搭建大数据环境&#xff0c;通过将数据存放在HDFS上&#xff0c;从HDFS中获取数据&#xff0c;然后根据实际需求通过Spark或Spark SQL对数据进行读取分析&#xff0c;将分析结果存储到HBase表中&#xff0c;最终通过 ECharts数据可视化工具基于Python Web平台实现数据…

docker-compose 实现Seata Server高可用部署 | Spring Cloud 51

一、前言 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式&#xff0c;为用户打造一站式的分布式解决方案。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事…

看模型、做技术交底、做项目汇报,图新说数字化汇报平台引领交互式汇报新模式

现场汇报效果不好&#xff0c;导致丢了一个项目&#xff01; 项目汇报平淡无奇&#xff0c;方案屡次被毙&#xff01; 面对专家质疑&#xff0c;回答苍白无力&#xff01; 估计大家都有过这种经历和感受。 详细分析一下&#xff0c;基本上有以下几个方面的原因&#xff1a; …

虚幻or现实?堆区、栈区真实存在吗?是操作系统在骗你罢了...

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;引例 &#x1f426;进程地址空间&#x1f426;虚拟地址与物理内存的联系&#x1f514;回答引例中的问题&#x1f513;写时拷贝 &#x1f426;虚拟地址存在的意义&#x1f513;malloc的本质 &#x1f490;专栏…

装饰者设计模式解读

问题引进 星巴克咖啡订单项目&#xff08;咖啡馆&#xff09;&#xff1a; 1) 咖啡种类/单品咖啡&#xff1a;Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡) 2) 调料&#xff1a;Milk、Soy(豆浆)、Chocolate 3) 要求在扩展新的咖啡种类时&#x…

接口测试全流程扫盲,让我看看有哪些漏网之鱼

目录 扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质及其工作原理是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f;…

一些云原生开源安全工具介绍

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130789465 一、Kubernetes安全监测工具kube-bench kube-bench是一个用Golang开发的、由Aqua Security发布的自动化Kubernetes基准测试工具&#xff0c;它运行CIS Kubernetes基准中的测试项目。这些测试…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 &#xff08;一&#xff09;索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构&#xff0c;这些数据结构以某…

用WaveNet预测(Adapted Google WaveNet-Time Series Forecasting)

目录 剧情简介: 数据来源 加载数据 分割数据和可视化 时间序列的多元波网模型:实现(多步预测) 创建模型 创建数据集 数据准备 1- Training dataset preparation 2- Validation dataset preparation Train the Model with TPU: 使用经过训练的适应Google WaveNet预测…

YOLO NAS note 1

Git Hub: https://github.com/Deci-AI/super-gradients Yolo-Nas 的代码比YOLO v8 还恐怖。之前的YOLO数据可以通过&#xff1a; coco_detection_yolo_format_train&#xff0c; 和 coco_detection_yolo_format_val 自动转。 这里写目录标题 Train数据获取数据增强训练criteri…

ChatGPT 提问,软件杂项部分

堆内存与栈内存一般分别 有多少 ChatGPT 堆内存和栈内存的大小取决于操作系统和编译器的限制以及程序的运行环境。以下是一些常见的默认大小范围&#xff0c;但请注意这些值可以因环境而异&#xff1a; 栈内存大小&#xff1a; Windows平台&#xff1a;默认情况下&#xff…

CNN实现手写数字识别(Pytorch)

CNN结构 CNN&#xff08;卷积神经网络&#xff09;主要包括卷积层、池化层和全连接层。输入数据经过多个卷积层和池化层提取图片信息后&#xff0c;最后经过若干个全连接层获得最终的输出。 CNN的实现主要包括以下步骤&#xff1a; 数据加载与预处理模型搭建定义损失函数、优…