模板(下)——(类模板)

时间:2022-07-24
本文章向大家介绍模板(下)——(类模板),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

类模板

声明类模板

类模板的成员函数被认为是函数模板,也称为类属函数。 声明类模板的一般格式如下:

template 类型形参表
class 类名
{
	类声明体;
};
template 类型形参表
返回类型 类名 类型名表::成员函数1(形参表)
{
	成员函数定义体;
};
template 类型形参表
返回类型 类名 类型名表::成员函数2(形参表)
{
	成员函数定义体;
};
……
template 类型形参表
返回类型 类名 类型名表::成员函数n(形参表)
{
	成员函数定义体;
};

注意:类型形参表中的形参需要加class或typename等关键词。

使用类模板

声明类模板之后创建模板类,一般格式如下:

类模板名<类型实参表>对象表;

其中,类型实参表应与该类模板中的“类型形参表”相匹配。“对象表”是定义该模板类的一个或多个对象。 例:

#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");
}

类模板作为函数参数

函数的形参类型可以是类模板或类模板的引用,对应的实参应该是该类模板实例化的模板类对象。同时,对于带有类模板参数的函数,这个函数必须是函数模板。

类模板作为友元函数的形参类型

在一个类模板中可以设计友元函数。友元函数的形参类型可以是类模板或类模板的引用,对应的实参应该是该类模板实例化的模板类对象。同时,对于带有类模板参数的友元函数,这个友元函数必须是函数模板。

类模板与静态成员

从类模板实例化的每个模板类都有自己的类模板静态数据成员,该模板类的所有对象共有一个静态数据成员。

#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处理,对这类参数不能取地址操作。

#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个字符。