C++类模板的使用

2023-10-30

一、基本使用

①通用类型用于成员变量

②通用类型用于成员函数的参数

③通用类型用于成员函数的返回值,获取成员变量

④通用类型用于成员函数的代码中

代码

​
#include <iostream>
using namespace std;

template <class T1,class T2>//类模板头部,通用类型用于类
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                 //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb()                 //通用类型用于成员函数的参数
		{
			T2 b=1;               //通用类型用于成员函数的返回类型,获取成员 
			return m_b+b;	
		}
};


​

二、注意事项:

1)在创建对象的时候,必须显式指定具体的数据类型,不存在自动推导数据类型(函数模板可以自动推导数据类型,可以不显式指定);

代码

#include <iostream>
using namespace std;

template <class T1,class T2>//类模板头部,通用类型用于类
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                 //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb()                 //通用类型用于成员函数的参数
		{
			T2 b=1;               //通用类型用于成员函数的返回类型,获取成员 
			return m_b+b;	
		}
};

int main()
{
	AA<int,double>a;
	a.m_a=20;
	a.m_b=30;
	cout<<"a.geta()="<<a.geta()<<endl;
	cout<<"a.getb()="<<a.getb()<<endl;
	return 0;
}

AA<int,double>a;//在<>填数据类型

在<>中填数据类型,告诉编译器分别用int、double取代T1、T2,帮我生成一个类的定义,然后用这个类创建对象a;

运行结果

2)使用类模板时,数据类型必须适应类模板中的代码;

代码

#include <iostream>
using namespace std;

template <class T1,class T2>//类模板头部,通用类型用于类
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                 //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb()                 //通用类型用于成员函数的参数
		{
			T2 b="ss";               //通用类型用于成员函数的返回类型,获取成员 
			return m_b+b;	
		}
};

int main()
{
	AA<int,string>a;
	a.m_a=20;
	a.m_b="bbb";
	cout<<"a.geta()="<<a.geta()<<endl;
	cout<<"a.getb()="<<a.getb()<<endl;
	return 0;
}

AA<int,string>a;//在<>中填数据类型

此时T2为string类型,原本的getb()中定义的临时变量b的赋值则需改变为string类型的“ss”;

运行结果

 

3)类模板可以为通用数据类型指定缺省的数据类型(C++11标准的函数模板也可以,意义不大;

代码

#include <iostream>
using namespace std;

template <class T1,class T2=string>//类模板头部,通用类型用于类 指定缺省类型
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                 //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb()                 //通用类型用于成员函数的参数
		{
			T2 b="ss";               //通用类型用于成员函数的返回类型,获取成员 
			return m_b+b;	
		}
};

int main()
{
	AA<int>a;//缺省数据类型
	a.m_a=20;
	a.m_b="bbb";
	cout<<"a.geta()="<<a.geta()<<endl;
	cout<<"a.getb()="<<a.getb()<<endl;
	return 0;
}

在声明类头部时声明通用数据类型指定缺省的数据类型string,

template <class T1,class T2=string>

在定义对象时缺省一个数据类型,类模板会自动指定缺省数据类型

AA<int>a;

运行结果不变

4)模板类的成员函数可以在类外实现;

代码

#include <iostream>
using namespace std;

template <class T1,class T2=string>//类模板头部,通用类型用于类
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb();                 //通用类型用于成员函数的参数

};

template <class T1,class T2>//不能在类外部指定默认模板参数template <class T1,class T2=string>
T2 AA<T1,T2>::getb()                 //通用类型用于成员函数的参数
{
	T2 b="ss";               //通用类型用于成员函数的返回类型,获取成员 
	return m_b+b;	
}

int main()
{
	AA<int>a;
	a.m_a=20;
	a.m_b="bbb";
	cout<<"a.geta()="<<a.geta()<<endl;
	cout<<"a.getb()="<<a.getb()<<endl;
	return 0;
}

在类的内部声明成员函数

T2 getb();                 //通用类型用于成员函数的参数

在类外定义成员函数,要注意不可以在类外部指定默认模板参数,且成员函数的定义也需要带上类模板的头部

template <class T1,class T2>      //不能在类外部指定默认模板参数template <class T1,class T2=string>
T2 AA<T1,T2>::getb()                 //通用类型用于成员函数的参数
{
    T2 b="ss";               //通用类型用于成员函数的返回类型,获取成员 
    return m_b+b;    
}

运行结果

 

5)可以用new创建类模板对象;

代码

#include <iostream>
using namespace std;

template <class T1,class T2=string>//类模板头部,通用类型用于类
class AA
{
	public:
		T1 m_a;    //①通用类型用于成员变量
		T2 m_b;    //通用类型用于成员变量
		AA(){}     //默认构造函数
		
		AA(T1 a,T2 b):m_a(a),m_b(b){}    //②通用类型用于成员函数的参数
		T1 geta()                 //③通用类型用于成员函数的返回类型,获取成员m_a的值
		{
			T1 a=2;               //④通用类型用于成员函数的代码中
			return m_a+a;	
		}
		T2 getb();                 //通用类型用于成员函数的参数

};
template <class T1,class T2>//不能在类外部指定默认模板参数template <class T1,class T2=string>
T2 AA<T1,T2>::getb()                 //通用类型用于成员函数的参数
{
	T2 b="ss";               //通用类型用于成员函数的返回类型,获取成员 
	return m_b+b;	
}
int main()
{
	//AA<int,string>*a=new AA<int,string>;//调用默认构造函数
	AA<int,string>*a=new AA<int,string>(3,"bbb");//调用带两个参数构造函数
	cout<<"a->geta()="<<a->geta()<<endl;
	cout<<"a->getb()="<<a->getb()<<endl;
	delete a;
	return 0;
}

用模板类AA创建对象a

//AA<int,string>*a=new AA<int,string>;//调用默认构造函数
    AA<int,string>*a=new AA<int,string>(3,"bbb");//调用带两个参数构造函数

AA是类模板名,不是一种具体的数据类型,必须在指定了参数类型才可以定义类对象

AA<int,string>才是类名,具体的数据类型

运行结果

 

6)在程序中,模板类的成员函数使用了才会创建,不适用就不会创建

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类模板的使用 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • HTML基本结构

    一 网页三大组成部分 结构 html 是超文本标记语言 用来搭建网页的结构 样式 css 网页的样式 行为 js 是一种语言 称为脚本语言 交互行为 用户对网页的操作 数据交互 二 HTML语法规范 1 语法 英文状态下输入 html标签
  • C#——委托

    什么是委托 C 中的委托 Delegate 类似于 C 或 C 中函数的指针 委托 Delegate 是存有对某个方法的引用的一种引用类型变量 引用可在运行时被改变 声明委托 委托声明决定了可由该委托引用的方法 委托可指向一个与其具有相同标
  • STM32基础(7)定时器中断

    原理 STM32F1 的定时器非常多 由 2 个基本定时器 TIM6 TIM7 4 个通用定时器 TIM2 TIM5 和 2 个高级定时器 TIM1 TIM8 组成 基本定时器的功能最为简单 类似于 51 单片机内定时器 通用定时器是在基本
  • Unity RenderTexture实现 刮彩票、橡皮擦、擦除效果(3D物体)

    一 实现效果 类似刮刮乐的擦除效果 支持多笔擦除 一次擦不干净 二 所用技术点 RenderTexture Shader 三 实现原理 一个相机单独渲染笔刷轨迹到RenderTexture上 在通过RenderTexture中的笔刷路径修改
  • Ubuntu chrome 浏览器鼠标飘

    问题 ubuntu 系统 4k分辨率下 Chrome 或类似浏览器在全屏模式下 鼠标发飘或卡顿 原因 驱动问题 显卡未得到完全驱动 sudo ubuntu drivers devices sudo ubuntu drivers autoin
  • node升级的正确方法

    注 抱歉之前没有注明该node升级方法为linux环境下的node 现在增加windows下的升级方法 其实对于一些开源的库或者框架个人还是比较建议直接去相应的官网查看会比较好 而且很多都支持中文版 贴上node官网 本文主要是针对安装了n
  • 怎样查看Linux服务器配置

    1 前言 本文主要讲解如何查看Linux服务器配置 主要是查看服务器硬件配置 怎样查看Linux服务器配置 2 查看CPU信息 2 1 使用 lscpu 命令查看服务器CPU信息 lscpu 如下图 使用lscpu命令查看服务器CPU信息
  • 硬中断和软中断

    本文主要内容 硬中断 软中断的原理和实现 内核版本 2 6 37 Author zhangskd csdn blog 概述 从本质上来讲 中断是一种电信号 当设备有某种事件发生时 它就会产生中断 通过总线把电信号发送给中断控制器 如果中断的
  • JVM复习总结

    1 JVM运行时内存划分区域 方法区 线程公有 堆 线程公有 虚拟机栈 线程私有 本地方法栈 线程私有 程序计数器 线程私有 2 类加载器分类 启动类加载器 拓展类加载器 应用程序加载器 用户自定义加载器 3 类加载的步骤 加载 链接 验证
  • 嵌入式固件升级设计

    文章目录 IAP DFU和OTA的区别 DFU模式 DFU单区和双区 双区DFU设计 IAP DFU和OTA的区别 IAP In Application Programming IAP是用户自己的程序在运行过程中对User Flash的部分
  • pymongo保存dataframe格式的数据(insert_one, insert_many, 多线程保存)

    使用Pymongo保存数据的基本方法 增删改查 请参考 Python连接MongoDB 使用pymongo进行增删改查 文章目录 1 基本方法 逐行保存 2 insert many 批量保存 3 Threading 多线程保存数据 1 基本
  • [从零开始学DeepFaceLab-17]: 使用-命令行八大操作步骤-第7步:模型预测与生成合成图片 - 进阶 - 通过图形界面调参微调、精细合成图片

    目录 前言 第1章 如何进入可视化微调界面 第2章 窗口操作详解 2 1 操作图片选择
  • 软件测试职业规划

    软件测试职业规划 以下是转载内容 软件测试人员的发展误区 4 公司开发的产品专业性较强 软件测试人员需要有很强的专业知识 现在软件测试人员发展出现了一种测试管理者不愿意看到的景象 1 开发技术较强的软件测试人员转向了软件开发 非测试工具开发
  • spring boot 跨域问题(sessionid不一致 已解决)

    现象 Spring boot验证码接口与登录接口的sessionid不一致 解决方法 WebConfig中添加如下代码 Override public void addCorsMappings CorsRegistry registry r
  • 用ESP32玩转真彩屏

    很多人都说ESP32的出现是物联网开发者的福音 就是专为物联网应用而设计的 没错 我们都这样认为 ESP32不仅具有业内高水平的低功耗性能 而且它的高度集成特性 将天线开关 RF balun 功率放大器 接收低噪声放大器 滤波器 电源管理模
  • 微信开发相关:使用微信 JS-SDK 接口

    微信开发相关 使用微信 JS SDK 接口 准备工作 接口使用流程 公众号设置 前端向后端请求 ticket 后端向微信获取 token 后端根据 token 生成 ticket 根据 ticket 创建签名 前端创建配置信息 并注入验证
  • flutter Vertical viewport was given unbounded height

    问题描述 在Flutter开发中遇到 Vertical viewport was given unbounded height 问题出现的情况 这个问题主要是ListView builder出现的问题 如果是简单用的话 会出现这个问题的话
  • gcc/g++编译器的使用

    1 gcc编译器简介 gcc原名是GNU C Complier 支持C语言的编译链接 也支持C object c等语言的编译链接 根据 深入理解计算机系统 第三版 第1 2小节内容 gcc将一个源程序文件转换为最终的可执行程序需要经过预处理
  • IDEA 配置Maven国内源

    首先打开设置 在设置中搜索maven 然后跳转到这个页面 看到有一个User settings files这个项 Users xq m2 settings xml这个便是配置文件 修改这个文件即可 如果没有这个文件 可以新建一个settin
  • C++类模板的使用

    一 基本使用 通用类型用于成员变量 通用类型用于成员函数的参数 通用类型用于成员函数的返回值 获取成员变量 通用类型用于成员函数的代码中 代码 include