C++模板类与函数

news2024/11/20 23:21:17

目录

分类

一、普通函数,参数和返回值是模板类的实例化版本(只支持AA模板类的某一个具体化类)

1)代码

2)分析

3)运行结果

二、函数模板,参数和返回值是某种模板类(只支持AA模板类)

1)代码

 2)分析

3)运行结果

三、函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)

一)支持模板类的任意具体化类(多个)

1)代码

2)分析

3)运行结果

 二)支持普通类

1)代码

2)分析

3)运行结果

 三)支持函数

1)传入类

2)传入函数指针


分类

模板类用于函数的参数和返回值,有三种形式

1)普通函数,参数和返回值是模板类的实例化版本

2)函数模板,参数和返回值是某种模板类

3)函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)

一、普通函数,参数和返回值是模板类的实例化版本(只支持AA模板类的某一个具体化类)

1)代码

#include<iostream>
using namespace std;

template<class T1,class T2>
class AA
{
	public:
		T1 m_x;
		T2 m_y;
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
		void show()const{cout<<"show() x="<<m_x<<",y="<<m_y<<endl;}
};

//采用普通函数,参数和返回值是模板类的实例化版本
//AA<int,string>是一个具体的类型,可以直接传值也可以直接传引用
AA<int,string> func(AA<int,string>&aa)
{
	aa.show();
	cout<<"调用了func(AA<int,string>&aa)函数"<<endl;
	return aa;
}
int main()
{
	AA<int,string>aa(3,"我是一只小猫咪。");
	func(aa);
	return 0;
}

2)分析

//AA<int,string>是一个具体的类型,可以直接传值也可以直接传引用

AA<int,string> func(AA<int,string>&aa)是一个普通的全局函数

函数传入的参数是一个具体的类

3)运行结果

二、函数模板,参数和返回值是某种模板类(只支持AA模板类)

1)代码

#include<iostream>
using namespace std;

template<class T1,class T2>
class AA
{
	public:
		T1 m_x;
		T2 m_y;
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
		void show()const{cout<<"show() x="<<m_x<<",y="<<m_y<<endl;}
};

//采用普通函数,参数和返回值是模板类的实例化版本
//AA<int,string>是一个具体的类型,可以直接传值也可以直接传引用
AA<int,string> func(AA<int,string>&aa)
{
	aa.show();
	cout<<"调用了func(AA<int,string>&aa)函数"<<endl;
	return aa;
}

//采用函数模板,参数和返回值是某种模板类
template<typename T1,typename T2>
AA<T1,T2> func(AA<T1,T2>&aa)
{
	aa.show();
	cout<<"调用了func(AA<T1,T2>&aa)函数"<<endl;
	return aa;
}

int main()
{
	AA<char,string>aa(3,"我是一只小猫咪。");
	func(aa);
	return 0;
}

 2)分析

main函数中AA的参数类型改为char,此时普通函数已经不能再适用

//采用普通函数,参数和返回值是模板类的实例化版本

AA<int,string> func(AA<int,string>&aa)

故需要重写出一个模板函数,因为类模板的通用类型参数是有T1和T2,所以模板函数也有两个通用类型参数。(只支持AA模板类)

template<typename T1,typename T2>
AA<T1,T2> func(AA<T1,T2>&aa)
{
    aa.show();
    cout<<"调用了func(AA<T1,T2>&aa)函数"<<endl;
    return aa;
}

在函数中,如果想发挥类模板的通用性,必须结合函数模板

这个模板函数没有发挥出模板函数的通用性,下面给出更通用的模板函数即(支持支持普通类和模板类和其他类型

3)运行结果

注:如果此时char改为int型,则会调用普通函数((一)当中的函数)

三、函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)

一)支持模板类的任意具体化类(多个)

1)代码

#include<iostream>
using namespace std;

template<class T1,class T2>
class AA
{
	public:
		T1 m_x;
		T2 m_y;
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
		void show()const{cout<<"show() x="<<m_x<<",y="<<m_y<<endl;}
};

//采用普通函数,参数和返回值是模板类的实例化版本
//AA<int,string>是一个具体的类型,可以直接传值也可以直接传引用
AA<int,string> func(AA<int,string>&aa)
{
	aa.show();
	cout<<"调用了func(AA<int,string>&aa)函数"<<endl;
	return aa;
}

//采用函数模板,参数和返回值是某种模板类
//template<typename T1,typename T2>
//AA<T1,T2> func(AA<T1,T2>&aa)
//{
//	aa.show();
//	cout<<"调用了func(AA<T1,T2>&aa)函数"<<endl;
//	return aa;
//}

//采用函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)
template<typename T>
T func(T&aa)
{
	aa.show();
	cout<<"调用了func(AA<T>&aa)函数"<<endl;
	return aa;
}
int main()
{
	AA<char,string>aa('3',"我是一只小猫咪。");
	func(aa);
	return 0;
}

2)分析

注释掉//采用函数模板,参数和返回值是某种模板类(只支持AA模板类)
//template<typename T1,typename T2>
//AA<T1,T2> func(AA<T1,T2>&aa)

因为程序会调用该较为具体化的版本

重写模板函数

//采用函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)
template<typename T>
T func(T&aa)
{
    aa.show();
    cout<<"调用了func(AA<T>&aa)函数"<<endl;
    return aa;
}

3)运行结果

 

 二)支持普通类

1)代码

#include<iostream>
using namespace std;

template<class T1,class T2>
class AA
{
	public:
		T1 m_x;
		T2 m_y;
		AA(const T1 x,const T2 y):m_x(x),m_y(y){}
		void show()const{cout<<"show() x="<<m_x<<",y="<<m_y<<endl;}
};


//采用普通函数,参数和返回值是模板类的实例化版本
//AA<int,string>是一个具体的类型,可以直接传值也可以直接传引用
AA<int,string> func(AA<int,string>&aa)
{
	aa.show();
	cout<<"调用了func(AA<int,string>&aa)函数"<<endl;
	return aa;
}

//新增普通类
class BB
{
	public:
		void show(){cout<<"调用了BB的show()函数。"<<endl;}
};

//采用函数模板,参数和返回值是某种模板类
template<typename T1,typename T2>
AA<T1,T2> func(AA<T1,T2>&aa)
{
	aa.show();
	cout<<"调用了func(AA<T1,T2>&aa)函数"<<endl;
	return aa;
}

//采用函数模板,参数和返回值是任意类型(支持普通类和模板类和其他类型)
template<typename T>
T func(T&aa)
{
	aa.show();
	cout<<"调用了func(AA<T>&aa)函数"<<endl;
	return aa;
}

int main()
{
	AA<char,string>aa('3',"我是一只小猫咪。");
	BB bb;
	func(bb);//类
	return 0;
}

2)分析

新增一个普通类BB

class BB
{
    public:
        void show(){cout<<"调用了BB的show()函数。"<<endl;}
};

在函数模板中,只要类对象支持函数模板体

aa.show();

则该函数模板支持此对象

传入的是普通类

func(bb);//类

3)运行结果

 

 三)支持函数

重写一个代码,和上面的不同

1)传入类

①)代码

#include<iostream>
using namespace std;

void show()
{
	cout<<"调用了show()函数。"<<endl;
}
//普通类BB
class BB
{
	public:
		void operator()(){//重载()也叫仿生函数
			cout<<"调用了BB类的仿函数。"<<endl;
		}
};

//函数模板,参数和返回类型是任意类型(支持普通类和模板类,还可以支持其他)
template<typename T>
void func(T tt)
{
	tt();
}

int main()
{
	BB bb;
	func(bb);//传入类
	return 0;
}

 ②)分析

①传入的是类

func(bb);//传入类

③)运行结果

2)传入函数指针

 ①)代码

#include<iostream>
using namespace std;

void show()
{
	cout<<"调用了show()函数。"<<endl;
}
//普通类BB
class BB
{
	public:
		void operator()(){//重载()也叫仿生函数
			cout<<"调用了BB类的仿函数。"<<endl;
		}
};

//函数模板,参数和返回类型是任意类型(支持普通类和模板类,还可以支持其他)
template<typename T>
void func(T tt)
{
	tt();
}

int main()
{
	BB bb;
	func(show);//传入show函数的指针
	return 0;
}

 

②)分析

函数模板,不管传入的是什么类型,只要适应函数体内的代码tt();即可

show()是一个全局函数,传入的是函数指针

func(show);//传入show函数的指针

③)运行结果

 

 

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

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

相关文章

chatgpt赋能Python-python31个关键词

Python 31个关键词: 了解Python编程的基础知识 Python是一种高级编程语言&#xff0c;首次推出于1991年。自那时以来&#xff0c;Python已经成为最受欢迎的编程语言之一&#xff0c;它具有易读性、易维护性和清晰的语法。在这篇文章中&#xff0c;我们将介绍Python的31个关键词…

python3.8 安装 ssl 模块 和 _ctypes 模块

文章目录 前情提要安装 openssl-1.1.1重新编译安装 python3.8-rpath 编译选项介绍python3.8 跟 python3.10 的区别 前情提要 在我成功给 python3.10 安装 ssl 模块后自以为是的写下了 “虽然我编译的是 python3.10&#xff0c;但是对于 python3.6、python3.8 应该同样适用。”…

chatgpt赋能Python-python3_0怎么安装

Python3.0怎么安装 Python3.0是一个优秀的编程语言&#xff0c;其简单易学&#xff0c;易用性强&#xff0c;且具有强大的功能和广泛的应用。如果您需要在您的电脑上使用Python3.0&#xff0c;本文将为您介绍如何进行安装。 下载Python3.0 首先&#xff0c;您需要从官方网站…

教育不得不改变,ChatGPT可以提供个性化学习

近日&#xff0c;OpenAI的首席执行官Sam Altman接受ABC新闻首席商业、技术和经济记者Rebecca Jarvis的独家采访。Sam Altman提到了对错误信息的担忧、探讨了人工智能与人类工作的关系、ChatGPT与教育的关系等。 ChatGPT今年1月面世后&#xff0c;在短短几个月内就达到了1亿月活…

代码随想录训练营Day43| 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

目录 学习目标 学习内容 1049. 最后一块石头的重量 II 494. 目标和 474.一和零 学习目标 1049. 最后一块石头的重量 II 494. 目标和 474.一和零 学习内容 1049. 最后一块石头的重量 II 1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09;https://l…

【云计算与虚拟化】第三章 实验二 在ESXi主机中安装操作系统

实验二 在ESXi主机中安装操作系统 为ESXi主机添加一块数据存储磁盘&#xff0c;大小为80G&#xff0c;磁盘名称为&#xff1a;ESXi-loc-80G&#xff08;截图&#xff09; 2.登录vSphere Client&#xff0c;加载新添加的数据存储磁盘&#xff0c;加载大小为60G&#xff0c;并将…

网络编程——嵌入式(驱动)软开基础(五)

1. 列举一下OSI协议的各种分层。说说你最熟悉的一层协议的功能。 (1)七层划分为:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。 (2)五层划分为:应用层、传输层、网络层、数据链路层、物理层。 (3)四层划分为:应用层、传输层、网络层、网络接口层。(…

springboot+java+jsp校园二手书旧书交易交换系统

前台功能&#xff1a;用户进入系统可以对首页、书籍信息、校园公告、个人中心、后台管理等功能进行操作&#xff1b; 后台主要是管理员&#xff0c;管理员功能包括主页、个人中心、学生管理、发布人管理、书籍分类管理、书籍信息管理、交易信息管理、交换信息管理、系统管理等&…

Linux运维常用grep命令使用

grep 命令是 Linux 运维中非常常见的文本搜索工具 常用的使用方法如下&#xff1a; 1、查找包含指定字符串的行 grep "pattern" file.txt 其中&#xff0c;pattern 是要查找的字符串&#xff0c;file.txt 是要搜索的文件名。 2、查找不包含指定字符串的行 grep -v…

chatgpt赋能Python-python3_9_2怎么换行

Python 3.9.2 换行方法 Python 3.9.2 已经出现了&#xff0c;除了一些修复和新功能&#xff0c;Python 3.9.2 还包括了一些在换行方面的改进。在本文中&#xff0c;我们将介绍 Python 3.9.2 中换行的新方法。 换行符 在 Python 3.9.2 中&#xff0c;我们可以使用换行符来实现…

chatgpt赋能Python-python3_10下载安装

Python3.10&#xff1a;开发者首选 对于每个开发者来说&#xff0c;选择合适的编程语言是至关重要的。在众多可供选择的编程语言中&#xff0c;Python一直是最受欢迎的选择之一。为什么Python如此受欢迎&#xff1f;因为其简单易学、代码可读性强、广泛的库支持和适用于各种应…

【Git相关命令】

git全局设置 作用是用于描述git使用者的身份。注意&#xff0c;设置的用户名和邮箱跟代码托管平台的用户名和邮箱没有任何关系。 git config --global user.name "用户名" git config --global user.email "邮箱地址"获取git仓库 方式1&#xff1a;将本地的…

【5.18】二、黑盒测试方法—边界值分析法

目录 2.2 边界值分析法 2.2.1 边界值分析法概述 2.2.2 实例&#xff1a;三角形问题的边界值分析 2.2.3 实例&#xff1a;余额宝提现的边界值分析 2.2 边界值分析法 程序的一些错误往往发生在边界处理上&#xff0c;这是因为程序开发时对边界问题没有做好处理。边界值分析法…

视频剪辑要学什么软件 视频剪辑要学些什么

这几年短视频行业迅速出圈&#xff0c;不少人都想加入这片红海&#xff0c;但是在剪辑这块儿却卡住了。众所周知&#xff0c;想要发短视频&#xff0c;会视频剪辑是很重要的。那么视频剪辑要学什么软件&#xff0c;视频剪辑要学什么&#xff1f;下面我们来分享一下相关知识。一…

JAVA日常练习—习题5

1.机器人类及其子类 设计一个机器人的抽象类&#xff0c;具有质量&#xff08;double&#xff09;、名字&#xff08;String&#xff09;等属性&#xff1b;具有设置属性值方法和获得并打印属性值的方法&#xff0c;还有一个运动的抽象方法move()。设计电动汽车类和飞行器类&a…

【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十届

文章目录 前言一、题目二、模块初始化三、代码实现interrupt.h:interrupt.c:main.h:main.c: 四、完成效果五、总结 前言 无 一、题目 二、模块初始化 1.LCD这里不用配置&#xff0c;直接使用提供的资源包就行 2.双ADC:开启双ADCsingle-ended 3.LED:开启PC8-15,PD2输出模式就…

chatgpt赋能Python-python3_6安装keras

在Ubuntu 16.04上安装Keras Keras是一个非常流行的Python深度学习库&#xff0c;它可以让你高效地构建和训练深度神经网络。在本指南中&#xff0c;我们将介绍如何在Ubuntu 16.04上安装Keras&#xff0c;并建立一个简单的基于CNN的图像分类器。 准备工作 在安装Keras之前&am…

MySQL 基础篇 1.1 执行一条SQL语句会发生什么

1. MySQL架构一共分为两层 server 和 存储引擎层&#xff08;一般为Innodb引擎&#xff09; 主要执行流程都在server层&#xff1a;连接器&#xff0c;查询缓存&#xff0c;解析SQL&#xff08;解析器&#xff09;&#xff0c;执行SQL&#xff08;预处理器&#xff0c;优化器&a…

2023年ES的使用总结

1.Elasticsearch 非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 什么是elasticsearch 一个开源的分布式搜索引擎&#xff0c;可以用来实现搜索、日志统计、分析、系统监控 什么是elastic stack 是以elasticsearch为核心的技术栈&#xf…

运算符重载函数作为类的成员函数——有理数的约分

目录 一、题目 二、代码 三、算法分析 &#xff08;一&#xff09;数学表达式 &#xff08;二&#xff09; 代码实现 一&#xff09;运算符重载函数 二&#xff09;优化函数&#xff08;实现有理数约分&#xff09; 一、题目 通过运算符重载为类的成员函数来实现两个有…