C++通用模板类(学习版)
来源:互联网 发布:新时模型淘宝 编辑:程序博客网 时间:2024/05/01 11:12
在编程中我们常常遇到处理同样意义的东西由于数据类型不同,使得我们写了很多的具有冗余的代码,运行速度还慢的要死,这时就出现了我知道的3种方法:一一来看一下
重载:
#include<iostream>using namespace std;class AAA{public: int Add(int x,int y) { return x+y; } float Add(float x,float y) { return x+y; } char Add(char x,char y) { return x+y; } int Add(int x,char y) { return x+y; } //...... //我们发现同样是加法函数,我们多重载不完,大量的冗余代码也出来了; //重载可用于方法少的地方,当我们自己都不知道有多少中的不适合重载}
定义宏实现
#include<iostream>using namespace std;#define Add(x,y) ((x)+(y))/*宏只替换,故而可以处理不同类型。但尽管我们已经很小心的对参数加了括号,可是对于调用Add(i++,j++),这类的参数,会带来副作用,是程序带来不可预测的错误。//舍弃。*/
模板
@1:集成了重载和宏的优点
template <class numtype> //声明一个模板,虚拟类型名为numtypeclass Compare //类模板名为Compare{public : Compare(numtype a,numtype b) { x=a; y=b; } numtype max( ) { return (x>y)?x:y; } numtype min( ) { return (x<y)?x:y; }private : numtype x,y;};
numtype是传过来的类型,例:int ——numtype(int)
在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。由于类模板包含类型参数,因此又称为参数化的类。如果说类是对象的抽象,对象是类的实例,则类模板是类的抽象,类是类模板的实例。利用类模板可以建立含各种数据类型的类。在声明了一个类模板后,怎样使用它?怎样使它变成一个实际的类?
先回顾一下用类来定义对象的方法:
Compare_int cmp1(4,7); // Compare_int是已声明的类
用类模板定义对象的方法与此相似,但是不能直接写成
Compare cmp(4,7); // Compare是类模板名
Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它去定义对象。
必须用实际类型名去取代虚拟的类型,具体的做法是:
Compare <int> cmp(4,7);
即在类模板名之后在尖括号内指定实际的类型名,在进行编译时,编译系统就用int取代类模板中的类型参数numtype,这样就把类模板具体化了,或者说实例化了。这时Compare就相当于前面介绍的Compare_int类。
例:声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。
#include <iostream>using namespace std;template <class numtype> //声明一个模板,虚拟类型名为numtypeclass Compare //类模板名为Compare{public : Compare(numtype a,numtype b) { x=a; y=b; } numtype max( ) { return (x>y)?x:y; } numtype min( ) { return (x<y)?x:y; }private : numtype x,y;};int main( ){ Compare<int > cmp1(3,7);//定义对象cmp1,用于两个整数的比较 cout<<cmp1.max( )<<endl; cout<<cmp1.min( )<<endl; Compare<float > cmp2(45.78,93.6); //定义对象cmp2,用于两个浮点数的比较 cout<<cmp2.max( )<<endl; cout<<cmp2.min( )<<endl<<endl; Compare<char> cmp3(′a′,′A′); //定义对象cmp3,用于两个字符的比较 cout<<cmp3.max( )<<endl; cout<<cmp3.min( )<<endl; return 0;}
输出结果:
“`
7
3
93.6
45.78
a
A
“`明显发现一份代码,当我们给的参数类型不同,调用的也不同
调用分2种
// 隐式传类型Compare cmp1(3,7)// 显示传类型Compare<int > cmp1(3,7)
类定义体外定义的成员函数,应该使用函数模板.
#include <iostream> using namespace std ; template <class T> class Base { public : T a ; Base(T b) { a = b ; } T getA(){return a ;} //类内定义 void setA(T c); } ; template <class T> //模板在类外的定义 void Base<T>::setA(T c) { a = c ; } int main() { Base <int>b(4) ; cout<<b.getA() ; Base <double> bc(4) ; bc.setA(4.3) ; cout<<bc.getA() ; system("pause") ; return 0 ; }
阅读全文
1 0
- C++通用模板类(学习版)
- View类通用模板(C#)
- c++ 模板学习笔记:用数组和类模板模拟通用栈(权哥)
- C/C++ 通用 Makefile模板
- ASP通用模板类
- 一个C/C++通用的Makefile模板
- c++ 模板学习笔记:函数模板实现数组通用排序和遍历打印(权哥)
- C/C++学习(三)模板类之间继承
- 通用模板
- 通用模板
- 通用模板
- 学习C++模板---模板类作为基类
- 学习C++模板---模板类带简单参数
- C++primer学习:模板编程(2):类模板的定义
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- 类模板与模板类(C++)
- 通过代码学习C#&.NET——委托使用(通用类设计)
- 通过代码学习C#&.NET——委托使用(通用类设计)
- ARM汇编编程基础之一 —— 寄存器
- Celery-4.1 用户指南: Extensions and Bootsteps
- HDU 1018 Big Number(阶乘位数计算)
- 年底去面试,借你“法器”戳破不靠谱公司 !
- 玩可视化大数据分析软件要掌握的6个核心技术(下)
- C++通用模板类(学习版)
- 使用 ESLint 检查 TypeScript 代码
- 解决存储过程执行快,但程序调用则执行慢的问题
- C#判断操作系统类型
- VS+QT和qtcreator工程的互相转换
- ARM汇编编程基础之二 —— 流水线对PC值的影响
- Excel在统计分析中的应用—第八章—假设检验-方差已知下总体均值的双侧检验
- 产品经理的PRD产品需求文档
- Node.js —— 使用express创建web服务器及路由