模
板
模板与使用
模板就是使程序能够对不同类型的数据进行相同
方式的处理 。 C++中的模板分为类模板和函数模板 。
类模板
说明类模板的一般格式为:
template <类型参数表 > class 类模板名
{ private:
私有成员定义
protected:
保护成员定义
public:
公有成员定义 };
模板与使用
其中,(1)类型形式参数表可以包含基本数据类型, 也
可以包含类类型, 如果是类类型, 则须加前缀 class。
当参数有多个时, 需用逗号隔开 。
(2)类模板中的成员函数的定义, 可以放在类模板的定
义体中 ( 此时与类中的成员函数的定义方法一致 ),
也可以放在类模板的外部定义成员函数, 此时成员函
数的定义格式如下:
template <类型形式参数表 >
函数值的返回类型 类模板名 <类型名表 >::成员函
数 ( 形参 ) { 函数体 }
其中:类模板名即是类模板中定义的名称;类型名
表即是类模板定义中的类型形式参数表中的参数名 。
模板与使用
(3)利用类模板定义的只是对类的描述, 它本身还不是
一个实实在在的类 。 因此是类模板 。
(4)要定义类模板的对象 ( 即实例 ), 需要用下列格式
的语句:
类模板名 <类型实际参数表 > 对象名;
【 例 】 定义类模板 ABC,内含成员函数 set和 get。用
ABC生成对象 abc1和 abc2。它们的数组元素数不同,
显示的结果也不同。
# include <iostream.h>
// 定义类模板 ABC
template <class T,int I> class ABC
{ private:
T array [I] ; // 定义数组 array
模板与使用
public:
void set (int x) // 定义成员函数 set
{ int i;
for (i=0; i<I; i++) //循环 I次
array[i]=x+i; //数组元素赋值
}
void get () //定义成员函数 get
{ cout <<"\n 数组元素总数为,"<<I<<endl;
cout <<" array["<<I-1<<"]="<<array[I-1]<<endl; }
};
void main()
{ //由模板 ABC生成对象 abc1
模板与使用
ABC <int,50> abc1;
abc1.set(0); //调用对象 abc1.set
abc1.get(); //调用对象 abc1.get
//由模板 ABC生成对象 abc2
ABC <int,100> abc2;
abc2.set(10); //调用对象 abc2.set
abc2.get(); //调用对象 abc2.get
}
以下是对上例中的成员函数定义体放于类模板外部
定义的示例。
【 例 】 定义模板 ABC,内含成员函数 set和 get。用
ABC生成对象 abc1和 abc2。它们的数组元素数不同,
显示的结果也不同。
模板与使用
#include <iostream.h>
// 定义类模板 ABC
template <class T,int I> class ABC
{ private:
T array [I] ; // 定义数组 array
public:
void set (int x); // 定义成员函数 set
void get () ; //定义成员函数 get
};
template <class T,int i>
void ABC<T,i>,:set (int x) // 定义成员函数 set
{ int i;
模板与使用
for (i=0; i<I; i++) //循环 I次
{ array[i]=x+i; } //数组元素赋值
}
template <class T,int i>
void ABC<T,i>::get()
{ cout <<"\n 数组元素总数为,"<<I<<endl;
cout <<" array["<<I-1<<"]="<<array[I-1]<<endl; }
void main()
{ //由模板 ABC生成对象 abc1
ABC <int,50> abc1;
abc1.set(0); //调用对象 abc1.set
abc1.get(); //调用对象 abc1.get
模板与使用
//由模板 ABC生成对象 abc2
ABC <int,100> abc2;
abc2.set(10); //调用对象 abc2.set
abc2.get(); //调用对象 abc2.get
}
类模板的使用方法可以总结为:
(1) 给出类模板的定义体 。
(2)在适当的位置创建一个类模板的实例, 即一个实
实在在的类定义, 同时创建该模板类的对象 。
(3)有了对象名, 以后的使用就和普通类的对象是一
致的 。
模板与使用
函数模板
函数模板是函数的一种抽象形式 。 由于 C++中的数
据类型很多, 针对某种类型设计的函数显然不能用于
其它类型, 因此对于同一个功能的要求, 不得不编制
多个相似的程序, 比如求两个量中最小值的函数, 相
似的函数可能有:
(1)求两个整型数据的最小值,intmin(int x,int y)
(2)求两个单精度数据的最小值,float min(float x,float y)
(3)求两个双精度数据的最小值,double min(double x,
double y)
为了解决以上的麻烦, C++引入了函数模板的概念 。
函数模板就是用来解决一个模板生成多个函数的问题 。
模板与使用
定义函数模板的格式为:
template <类型形式参数表 >
函数返回值类型名 函数模板名 ( 函数形参及类型 )
{函数体 }
如:两个数最小值的函数模板定义如下:
template <class T> T min( T x,T y)
{ return x<y?x:y; }
有了以上函数模板, 则下列语句都是正确的 。
a=min(20,10);
b=min(-5.43,50.23);
c=min(‘A’,‘a’);
板
模板与使用
模板就是使程序能够对不同类型的数据进行相同
方式的处理 。 C++中的模板分为类模板和函数模板 。
类模板
说明类模板的一般格式为:
template <类型参数表 > class 类模板名
{ private:
私有成员定义
protected:
保护成员定义
public:
公有成员定义 };
模板与使用
其中,(1)类型形式参数表可以包含基本数据类型, 也
可以包含类类型, 如果是类类型, 则须加前缀 class。
当参数有多个时, 需用逗号隔开 。
(2)类模板中的成员函数的定义, 可以放在类模板的定
义体中 ( 此时与类中的成员函数的定义方法一致 ),
也可以放在类模板的外部定义成员函数, 此时成员函
数的定义格式如下:
template <类型形式参数表 >
函数值的返回类型 类模板名 <类型名表 >::成员函
数 ( 形参 ) { 函数体 }
其中:类模板名即是类模板中定义的名称;类型名
表即是类模板定义中的类型形式参数表中的参数名 。
模板与使用
(3)利用类模板定义的只是对类的描述, 它本身还不是
一个实实在在的类 。 因此是类模板 。
(4)要定义类模板的对象 ( 即实例 ), 需要用下列格式
的语句:
类模板名 <类型实际参数表 > 对象名;
【 例 】 定义类模板 ABC,内含成员函数 set和 get。用
ABC生成对象 abc1和 abc2。它们的数组元素数不同,
显示的结果也不同。
# include <iostream.h>
// 定义类模板 ABC
template <class T,int I> class ABC
{ private:
T array [I] ; // 定义数组 array
模板与使用
public:
void set (int x) // 定义成员函数 set
{ int i;
for (i=0; i<I; i++) //循环 I次
array[i]=x+i; //数组元素赋值
}
void get () //定义成员函数 get
{ cout <<"\n 数组元素总数为,"<<I<<endl;
cout <<" array["<<I-1<<"]="<<array[I-1]<<endl; }
};
void main()
{ //由模板 ABC生成对象 abc1
模板与使用
ABC <int,50> abc1;
abc1.set(0); //调用对象 abc1.set
abc1.get(); //调用对象 abc1.get
//由模板 ABC生成对象 abc2
ABC <int,100> abc2;
abc2.set(10); //调用对象 abc2.set
abc2.get(); //调用对象 abc2.get
}
以下是对上例中的成员函数定义体放于类模板外部
定义的示例。
【 例 】 定义模板 ABC,内含成员函数 set和 get。用
ABC生成对象 abc1和 abc2。它们的数组元素数不同,
显示的结果也不同。
模板与使用
#include <iostream.h>
// 定义类模板 ABC
template <class T,int I> class ABC
{ private:
T array [I] ; // 定义数组 array
public:
void set (int x); // 定义成员函数 set
void get () ; //定义成员函数 get
};
template <class T,int i>
void ABC<T,i>,:set (int x) // 定义成员函数 set
{ int i;
模板与使用
for (i=0; i<I; i++) //循环 I次
{ array[i]=x+i; } //数组元素赋值
}
template <class T,int i>
void ABC<T,i>::get()
{ cout <<"\n 数组元素总数为,"<<I<<endl;
cout <<" array["<<I-1<<"]="<<array[I-1]<<endl; }
void main()
{ //由模板 ABC生成对象 abc1
ABC <int,50> abc1;
abc1.set(0); //调用对象 abc1.set
abc1.get(); //调用对象 abc1.get
模板与使用
//由模板 ABC生成对象 abc2
ABC <int,100> abc2;
abc2.set(10); //调用对象 abc2.set
abc2.get(); //调用对象 abc2.get
}
类模板的使用方法可以总结为:
(1) 给出类模板的定义体 。
(2)在适当的位置创建一个类模板的实例, 即一个实
实在在的类定义, 同时创建该模板类的对象 。
(3)有了对象名, 以后的使用就和普通类的对象是一
致的 。
模板与使用
函数模板
函数模板是函数的一种抽象形式 。 由于 C++中的数
据类型很多, 针对某种类型设计的函数显然不能用于
其它类型, 因此对于同一个功能的要求, 不得不编制
多个相似的程序, 比如求两个量中最小值的函数, 相
似的函数可能有:
(1)求两个整型数据的最小值,intmin(int x,int y)
(2)求两个单精度数据的最小值,float min(float x,float y)
(3)求两个双精度数据的最小值,double min(double x,
double y)
为了解决以上的麻烦, C++引入了函数模板的概念 。
函数模板就是用来解决一个模板生成多个函数的问题 。
模板与使用
定义函数模板的格式为:
template <类型形式参数表 >
函数返回值类型名 函数模板名 ( 函数形参及类型 )
{函数体 }
如:两个数最小值的函数模板定义如下:
template <class T> T min( T x,T y)
{ return x<y?x:y; }
有了以上函数模板, 则下列语句都是正确的 。
a=min(20,10);
b=min(-5.43,50.23);
c=min(‘A’,‘a’);