C++中类模板的概念和意义
1,在 C++ 中是否能够将泛型的思想应用于类?
1,函数模板是将泛型编程的思想应用于函数,就有了函数模板;
2,可以,常用的 C++ 标准库就是 C++ 中的标准模板库,C++ 中的 STL 就是将泛型的思想应用于一系列的函数,就得到了函数模板,当然也有很多的类模板;
3,类模板就是将泛型思想应用于 C++ 中的类而得到的新概念;
2,类模板:
1,一些类主要用于存储和组织数据元素;
1,类模板就是为了数据结构而诞生的;
2,类中数据组织的方式和数据元素的 具体类型无关;
3,如:数组类、链表类、Stack 类、Queue 类等;
1,C++ 中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需实现的功能;
3,C++ 中的类模板:
1,以相同的方式处理不同的类型;
2,在类声明前使用 template 进行标识;
3,< typename T > 用于说明类中使用的泛指类型 T;
1,代码示例:
template < typename T >
class Operator // class 表明将泛型编程应用于类
{
public:
T op(T a, T b) // T 在使用类模板定义具体对象的时候关心,其它时候不关心;
};
4,类模板的应用:
1,只能显示指定具体类型,无法自动推导;
2,使用具体类型 < Type > 定义对象;
1,代码示例:
Operator<int> op1;
Operator<string> op2;
int i = op1.op(, );
string s = op2.op("D.T.", "Software");
4,类模板:
1,声明的泛指类型 T 可以出现在类模板的任意地方;
2,编译器对类模板的处理方式和函数模板相同;
1,从类模板通过具体类型产生不同的类;
1,编译器将类模板当做一个模子,这个模子可以产生许多实实在在的类;
2,在声明的地方对类模板代码本身进行编译;
3,在使用的地方对参数替换后的代码进行编译;
5,类模板初探编程实验:
#include <iostream>
#include <string> using namespace std; template < typename T >
class Operator // 要是用这个类模板有一个前提条件,即当前的 Operator 类模板要操作的数据类型必须支持 +、-、*、/ 这四个运算符,这四个运算符如果要运用于自己定义的数据类型类,要重载这四个运算符;第一次编译是对类模板本身的语法进行编译;
{
public:
T add(T a, T b)
{
return a + b;
} T minus(T a, T b)
{
return a - b;
} T multiply(T a, T b)
{
return a * b;
} T divide(T a, T b)
{
return a / b;
}
}; string operator-(string& l, string& r) // 全局函数方式重载 - 操作符,编译通过;先类内部、再全局
{
return "Minus"; // 仅仅为了说明问题;
} int main()
{
Operator<int> op1; cout << op1.add(, ) << endl; // 3; Operator<string> op2; // 第二次使用类模板时进行编译,但是并不是对所有模板中的函数进行了第二次编译,是分步编译的,首先编译的是构造函数,此时用的是默认的,没有问题,这里编译通过; cout << op2.add("D.T.", "Software") << endl; // D.T.Software;这里编译器针对 add() 函数进行第二次编译;
cout << op2.minus("D.T", "Software") << endl; // 未有定义全局的重载 - 操作符的函数时,字符串相减没有定义,报错;这里报错展示出来是为了证明类模板编译也是经过了两次编译;这里编译器针对 minus() 函数进行第二次编译;定义全局的重载 - 操作符函数后,打印 Minus ; return ;
}
1,编译器对类模板第一次编译针对类模板本身代码进行编译;
2,第二次编译是使用类模板时针对每个成员函数独立编译;
6,类模板的工程应用:
1,类模板必须在头文件中定义;
2,类模板不能分开实现在不同的文件中;
3,类模板外部定义的成员函数需要加上模板 <> 声明;
1,将类模板的成员函数实现放到类模板的外部实现;
2,以上三条规则不是 C++ 和编译器的一部分,只是工程应用里习惯这样做,这样做后,代码可维护性、扩展性都会变好,因此建议遵守这三条规则;
7,模板类的工程应用编程实验:
1,头文件(名字和类名一样) Operator.h 中的内容:
#ifndef _OPERATOR_H_ // 防止被包含两次;
#define _OPERATOR_H_ template < typename T >
class Operator
{
public:
T add(T a, T b);
T minus(T a, T b);
T multiply(T a, T b);
T divide(T a, T b);
}; template < typename T > // 加上类模板;
T Operator<T>::add(T a, T b) // add() 是 Operator 类模板的;
{
return a + b;
} template < typename T >
T Operator<T>::minus(T a, T b)
{
return a - b;
} template < typename T >
T Operator<T>::multiply(T a, T b)
{
return a * b;
} template < typename T >
T Operator<T>::divide(T a, T b)
{
return a / b;
} #endif
2,头文件的应用;
#include <iostream>
#include <string>
#include "Operator.h" using namespace std; int main()
{
Operator<int> op1; cout << op1.add(, ) << endl; // 3;
cout << op1.multiply(, ) << endl; // 20;
cout << op1.minus(, ) << endl; // -1;
cout << op1.divide(, ) << endl; // 2; return ;
}
1,三条规则不是硬性要求但是却可以带来很大好处;
8,小结:
1,泛型编程的思想可以应用于类;
2,类模板以相同的方式处理不同类型的数据;
3,类模板非常适用于编写数据结构相关的代码;
4,类模板在使用时只能显示指定类型;
C++中类模板的概念和意义的更多相关文章
- C++中函数模板的概念和意义
1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数 模板和类模板就是 C++ 中泛型编程技术,本 ...
- Page11:状态反馈、输出反馈的概念及性能比较,极点配置的基本概念、意义及其算法[Linear System Theory]
内容包含离散时间线性时不变系统的稳定判据 状态反馈.输出反馈的基本概念及其性能比较 极点配置的基本概念.意义及其算法
- C++中组合和继承的概念及意义
1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...
- [综述]领域特定语言(Domain-Specific Language)的概念和意义
领域特定语言(Domain Specific Language, DSL)是一种为解决特定领域问题而对某个特定领域操作和概念进行抽象的语言.领域特定语言只是针对某个特定的领域,这点与通用编程语言(Ge ...
- QCache 缓存(类似于map的模板类,逻辑意义上的缓存Cache,方便管理,默认类似于LRU的淘汰算法)
最近在学习缓存方面的知识,了解了缓存(Cache)的基本概念,为什么要使用缓存,以及一些缓存算法(缓存替换),如LRU.LFU.ARC等等. 这些缓存算法的实现过程会使用一些基本的数据结构,如list ...
- C++中多态的概念和意义
1,函数重写回顾: 1,父类中被重写的函数依然会继承给子类: 2,子类中重写的函数将覆盖父类中的函数: 1,重写父类当中提供的函数是因为父类当中提供的这个函数版本不能满足我们的需求,因此我们要重写: ...
- STL模板_概念
模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...
- 7.1 C++模板基本概念及语法 《C++模板与标准模板库》
参考:http://www.weixueyuan.net/view/6398.html 总结: 模板是另一种代码重用机制. 需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同. 有更好 ...
- js模板块概念
js模板介绍 https://little-white.gitbooks.io/-js/content/ http://www.ruanyifeng.com/blog/2012/10/javascri ...
随机推荐
- EasyUI-combotree 下拉树 数据回显时默认选中
组合树(combotree)把选择控件和下拉树结合起来.它与组合框(combobox)相似,不同的是把列表替换成树组件.组合树(combotree)支持带有用于多选的树状态复选框的树. 依赖 comb ...
- HDU 6191 Query on A Tree ( 2017广西邀请赛 && 可持久化Trie )
题目链接 题意 : 给你一棵树.树上的每个点都有点权.之后有若干次问询.每次问询给出一个节点编号以及一个整数 X .问你以给出节点为根的子树中哪个节点和 X 异或最大.输出这个值 分析 : 看到这种树 ...
- python中oepen及fileobject初步整理之划水篇
open选项 参考官方文档,很多东西也没有看懂,将自己理解的部分先整理到这里,以后还是要参阅官方文档的. open (file, mode='r', buffering=-1, encoding=No ...
- ASE高级软件工程 第一次结对作业
黄金点游戏Bot Bot8前来报道 1.问题定义 a) 问题描述 N个玩家,每人写一个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0 ...
- 51 Nod N^N的末位数字
1004 n^n的末位数字 题目来源: Author Ignatius.L (Hdu 1061) 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给 ...
- MCMC & 贝叶斯
用MCMC做参数估计
- AtCoder AGC032D Rotation Sort (DP)
题目链接 https://atcoder.jp/contests/agc032/tasks/agc032_d 题解 又是一道神仙题啊啊啊啊...atcoder题真的做不来啊QAQ 第一步又是神仙转化: ...
- MySQ彻底删除与安装配置
彻底删除 1.查看 MySQL 安装了哪些东西 rpm -qa |grep -i mysql 2.卸载 -.el7.x86_64 -.el7.x86_64 .noarch -.el7.x86_64 - ...
- spring boot V部落 V人事项目
公司倒闭 1 年多了,而我在公司倒闭时候做的开源项目,最近却上了 GitHub Trending,看着这个数据,真是不胜唏嘘. 缘起 2017 年 11 月份的时候,松哥所在的公司因为经营不善要关门了 ...
- 泛型中的<Object>并不是像以前那样有继承关系的,也就是说List<Object>和List<String>是毫无关系的
泛型中的<Object>并不是像以前那样有继承关系的,也就是说List<Object>和List<String>是毫无关系的