类模板

“我相信任何事情都不会不留痕迹就过去,对现在的和将来的生活来说,我们所走的最小的一步路都是有意义的。”————契诃夫

同函数模板一样,使用类模板可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数以及某些成员函数的返回值能取任意类型。

定义

类是对一组对象的公共性质的抽象
类模板是对不同类的公共性质的抽象。(一种更高层次的抽象)
格式:

template<模板参数表>
class<类模板名>
{
<类成员声明>
}

类模板中的成员函数和重载的运算符必须为函数模板。

类模板的实例化

//通用数组类
#include<iostream>
using namespace std;
const int size=10;
template<typename AType>class atype//类模板
{
	public:
		atype()
		{
			int i;
			for(i=0;i<size;i++)
				array[i]=i;
		}
		AType &operator[](int n);
	private:
		AType array[size];
 };
 //类外定义的格式 
 //template<模式参数表>
 //<返回值类型><类模板名><类型名表>::<函数名>(<参数表>)
 template<typename AType>
 AType &atype<AType>::operator[](int n)
 {
 	//下标越界检查
	 if(n<0||n>=size)
	 {
	 	cout<<"下标"<<n<<"超出范围!"<<endl;
		 exit(1); 
	  } 
	  return array[n];
 }
 int main()
 {
 	atype<int>intob;
 	atype<double>doubleob;
 	int i;
 	cout<<"Integer数组";
 	for(i=0;i<size;i++) intob[i]=i;
 	for(i=0;i<size;i++)
 		cout<<intob[i]<<" ";
 	cout<<endl;
 	cout<<"Double 数组";
 	for(i=0;i<size;i++)
 		cout<<doubleob[i]<<" ";
 	cout<<endl;
 	intob[12]=100;//示范一下如果下标越界会出现什么结果 
 	return 0;
 }

结果:

Integer数组0 1 2 3 4 5 6 7 8 9
Double 数组0 1 2 3 4 5 6 7 8 9
下标12超出范围!

使用函数类型参数的类模板

在类模板的<模板参数表>中,必须至少有一个类参数,当然也可以有多个类参数。还可以有非类参数的参数,这样的参数一般被称为函数类型参数(也可以称为无类型模板参数)
函数类型参数只限于整型、指针型、引用,其他类型不能使用。

下面的程序为数组类模板提供了更好的方法,它使程序员能够指定数组的大小。

//使用函数类型参数的类模板 
#include<iostream>
using namespace std;
template<typename AType,int size>
class atype//模板类 
{
	public:
		atype()
		{
			int i;
			for(i=0;i<size;i++)
				array[i]=i;
		}
		AType &operator[](int n);
	private:
		AType array[size];
 };
 //类外定义的格式 
 //template<模式参数表>
 //<返回值类型><类模板名><类型名表>::<函数名>(<参数表>)
 template<typename AType,int size>
 AType &atype<AType,size>::operator[](int n)
 {
 	//下标越界检查
	 if(n<0||n>=size)
	 {
	 	cout<<"下标"<<n<<"超出范围!"<<endl;
		 exit(1); 
	  } 
	  return array[n];
 }
 int main()
 {
 	//10个元素的integer数组类,intob为该类的一个对象 
 	atype<int,10>intob;
 	//10个元素的double数组类,doubleob为该类的一个对象 
 	atype<double,10>doubleob;
 	int i;
 	cout<<"Integer数组";
 	for(i=0;i<10;i++) intob[i]=i;
 	for(i=0;i<10;i++)
 		cout<<intob[i]<<" ";
 	cout<<endl;
 	cout<<"Double 数组";
 	for(i=0;i<10;i++)
 		cout<<doubleob[i]<<" ";
 	cout<<endl;
 	return 0;
 }

结果:

Integer数组0 1 2 3 4 5 6 7 8 9
Double 数组0 1 2 3 4 5 6 7 8 9

使用默认参数的类模板

类模板可以包含与通用类型相关的默认参数,当类模板被实例化时,如果没有制定其他的数据类型,则使用默认类型。
函数类型参数也可以使用默认参数。

//使用默认参数的类模板 
#include<iostream>
using namespace std;
template<typename AType=int,int size=10>//变化在这里!!有默认参数了 
class atype
{
	public:
		atype()
		{
			int i;
			for(i=0;i<size;i++)
				array[i]=i;
		}
		AType &operator[](int n);
	private:
		AType array[size];
 };

举例实现:

	//12个元素的integer数组类,intob为该类的一个对象 
 	atype<int,12>intob;
 	//double数组类,数组大小为默认值10,doubleob为该类的一个对象 
 	atype<double>doubleob;
 	//数组类,类型为默认值int,数组大小默认为10,defaultob为该类的一个对象
	 atype<>defaultob; 

完整代码如下:

//使用默认参数的类模板 
#include<iostream>
using namespace std;
template<typename AType=int,int size=10>//变化在这里!!有默认参数了 
class atype
{
	public:
		atype()
		{
			int i;
			for(i=0;i<size;i++)
				array[i]=i;
		}
		AType &operator[](int n);
	private:
		AType array[size];
 };
 //类外定义的格式 
 //template<模式参数表>
 //<返回值类型><类模板名><类型名表>::<函数名>(<参数表>)
 template<typename AType,int size>
 AType &atype<AType,size>::operator[](int n)
 {
 	//下标越界检查
	 if(n<0||n>=size)
	 {
	 	cout<<"下标"<<n<<"超出范围!"<<endl;
		 exit(1); 
	  } 
	  return array[n];
 }
 int main()
 {
 	//12个元素的integer数组类,intob为该类的一个对象 
 	atype<int,12>intob;
 	//double数组类,数组大小为默认值10,doubleob为该类的一个对象 
 	atype<double>doubleob;
 	//数组类,类型为默认值int,数组大小默认为10,defaultob为该类的一个对象
	 atype<>defaultob; 
 	int i;
 	cout<<"Integer数组";
 	for(i=0;i<12;i++) intob[i]=i;
 	for(i=0;i<12;i++)
 		cout<<intob[i]<<" ";
 	cout<<endl;
 	cout<<"Double 数组";
 	for(i=0;i<10;i++)
 		doubleob[i]=(double)i/2;
 	for(i=0;i<10;i++)
 		cout<<doubleob[i]<<" ";
 	cout<<endl;
 	cout<<"默认参数数组:";
 	for(i=0;i<10;i++)
 		cout<<defaultob[i]<<" ";
 	cout<<endl;
 	return 0;
 }

结果:

Integer数组0 1 2 3 4 5 6 7 8 9 10 11
Double 数组0 0.5 1 1.5 2 2.5 3 3.5 4 4.5
默认参数数组:0 1 2 3 4 5 6 7 8 9

终于弄清楚基础了,下面可以学stl了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值