当前位置: 首页 > news >正文

【类模板与模板类】 类模板与模板类详解

简洁

类模板:模板

模板类:实例

模板类是类模板实例化后的一个产物,说个具体点的例子吧,我们把类模板比作是一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做牛奶饼干,这些饼干出了材料不一样外,其它的东西都是一样的了。

详细

template<typename T> 和 template<class T>等价

在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢?

  事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候可以使用下面的方式了:

  template<typename T>,在模板定义语法中关键字class与typename的作用完全一样

区分类模板与模板类的概念

  一个类模板(类生成类)允许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

  如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。

类模板定义

定义一个类模板,一般有两方面的内容:

A首先要定义一个类,其格式为:

template<class T>
class test
{

....

}

test为类名,在类定义体中,如果采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型。还可以作为成员函数的参数和返回类型等。

例如:

template<class T>
class Test
{
private:
    T n;
    const T i;
public:
    Test():i(0) {}
    Test(T k);
    ~Test(){}

    void print();
    T operator+(T x);
};

如果在类外定义成员函数,若此成员函数中有模板参数存在,则除了需要和一般类的类外定义成员函数一样的定义外,还需要在函数外进行模板声明
例如:

template<class T>
void Test<T>::print()
 {
    std::cout<<"n="<<n<<std::endl;
    std::cout<<"i="<<i<<std::endl;
}
template<class T>
Test<T>::Test(T k):i(k){ n=k;}

template<class T>
T Test<T>::operator+(T x){
    return n + x;
}

类模板的使用

关于类模板的使用:类模板的使用实际上是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>

原文:https://www.cnblogs.com/cxq0017/p/6076856.html

相关文章:

  • 【C++】智能指针的原理和实现
  • 【C++容器】数组和vector、array三者区别和联系
  • 【init和selft】Python中__init__和self的意义和作用
  • 【多线程】Linux下c语言多线程编程---学习
  • 【python】Series和DataFrame的简单介绍
  • 【闭包】Python中的闭包
  • 【线程池】C语言实现的简单的线程池
  • 【互斥锁和条件变量】何时互斥锁不够,还需要条件变量?
  • 【malloc和calloc】malloc和calloc函数区别
  • 【pthread_detach/pthread_join】pthread_detach()与pthread_join的区别?
  • 【时间复杂度】时间复杂度
  • 【Dll调试】DLL调试方法
  • 【机器学习】线性回归数学推导
  • 【VS消除警告】VS消除特定警告/安全函数警告C4996 strncpy unsafe……
  • CSDN 博客备份工具
  • 10个确保微服务与容器安全的最佳实践
  • ES6语法详解(一)
  • mysql中InnoDB引擎中页的概念
  • Netty源码解析1-Buffer
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Python连接Oracle
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • Vim 折腾记
  • vue-router 实现分析
  • webpack入门学习手记(二)
  • 如何学习JavaEE,项目又该如何做?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 思否第一天
  • 自制字幕遮挡器
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #QT(TCP网络编程-服务端)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (差分)胡桃爱原石
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (四)JPA - JQPL 实现增删改查
  • (算法设计与分析)第一章算法概述-习题
  • (转)winform之ListView
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .equals()到底是什么意思?
  • .NET面试题(二)
  • .NET命名规范和开发约定
  • /*在DataTable中更新、删除数据*/
  • @RequestParam详解
  • @Transient注解
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [Angular] 笔记 21:@ViewChild
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C/C++]数据结构 栈和队列()
  • [C++]打开新世界的大门之C++入门
  • [C++打怪升级]--学习总目录