1、类模板的作用
类是对一组对象的公共性质的抽象,而类模板则是对一组类的公共性质的抽象。
其类模板的主要作用是:为类声明了一种模式,使得类中的某些数据成员、成员函数的参数和成员函数的返回值能取任意类型。
假如有两个或多个类的功能相同,只是数据类型不同。
声明一个类,对两个整数作比较,通过调用成员函数max和min得到两个整数中最大数和最小数。
#include <iostream>
class Compare_int
{
public:
Compare_int(int a, int b)
{
x = a; y = b;
}
int max()
{
return (x > y) ? x : y;
}
int min()
{
return (x > y) ? y : x;
}
private:
int x, y;
};
class Compare_float
{
public:
Compare_float(float a, float b)
{
x = a; y = b;
}
float max() {
return (x > y) ? x : y;
}
float min() {
return (x > y) ? y : x;
}
private:
float x, y;
};
只是数据类型不一样,其他都一样,我们就可以使用类模板。这样可以提高代码的复用性。
2、类模板的定义和使用
template <class 类型参数名 1, class 类型参数名 2,...>
class 类名
{
类声明体
};
例:将上面两个类写成以下的类模板:
#include <iostream>
template <calss T>//声明一个模板,虚拟类型名为T
class Compare //类模板为Complate
{
public:
Compare(T a, T b)
{
x = a; y = b;
}
T max()
{
return (x > y) ? x : y;
}
T min()
{
return (x > y) ? y : x;
}
private:
T x, y;
};
类模板不是一个具体的、实际的类,而是代表一种类型的类。
与函数模板不同的是:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而模板的实例化必须由程序员在程序中显式的指定。
类名<实际的数据类型 1,实际的数据类型 2,...> 对象名
例:
Compare <int> cmp(4,7);
假若我们要求两个int类型的数的最大值,但是调用的时候参数未必都是int类型的·,这时我们就得用函数模板。
#include <iostream>
using namespace std;
template <class T>
class Compare
{
public:
Compare(T a, T b) {
x = a; y = b;
}
T max() {
return (x > y) ? x : y;
}
T min() {
return (x > y) ? y : x;
}
private:
T x, y;
};
int main() {
Compare<int> j(3, 4.5);
cout << j.max() << endl;
return 0;
}
输出 4
它把4.5强转为int类型了。