C++泛编程(3)

类模板基础

  • 1.类模板的基本概念
  • 2.类模板的分文件编写
  • 3.类模板的嵌套 (未完待续...)

在往节内容中,我们详细介绍了函数模板,这节开始我们就来聊一聊类模板。C++中,类的细节远比函数多,所以这个专题也会更复杂。

1.类模板的基本概念

和函数模板一样,类也可以有处理不同类型变量的能力。定义一个类模板需要使用的语句与定义函数模板类似:

template <class T1, class T2>

再次强调,尽管typename关键字和class关键字都可以定义通用变量,但通常函数中的通用变量使用typename定义,类中则使用class定义。定义后的通用变量名可以出现在类中的任何位置,比如我们写一个简单的类:

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 get_a() // 打印并返回a的值{cout << m_a << endl;return m_a;}T2 get_b() // 打印并返回b的值{cout << m_b << endl;return m_b;}
};

定义一个类模板与定义函数模板类似,但调用方法有所不同。因为C++不能自动判定传参的类型,所以我们调用时必须指定T1和T2的具体类型:

int main()
{AA<int, double> a;a = { 20,3.3 };a.get_a();a.get_b();return 0;}// 输出为:20//        3.3

此外,我们还可以给通用类行指定默认类型,类似于python中的默认参数。将定义AA类通用参数的代码换成:

template <class T1, class T2=int>

这样在调用函类的话就可以这样写:

int main()
{AA<int> a(20,3.3);AA <int,double> b (20,3.3);a.get_a();a.get_b();b.get_a();b.get_b();return 0;
}
// 输出为:20
//		  3
//		  20
//	 	  3.3

从这个例子中也可以看出,这个默认值也是可以手动修改的。C++11以上标准的函数模板实际上也接受这种制定通用类型的默认值操作,但实际意义不大。
我们也可以用new关键字来创建模板类对象:

int main()
{AA<int,double> *a=new AA<int>(20,3.3);a->get_a();a->get_b();delete a;return 0;
}

需要注意,使用模板类的话类名就不是AA了,而是AA<int,double>。

2.类模板的分文件编写

与函数模板一样,类模板也是在用到的时候才会被创建成具体函数。如果需要将类的声明和定义分开,那么同函数模板一样,这个声明通用变量的语句也要跟着定义。如果想要份文件编写,类模板也要整体放倒头文件中:
在这里插入图片描述
这个例子中,我们有一个Student具体类和AA类模板,其中类模板的属性声明和定义是分开的,请大家仔细观察一下。
可能有小伙伴好奇这样的结果,其实原因不难理解,C++是分文件进行编译的,所以头文件和源文件乍看之下都没有错,编译器也是可以正常通过的。但是对于具体函数和具体类而言,放在源文件中的函数定义会在编译过程中被创建成具体内容与头文件形成连接。而模板不会,它只会在被调用到的时候才能生具体函数,因此编译的过程中模板函数和类模板的方法并不会与头文件形成有效的链接,所以调用也就会出错了。解决这个问题当然就是不让编译器去源文件中形成连接,而是在头文件中就放好需要的内容。

3.类模板的嵌套 (未完待续…)

在开始这部分的讲述之前,我们先看一下使用类模板实现的两种数据结构——数组和栈

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实战:爬取小红书

有读者在公众号后台询问爬取小红书&#xff0c;今天他来了。 本文可以根据关键词&#xff0c;在小红书搜索相关笔记&#xff0c;并保存为excel表格。 爬取的字段包括笔记标题、作者、笔记链接、作者主页地址、作者头像、点赞量。 一、先看效果 1、爬取搜索页 2、爬取结果保存到…

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树

【蓝桥杯冲冲冲】动态规划学习 [NOIP2003 提高组] 加分二叉树 蓝桥杯备赛 | 洛谷做题打卡day24 文章目录 蓝桥杯备赛 | 洛谷做题打卡day24[NOIP2003 提高组] 加分二叉树题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示数据规模与约定思路 题解代码我的一些话 [NOI…

【鸿蒙】大模型对话应用(四):页面发起请求实现对话能力

Demo介绍 本demo对接阿里云和百度的大模型API&#xff0c;实现一个简单的对话应用。 DecEco Studio版本&#xff1a;DevEco Studio 3.1.1 Release HarmonyOS SDK版本&#xff1a;API9 关键点&#xff1a;ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 定义接…

JAVA-File五个练习

下面习题思路大多都是&#xff1a; 1.获取路径下所有列表&#xff08;listfiles&#xff09;&#xff0c;2.遍历文件或文件夹&#xff08;增强for&#xff09;&#xff0c;3.判断是否是文件&#xff08;isFile&#xff09;并直接执行逻辑&#xff0c;4.判断当前是文件夹的情况&…

oc云渲染云渲染操作步骤

随着技术的飞速进步&#xff0c;云渲染已经日益成为一个主流的渲染选择。OC云渲染以其高效率、易用性和可靠性获得了广泛的认可和喜爱。尽管如此&#xff0c;对于刚入门的用户而言&#xff0c;掌握OC云渲染的正确方法可能仍旧是一项挑战。接下来&#xff0c;我们会详尽解释OC云…

vivado 手动设置自下而上的流量并导入网表、创建较低级别的网表

手动设置自下而上的流量并导入网表 要手动运行自下而上的流&#xff0c;请将较低级别的网表或第三方网表实例化为黑色盒子&#xff0c;Vivado工具在合成完成后将黑盒子融入完整的设计中。这个以下部分描述了该过程。 重要&#xff01;Vivado合成不合成或优化加密或非加密合成…

使用_NT_SYMBOL_PATH在启动VS前设置PDB路径

一、背景 由于公司相关项目的开发管理方式&#xff0c;导致公司会存在多个分支的版本正在开发/测试中。 在这样的背景下&#xff0c;我的日常工作中有时会出现存在某个分支的项目软件的某个功能出现了问题需要我去排查解决&#xff0c;而我当前并不在该分支上开发。于是只能安装…

AI重构千行百业!超声波俱乐部大湾区内部分享会圆满落幕

1月27日、28日&#xff0c;超声波俱乐部内部分享会第十六期、第十七期分别在深圳、广州召开&#xff0c;创梦天地、元气森林、新浪智库、百准、A2空间对活动进行了特别支持&#xff0c;六十余名AI领域的创始人和行业嘉宾出席分享会。 出席活动的嘉宾有&#xff1a; 超声波创始…

Kubernetes operator(五)api 和 apimachinery 篇

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列第五篇&#xff0c;主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…

C++进阶(十)哈希的应用——位图布隆过滤器

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、位图1、位图概念2、位图的实现3、位图的应用 二、布隆过滤器1、布隆过滤器提出2、布隆过滤…

通过html2canvas和jsPDF将网页内容导出成pdf

jsPDF参考&#xff1a;https://github.com/parallax/jsPDF html2canvas参考&#xff1a;https://github.com/niklasvh/html2canvas 或者 https://html2canvas.hertzen.com 思路 使用html2canvas将选中DOM生成截图对象将截图对象借助jsPDF导出为PDF文件 代码 这是一个示例&a…

List的模拟实现 迭代器

———————————————————— list与vector相比&#xff0c;插入、删除等操作实现的成本非常低&#xff0c;如果在C语言阶段熟悉理解过链表&#xff0c;那么现在实现起来list就显得比较简单&#xff0c;可以说操作层面上比vector更简洁&#xff0c;因为list没有扩…