C++中的类模板定义及实例化

2023-11-09

转载自Out man

一、类模板定义及实例化

定义一个类模板:

template<class 模板参数表>

class 类名{

// 类定义......

};

其中,template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数,也可以是非类型参数。类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。

例:

//type为类型参数,width为非类型参数
template<class type,int width>
class Graphics;

注意:

(1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。

(2) 模板参数名不能被当作类模板定义中类成员的名字。

(3) 同一个模板参数名在模板参数表中只能出现一次。

(4) 在不同的类模板或声明中,模板参数名可以被重复使用。

typedef string type;

template<class type,int width>

class Graphics

{

type node;//node不是string类型

typedef double type;//错误:成员名不能与模板参数type同名

};

template<class type,class type>//错误:重复使用名为type的参数

class Rect;

template<class type> //参数名”type”在不同模板间可以重复使用

class Round;

(5)在类模板的前向声明和定义中,模板参数的名字可以不同。

// 所有三个 Image 声明都引用同一个类模板的声明

template <class T> class Image;

template <class U> class Image;

// 模板的真正定义

template <class Type>

class Image { //模板定义中只能引用名字”Type”,不能引用名字”T”和”U” };

(6)类模板参数可以有缺省实参,给参数提供缺省实参的顺序是先右后左。

template <class type, int size = 1024>

class Image;

template <class type=double, int size >

class Image

类模板实例化

Graphics<int> gi;

类模板什么时候会被实例化呢?

①当使用了类模板实例的名字,并且上下文环境要求存在类的定义时。

②对象类型是一个类模板实例,当对象被定义时。此点被称作类的实例化点。

③一个指针或引用指向一个类模板实例,当检查这个指针或引用所指的对象时。

template<class Type>

class Graphics{};

void f1(Graphics<char>);// 仅是一个函数声明,不需实例化

class Rect 

{

  Graphics<double>& rsd;// 声明一个类模板引用,不需实例化

  Graphics<int> si;// si是一个Graphics类型的对象,需要实例化类模板

}

int main(){

  Graphcis<char>* sc;// 仅声明一个类模板指针,不需实例化

  f1(*sc);//需要实例化,因为传递给函数f1的是一个Graphics<int>对象。

  int iobj=sizeof(Graphics<string>);//需要实例化,因为sizeof会计算Graphics<string>对象的大小,为了计算大小,编译器必须根据类模板定义产生该类型。

}

二、类模板的成员函数

要点:

①类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(此时成员函数定义前面必须加上template及模板参数)。

②类模板成员函数本身也是一个模板,类模板被实例化时它并不自动被实例化,只有当它被调用或取地址,才被实例化。

template<class type>

Class Graphics{

Graphics(){}//成员函数定义在类模板的定义中

void out();

};

template<class type>//成员函数定义在类模板定义之外

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

C++中的类模板定义及实例化 的相关文章

随机推荐

  • 时序预测

    时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 目录 时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 预测结果 基本介绍 模型结构 程序设计 参考资料 预测
  • MySQL数据库、表常用命令

    目录 一 数据库分类 1 关系型数据库 2 非关系型数据库 二 MySQL相关基础 三 MySQL数据库基础操作 1 显示数据库 2 创建数据库 3 删除数据库 4 使用数据库 四 常用数据类型 1 数值类型 2 字符串类型 3 日期类型
  • 【C51】单片机芯片之——图解74HC595

    第一部部分用于快速查阅使用 详细的使用见文章第二部分 引脚图 14脚 DS SER 串行数据输入引脚 13脚 OE 输出使能控制脚 它是低电才使能输出 所以接GND 12脚 RCK 存储寄存器时钟输入引脚 上升沿时 数据从移位寄存器转存带存
  • Maven依赖冲突

    An attempt was made to call a method that does not exist 依赖冲突完整报错如下 Description An attempt was made to call a method tha
  • 字符串04--左旋转字符串

    字符串04 左旋转字符串 jz43 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 汇编语言中有一种移位指令叫做循环左移 ROL 现在有个简单的任务 就是用字符串模拟这个指令的运算结果 对于一个给定的字符序列S 请你把其循环左
  • express和koa中的超时处理

    从某个话题中得到的灵感 这里做一个分享 http cnodejs org topic 592fdc2f03dba3510d8a62a0 59364c3b538dbcaa6bc7dd48 楼主遇到一个问题 如何管理express中的超时 ex
  • BigDecimal 精度问题

    BigDecimal 精度问题 在使用BigDecimal过程中 暂时遇到两个问题 都是精度问题 一个是精度丢失 一个是精度显示问题 精度丢失 BigDecimal创建对象有很多种方式 通过double类型去声明bigdecimal对象时
  • Hyperledger Fabric架构设计

    目录 1 逻辑架构 答疑 什么叫做背书策略 2 运行时架构 答疑 什么是锚节点 1 逻辑架构 Hyperledger Fabric从1 X开始 在扩展性及安全性方面有了很大的提升 且新增了诸多特性 多通道 支持多通道 提高隔离安全性 可插拔
  • Diffusion Models 简单代码示例

    一 关于Diffusion 模型的简单介绍 首先diffusion模型和VAE Flow Gan等模型类似 均属于生成模型 可以和GCN CNN等其他深度学习网络相结合 完成特定的生成任务 如下图 基于 GAN 生成模型 基于 VAE 的生
  • 卷积核的类型及其作用

    目录 一 堆叠小卷积核 1 为什么要用大卷积核代替小卷积核 2 为什么堆叠小卷积核参数量要比大卷积核少 3 输入输出图片通道数一致时堆叠小卷积核参数量才更小 4 感受野计算 二 空洞卷积 能否让固定大小的卷积核看到更大范围的区域 三 非对称
  • c语言中的std模版用法,C++模板template用法小结(推荐)

    引言 模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 函数模板 在c 入门中 很多人会接触swap int i
  • vue的安全隐患(一)

    vue安全方面的知识 第一原则永远不要使用不信任的模板 在vue中使用不信任的模板这等于允许在应用程序中执行任意的javascript代码 甚至更糟糕的是服务器可能会被攻破 比如在 template sertppp 不要这样做因为vue的模
  • 强化学习的几种环境介绍

    前言 对于强化学习相关的几种环境介绍 主要包括Mini world Gym maze Grid world gym minigrid Mini world https github com maximecb gym miniworld Mi
  • 用c语言设计加减乘除自动出题程序,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    include include stdlib h define N 10 void fun int a b t char c scanf d a scanf c c scanf d b if c c c c c if c t a b if
  • 关于unique case和priority case语法

    SystemVerilog对于case casez casex语句新增了两个特殊的修饰符 unique及priority 其语法规则如下 unique case
  • 疫情信息获取。

    爬取目标 腾讯新闻 疫情数据 确定信息 在目标网页按F12 在全局数据中寻找 发现有目标数据 接下来在Network中寻找数据并在Headers中获得链接地址 也可以点击搜索查找 较为方便 省份数据和全球数据也是同样的方法 注意图二 最终确
  • 【JS逆向】之webpack逆向实战

    声明 本文只作学习研究 禁止用于非法用途 否则后果自负 如有侵权 请告知删除 谢谢 目标网站 aHR0cHM6Ly8xNTE0NjQ2LmNvbS9sb2dpbg 引言 webpack对于有研究过人的来说就是 难度并不是很高 但是因为web
  • xss过滤绕过方法总结

    xss注入常用语句 1 2 img src 3 img src 4
  • JS 将数组写入表单

    将数据写入表单 var rowData 1 2 3 function insertToForm rowData if rowData length lt 1 alert 没有数据 else var form formID for var i
  • C++中的类模板定义及实例化

    转载自Out man 文章目录 一 类模板定义及实例化 定义一个类模板 类模板实例化 二 类模板的成员函数 一 类模板定义及实例化 定义一个类模板 template