C++类模板和模板类
类模板
所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表。使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。
定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下:
template <typename 类型参数>
class 类名{
类成员声明
};
或者
template <class 类型参数>
class 类名{
类成员声明
};
(1)template:是一个声明模板的关键字,它表明声明一个模板
(2)类型参数:通常用C++标识符表示,如T、Type等,实际上是一个虚拟的类型名,现在未指定它是哪一种具体的类型,但使用类模板时,必须将类型参数实例化。
(3)typename和class的作用相同,都是表示其后面的参数是一个虚拟的类名(即类型参数).
在类声明中,欲采用通用数据类型的数据成员、成员函数的参数或返回类型前面需要加上类型参数。
如建立一个用来实现求两个数最大值的类模板
template<typename T> //模板声明,其中T为类型参数
class Compare{
public:
Compare(T i,T j)
{
x = i;
y = j;
}
T max()
{
return (x>y)?x:y;
}
private:
T x,y;
};
用类模板定义对象时,形式为:
类模板名<实际类型名>对象名[(实参表列)];举例如下:
#include <iostream>
using namespace std;
template<typename T>
class compare{
public:
compare(T i, T j)
{
x=i;y=j;
}
T max(){
return (x>y)?x:y;
}
private:
T x,y;
};
int main()
{
compare<int>com1(3,2);
compare<double>com2(12.34,56.78);
compare<char>com3('a','x');
cout<<"1 "<<com1.max()<<endl;
cout<<"2 "<<com2.max()<<endl;
cout<<"3 "<<com3.max()<<endl;
return 0;
}
类模板中的成员函数,可以在类模板外定义,如果成员函数中有参数类型存在,那么:
- 需要在成员函数定义前进行模板声明
- 在成员函数名前加上 类名<类型参数>
举例如下:
template<typename 类型参数>
函数类型 类名<类型参数>::成员函数名(形参表)
{
函数内容;
}
具体如下:
#include <iostream>
using namespace std;
template<typename T>
class compare{
public:
compare(T i, T j)
{
x=i;y=j;
}
T max();
private:
T x,y;
};
template <class T>
T compare<T>::max()
{
return (x>y)?x:y;
}
int main()
{
compare<int>com1(3,2);
compare<double>com2(12.34,56.78);
compare<char>com3('a','x');
cout<<"1 "<<com1.max()<<endl;
cout<<"2 "<<com2.max()<<endl;
cout<<"3 "<<com3.max()<<endl;
return 0;
}
当有多个参数时,举例如下:
#include <iostream>
using namespace std;
template<typename QQ, typename T>
class Myclass{
public:
Myclass(QQ a ,T b);
void show();
private:
QQ x;
T y;
};
template <typename QQ, typename T>
Myclass<QQ,T>::Myclass(QQ a, T b)
{
x=a;
y=b;
}
template <typename QQ, typename T>
void Myclass<QQ,T>::show()
{
cout<<"x= "<<x<<" y= "<<y<<endl;
}
int main()
{
Myclass<int ,double>m1(20,0.25);
Myclass<int,char*>m2(20,"test.");
m1.show();
m2.show();
return 0;
}