C++模板知识小结
时间:2022-04-22
本文章向大家介绍C++模板知识小结,主要内容包括1.模板的概念、模板定义、模板规则、实例化、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。
1.模板的概念
模板定义
函数模板:template <typename T> T fun_name(const T&, const T&);
类模板:template <typename T> class class_name {
public:
T t;
void test(const T& t);
}
模板规则
类模板作用域在模板定义的整个过程
类模板不能重复
可以只声明,不定义
形参必需带上typename 或者 class
实例化
int a = fun_name(3, 4);
class_name<int> c1;
实例化时机在函数调用或者类实例构建时实例化模板
函数模板的一般定义形式是:
template<类型形式参数表> 返回类型 FunctionName(形式参数表)
{
//函数定义体
}
其中的类型形式参数表可以包含基本数据类型,也可以包含类类型。如果是类类型,则需加前缀class。
类模板的一般说明形式是:
template<类型形式参数表> class className
{
//类声明体
};
template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncName1(形式参数表)
{
//成员函数定义体
}
template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncName2(形式参数表)
{
//成员函数定义体
}
...
template<类型形式参数表>
返回类型 className<类型名表>::MemberFuncNameN(形式参数表)
{
//成员函数定义体
}
其中的类型形式参数表与函数模板中的意义一样。后面的成员函数定义中,className<类型名表>中的类型名表,是类型形式参数的使用。
2.函数模板与模板函数的区别
- 函数模板是模板的定义,定义中用到通用类型参数。
- 模板函数是实实在在的函数定义,它由编译系统在碰见具体的函数调用时所生成,具有程序代码。
3.类模板和模板类的区别
- 类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数。
- 模板类是实实在在的类定义,是类模板的实例化。类定义中参数被实际类型所代替。
与类和函数的定义不同,类模板和函数模板的定义一般放在头文件中。
使用类模板的方法为:
- 在程序开始的头文件中说明类模板的定义。
- 在适当的地方创建一个模板类的实例,即一个实实在在的类定义,同时创建该模板类的对象。
- 有了对象名,以后的使用就和通常一样。但要记住,你规定了什么类型的模板类,在使用成员函数时,所赋的实参也要对应该类型。
归纳的介绍,可以这样声明和使用类模板:
- 先写出一个实际的类。由于其语义明确,含义清楚,一般不会出错。
- 将此类中准备改变的类型名(如int要改变为float或char)改用一个自己指定的虚拟类型名(如上例中的numtype)。
- 在类声明前面加入一行,格式为 template <class 虚拟类型参数>,如 template <class numtype> //注意本行末尾无分号 class Compare {…}; //类体
- 用类模板定义对象时用以下形式: 类模板名<实际类型名> 对象名; 类模板名<实际类型名> 对象名(实参表列); 如 Compare<int> cmp; Compare<int> cmp(3,7);
- 如果在类模板外定义成员函数,应写成类模板形式: template <class 虚拟类型参数> 函数类型 类模板名<虚拟类型参数>::成员函数名(函数形参表列) {…}
关于类模板的几点说明:
- 类模板的类型参数可以有一个或多个,每个类型前面都必须加class,如 template <class T1,class T2> class someclass {…}; 在定义对象时分别代入实际的类型名,如 someclass<int,double> obj;
- 和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。
- 模板可以有层次,一个类模板可以作为基类,派生出派生模板类。
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- 熔断器 Hystrix 源码解析 —— 命令执行(二)之执行隔离策略
- phalapi-入门篇4(国际化高可用和自动生成文档)
- 用JavaScript动态输出的JS脚本不能执行
- Dubbo源码解析 —— 服务暴露原理
- [Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)
- [喵咪大数据]Hive+Hbase关联
- 再战子域共享Cookie问题
- [喵咪大数据]Presto查询引擎
- 如何在5分钟内做出你的第一个开源贡献
- [喵咪大数据]HUE大数据管理工具
- Dubbo源码解析 —— Zookeeper 订阅
- 注册中心 Eureka 源码解析 —— 项目结构简介
- 【平台】Seldon.io发布新开源平台,用于Kubernetes上的机器学习
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言中广义线性模型(GLM)中的分布和连接函数分析
- R语言自适应平滑样条回归分析
- R语言区间数据回归分析
- R语言ggsurvplot绘制生存曲线报错 : object of type ‘symbol‘ is not subsettable
- R软件SIR模型网络结构扩散过程模拟
- R语言中使用线性模型、回归决策树自动组合特征因子水平
- R语言缺失值的处理:线性回归模型插补
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- Android如何在Gradle中更改APK文件名详解
- 面试中常见的 C 语言与 C++ 区别的问题
- Linux系统实现ansible自动化安装配置httpd的方法
- 常用Linux发行版镜像源配置小结
- Linux如何处理文件已删除但空间不释放的问题
- 解析linux或android添加文件系统的属性接口的方法
- linux查看软件的安装位置简单方法