我们在编程的时候总是会遇到一些类似的模块,只是模块中的形参的数据类型不同,导致我们要不断的去更改模块的。这里就涉及到重载的知识点了。例如以下的几种情况:
//函数1.
int max(int x,int y);
{return(x>y)?x:y ;}
//函数2.
float max( float x,float y){
return (x>y)? x:y ;}
//函数3.
double max(double x,double y)
{return (c>y)? x:y ;}
这时候,C++中的模版(template)就很好的为我们提供了解决方案。运用模版,我们只需要在使用时,再将数据类型定义上去就可以使用了,不用大费周折的不同的数据类型都得去写一个模块。
首先,我们得自己写一个模版的头文件。模版的格式很复杂,有点难记。但没关系,我们一步步来。下面给出头文件的代码:
#ifndef TemplateClass_H_
#define TemplateClass_H_
template <class A, class B> class myClass{ //定义一个类模版
private:
A X;
B Y;
public:
myClass(A X, B Y); //初始化模块,初始化X,Y
void output();
A max();
};
template <class A,class B> myClass<A,B>::myClass(A a,B b):X(a),Y(b){} //初始化X,Y
//注意下面标红的数据类型,这是为了说明函数的数据类型
template<class A, class B> void myClass<A, B>::output() { //输出X,Y
cout << "X:" << X << endl << "Y:" << Y << endl;
}
template<class A,class B> A myClass<A, B>::max() { //得到X,Y中最大的一个值
return X > Y ? X : Y;
}
#endif // !TemplateClass_H_
1.类模版的定义
我们把模版的定义拆解来看
template <class A, class B> class myClass{
private:
public:
}
可以将template<class或者typename A> class 类名{}看成
大前提()class 类名{执行方案}
2.类中函数模块的定义
在类模版中,不可避免的要用到函数模块。这是我们便要定义函数了。
void output();
template<class A, class B> void myClass<A, B>::output() { //输出X,Y
cout << "X:" << X << endl << "Y:" << Y << endl;
}
按照上面的方法,将函数定义看作
大前提()返回类型 类名<>::函数模块名(形参){函数体}
最后,通过源程序检查是否成功
#include<iostream>
#include"Template.h"
using namespace std;
void main() {
myClass<double, int>class1(2.9, 3);
class1.output();
myClass<int, int>class2(10, 20);
cout << class2.max() << endl;
system("pause");
}
运行结果如图,成功