1、定义区别

  类模板和模板类主要关注点是后一个单词。

  类模板:主要描述的是模板,这个模板是类的模板。可以理解为一个通用的类,这个类中的数据成员,成员函数的形参类型以及成员函数的返回值类型不用具体的指定,这些类型都是虚拟的。在使用类模板进行对象定义的时候,才会根据对象的实际参数类型来替代类模板中的虚拟类型。通俗一点来说,可以看作是做蛋糕的模具。类模板标准定义格式如下:

1 template <typename 类型参数>
2 class 类名
3 {
4 类成员声明
5 };

  或者:

1 template <class 类型参数>
2 class 类名
3 {
4 类成员声明
5 };

  (1)template:这是声明类模板的关键字,表明这是一个类模板。

  (2)尖括号<>中,typename和class的作用都一样,都是用作来申明后面的参数是一个虚拟的数据参数类型。

  (3)类型参数:用C++标识符:Type或者T来表示,表示这是一个虚拟的数据类型名,此时在类模板中不给定具体的数据类型,实例化成模板类后,就需要给定具体的数据类型。

  模板类:主要描述的是类,这个类使用类模板进行声明。将类模板中的虚拟类型参数指定成一个具体的数据类型参数。通俗一点来说可以看作是通过蛋糕模具做出来的蛋糕。

2、程序举例

1,定义一个比较两个元素大小的类模板;

2,使用该类模板进行实例化,实现用模板类定义对象。

 1 #include <iostream>
2 using namespace std;
3 template <class T> //声明一个模板,虚拟数据类型名为T
4 class Compare //类模板名为Compare
5 {
6 public :
7 Compare(T a, T b)
8 {
9 x = a;
10 y = b;
11 }
12
13 T max( ) //类模板中的成员函数
14 {
15 return (x > y) ? x : y;
16 }
17
18 private :
19 T x;
20 T y;
21 };
22
23 int main()
24 {
25 Compare<int>fun1(5,8); //用类模板定义对象fun1,此时T被int替代
26 Compare<float>fun2(9.1,9.7); //用类模板定义对象fun2,此时T被float替代
27 Compare<char>fun3('a','h'); //用类模板定义对象fun3,此时T被char替代
28 cout<<"最大值是:"<<fun1.max()<<endl;
29 cout<<"最大值是:"<<fun2.max()<<endl;
30 cout<<"最大值是:"<<fun3.max()<<endl;
31 return 0;
32 }

  最终程序打印结果依次为:

1 最大值是:8
2 最大值是:9.7
3 最大值是:h

  可以从程序举例中看出使用类模板Compare进行实例化,生成了3个类型分别为Compare<int>、Compare<float>、Compare<char>的模板类,这3个模板类经实例化后又生成了3个对象成员fun1、fun2、fun3。对象成员可以调用类模板中定义的成员函数max()。类模板表示了通用的类,模板类表示了经过实例化后带具体数据类型参数的类。

  另外,在类模板中,类模板的成员函数是在类模板体内定义。而类模板中的成员函数也可以在类模板体外定义。那么就需要遵循以下规则:

  (1)需要在成员函数定义之前进行模板声明;

  (2)在成员函数名前加上"类名<类型参数>::";

  之前的程序举例中main函数之前的类模板声明就要改为如下格式:

 1 template<typename T>   //声明一个模板,虚拟数据类型名为T
2 class Compare
3 {
4 public :
5 Compare(T a, T b)
6 {
7 x = a;
8 y = b;
9 }
10
11 T max( ) //类模板中的成员函数
12
13 private :
14 T x;
15 T y;
16 };
17
18 template<typename T> //在成员函数定义之前进行模板声明
19 T Compare<T>::max() //在成员函数名前加上"类名<类型参数>::"
20 {
21 return (x > y) ? x : y;
22 }

更多技术内容和书籍资料获取敬请关注微信公众号“明解嵌入式”

1分钟理清楚C++类模板和模板类区别的更多相关文章

  1. C++:类模板与模板类

    6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...

  2. C++中模板类使用友元模板函数

    在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定 ...

  3. CI 模板解析器类

    模板解析器类可以解析你的视图文件中的伪变量.它可以解析简单的变量或者以变量作为标签的结构.如果你以前没有用过模板引擎,那么伪变量如下所示: <html><head><ti ...

  4. 读书笔记 effective c++ Item 43 了解如何访问模板化基类中的名字

    1. 问题的引入——派生类不会发现模板基类中的名字 假设我们需要写一个应用,使用它可以为不同的公司发送消息.消息可以以加密或者明文(未加密)的方式被发送.如果在编译阶段我们有足够的信息来确定哪个信息会 ...

  5. C++ 类模板与模板类详解

    在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢? 事实上class用于定义类,在模板引入c++后,最初定义模 ...

  6. C++类模板和模板类

    C++ 中有一个重要特性,那就是模板类型.类似于Objective-C中的泛型.C++通过类模板来实现泛型支持. 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性. 通常使用t ...

  7. 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类

    本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...

  8. 《C++ Primer Plus》第16章 string类和标准模板库 学习笔记

    C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具string类为将字符串作为对象来处理提供了一种方便的方法.string类提供了自动内存管理动能以及众多处理字 ...

  9. C++ 类模板三(类模版中的static关键字)

    //类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器 ...

  10. C++ 类模板一(类模板的定义)

    //类模版语法 #include<iostream> using namespace std; /* 类模板和函数模板深入理解 1.编译器并不是把函数模板处理成能处理任何类型的函数 2.编 ...

随机推荐

  1. 3_MyBatis

    一. 引言 1.1 什么是框架? 软件的半成品, 解决了软件开发过程中的普适性问题, 从而简化了开发步骤, 提升了开发效率 1.2 什么是ORM框架? ORM(Object Relational Ma ...

  2. 驱动开发:通过ReadFile与内核层通信

    驱动与应用程序的通信是非常有必要的,内核中执行代码后需要将其动态显示给应用层,但驱动程序与应用层毕竟不在一个地址空间内,为了实现内核与应用层数据交互则必须有通信的方法,微软为我们提供了三种通信方式,如 ...

  3. centos7中配置java + mysql +jdk +使用jar部署项目

    centos7中配置java + mysql +jdk  +使用jar部署项目 思维导图 1. 配置JDK環境 1.1下载jdk安装包 Java Downloads | Oracle 1.2 将下载j ...

  4. Vue3 Vite3 多环境配置 - 基于 vite 创建 vue3 全家桶项目(续篇)

    在项目或产品的迭代过程中,通常会有多套环境,常见的有: dev:开发环境 sit:集成测试环境 uat:用户接收测试环境 pre:预生产环境 prod:生产环境 环境之间配置可能存在差异,如接口地址. ...

  5. SQL Server复制的阶梯

    SQL Server复制的阶梯:第1级 - SQL Server复制简介 本翻译文章来自作者:Sebastian Meine, 2012年12月26日 该系列 本文是Stairway系列的一部分:SQ ...

  6. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  7. SpringBoot(一) - SpringBoot 初识

    1.创建SpringBoot项目 1.1 使用Spring Initializr 的 Web页面创建项目 创建网址:https://start.spring.io/ 1.2 使用IDEA创建 省略: ...

  8. python2与python区别汇总

    目录 输入与输出 range使用区别 字符编码区别 输入与输出 python2与python3中两个关键字的区别 python2中 input方法需要用户自己提前指定数据类型 写什么类型就是什么类型 ...

  9. NLP之TextRNN(预测下一个单词)

    TextRNN @ 目录 TextRNN 1.基本概念 1.1 RNN和CNN的区别 1.2 RNN的几种结构 1.3 多对多的RNN 1.4 RNN的多对多结构 1.5 RNN的多对一结构 1.6 ...

  10. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...