首页 > 编程语言 >1分钟理清楚C++类模板和模板类区别

1分钟理清楚C++类模板和模板类区别

时间:2022-12-08 23:31:52浏览次数:38  
标签:Compare 定义 成员 数据类型 C++ 分钟 模板 函数

1、定义区别       

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

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

template <typename 类型参数>
class 类名
{
类成员声明
};

或者:

template <class 类型参数>
class 类名
{
类成员声明
};

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

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

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

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


2、程序举例

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

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

#include <iostream>
using namespace std;
template <class T> //声明一个模板,虚拟数据类型名为T
class Compare //类模板名为Compare
{
public :
Compare(T a, T b)
{
x = a;
y = b;
}

T max( ) //类模板中的成员函数
{
return (x > y) ? x : y;
}

private :
T x;
T y;
};

int main()
{
Compare<int>fun1(5,8); //用类模板定义对象fun1,此时T被int替代
Compare<float>fun2(9.1,9.7); //用类模板定义对象fun2,此时T被float替代
Compare<char>fun3('a','h'); //用类模板定义对象fun3,此时T被char替代
cout<<"最大值是:"<<fun1.max()<<endl;
cout<<"最大值是:"<<fun2.max()<<endl;
cout<<"最大值是:"<<fun3.max()<<endl;
return 0;
}

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

最大值是:8
最大值是:9.7
最大值是:h

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

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

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

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

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

template<typename T>   //声明一个模板,虚拟数据类型名为T
class Compare
{
public :
Compare(T a, T b)
{
x = a;
y = b;
}

T max( ) //类模板中的成员函数

private :
T x;
T y;
};

template<typename T> //在成员函数定义之前进行模板声明
T Compare<T>::max() //在成员函数名前加上"类名<类型参数>::"
{
return (x > y) ? x : y;
}

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

1分钟理清楚C++类模板和模板类区别_类模板

标签:Compare,定义,成员,数据类型,C++,分钟,模板,函数
From: https://blog.51cto.com/Sharemaker/5923570

相关文章

  • 【转】C++的赋值构造函数(赋值运算符重载)
    原文网址:https://www.cnblogs.com/codingmengmeng/p/14116916.html当一个类的对象向该类的另一个对象赋值时,就会用到该类的赋值构造函数。当没有重载赋值构造函数(赋值运......
  • C++
    通讯录管理系统1、系统需求通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中......
  • djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令
    djiango框架推导过程,jinja2模板语法,jiango简介,基本操作命令一、web框架前戏web框架可以理解为是基于会联网的web服务端>>>socket服务端1.web框架的本质1.通俗的理解:我......
  • python3.11 pip 安装包失败: Microsoft Visual C++ 14.0、 cl.exe ...
    近期新发布的Python3.11使用pip安装第三方库时,怎么都安装不上,换成Python3.10就好了,服了,真是服了。第一次尝试:从网上下载了VisualC++2015BuildTools安装,尝试数......
  • OpenCV入门(C++/Python)- 使用OpenCV调整尺寸大小(三)
    OverridetheentrypointofanimageIntroducedinGitLabandGitLabRunner9.4.Readmoreaboutthe extendedconfigurationoptions.Beforeexplainingtheav......
  • C++课本的练习题及答案(第六章)
    第六章练习题一、选择题1.下列类的定义中正确的是(   )。(A)classa{intx=0;inty=1;}          (B)classb{intx=0;inty=1;};(C)classc{intx;inty;}     ......
  • C++ 实现视频文件播放(Windows Media Player、MFC、C#)
    文章目录​​1、简介​​​​1.1WMP控件特点​​​​1.2WMP开发接口​​​​1.3WMP开发方式​​​​1.4WMP支持格式​​​​2、官网代码示例​​​​2.1UsingtheWind......
  • c++ md5
    国内c++的md5一搜一大把,试了十几个,都有问题,转国外一篇,暂未发现问题http://www.zedwood.com/article/cpp-md5-functionmain.cpp#include<iostream>#include"md5.h......
  • 二、C++面向对象面试题
    二、面向对象1.多态(1)多态的实现有哪几种?黑马程序员C++核心编程第68页静态多态和动态多态。静态多态:是通过重载和模板技术实现的,在编译期间确定函数地址;动态多态:是通过虚函......
  • 【模板】取模类
    可能有锅,谨慎使用!classmint{ staticconstintmod=998244353;public: intnum; mint()=default; mint(longlong_num):num(_num%mod){} mint&operator=(lon......