类模板
声明类模板
类模板的成员函数被认为是函数模板,也称为类属函数。 声明类模板的一般格式如下:
代码语言:javascript复制template 类型形参表
class 类名
{
类声明体;
};
template 类型形参表
返回类型 类名 类型名表::成员函数1(形参表)
{
成员函数定义体;
};
template 类型形参表
返回类型 类名 类型名表::成员函数2(形参表)
{
成员函数定义体;
};
……
template 类型形参表
返回类型 类名 类型名表::成员函数n(形参表)
{
成员函数定义体;
};
注意:类型形参表中的形参需要加class或typename等关键词。
使用类模板
声明类模板之后创建模板类,一般格式如下:
代码语言:javascript复制类模板名<类型实参表>对象表;
其中,类型实参表应与该类模板中的“类型形参表”相匹配。“对象表”是定义该模板类的一个或多个对象。 例:
代码语言:javascript复制#include<iostream>
using namespace std;
template <class T>
class Array
{
int size;
T *aptr;
public:
Array(int slots = 1)
{
size = slots;
aptr = new T[slots];
}
void fill_Array();
void disp_Array();
~Array()
{
delete[] aptr;
}
};
template <class T>
void Array<T>::fill_Array()
{
cout << "(输入:" << size << "个数据)" << endl;
for (int i = 0; i < size; i )
{
cout << "第" << i 1 << "个数据:";
cin >> aptr[i];
}
}
template <class T>
void Array<T>::disp_Array()
{
for (int i = 0; i < size; i )
cout << aptr[i] << " ";
cout << endl;
}
void main()
{
Array<char> ac(5);//Array<char>为类模板,ac(5)定义模板类的对象
cout << "填充一个字符数组";
ac.fill_Array();
cout << "数组的内容是:";
ac.disp_Array();
Array<double> ad(4);
cout << "填充一个字符数组";
ad.fill_Array();
cout << "数组的内容是:";
ad.disp_Array();
system("pause");
}
类模板作为函数参数
函数的形参类型可以是类模板或类模板的引用,对应的实参应该是该类模板实例化的模板类对象。同时,对于带有类模板参数的函数,这个函数必须是函数模板。
类模板作为友元函数的形参类型
在一个类模板中可以设计友元函数。友元函数的形参类型可以是类模板或类模板的引用,对应的实参应该是该类模板实例化的模板类对象。同时,对于带有类模板参数的友元函数,这个友元函数必须是函数模板。
类模板与静态成员
从类模板实例化的每个模板类都有自己的类模板静态数据成员,该模板类的所有对象共有一个静态数据成员。
代码语言:javascript复制#include<iostream>
using namespace std;
template <class T>
class A
{
T m;
static T n;
public:
A(T a):m(a) { n = m; }
void disp(){ cout << "m=" << m << ",n=" << n << endl; }
};
template <class T>
T A<T>::n = 0;
void main()
{
A<int> a(2), b(3);
a.disp();
b.disp();
A<double> c(1.2), d(4.6);
c.disp();
d.disp();
system("pause");
}
类模板与无类型参数
在类模板中可以用无类型参数,即值参数,一般将无类型参数当做const处理,对这类参数不能取地址操作。
代码语言:javascript复制#include<iostream>
using namespace std;
template<class T,int size=10>
class A
{
T *p;
public:
A(T *q)
{
p = new T[size];
for (int i = 0; i < size; i )
p[i] = *q ;
}
void disp()
{
int i;
for (int i = 0; i < size; i )
cout << p[i];
cout << endl;
}
};
void main()
{
int a[] = { 1, 2, 4, 6, 8, 9, 5, 3 };
char *b = "kiuygtrmjnhg";
A<int, 5> s1(a);
cout << "a:"; s1.disp();
A<char> s2(b);
cout << "b:"; s2.disp();
system("pause");
}
上边程序,类模板A就有一个带有默认值的无类型参数size,在定义s2对象时,就使用了默认值,结果输出10个字符。