目录
一.类模板的作用
二.类模板的定义:
三.类模板的声明格式:
四.类模板对象
五.再举一个例子
一.类模板的作用
面向对象的程序设计编程实践中,我们可能会面临这样的问题:要实现比较两个数的大小。明明比较两个数的方法都一样,但是仅仅因为数据类型的不同,导致想要实现同一目标,我们就需要写好多个只有数据类型不同、其他内容都相同的类。这无疑是费时耗力、臃肿繁琐的。
在C++中,为了解决这样的问题,引入了类模板的概念。就像泥塑的胚子一样,每次注入石膏陶土,最后都会按照要求变成外形相同的泥塑。类模板就是这样的一个胚子,数据类型就是注入的原料。
因此,对于数据的处理方式相同、仅因为数据类型不同而定义不同的类时,我们使用类模板来简化我们的代码。
二.类模板的定义:
将数据类型抽象出来而形成的操作集。
类模板使用户可以为类定义一种模式,使得类中的某些数据成员、成员函数的参数和返回值能去的任意的数据类型。
三.类模板的声明格式:
template <参数>// template 定义类模板的关键字
//模板以关键字template和一个形参表开头
class 类名
{
……;
};
举个例子:
下面代码实现的是输入两个数,寻找最大数和最小数
#include <iostream>
using namespace std;
template <class temp>
class compare
{
public:
compare(temp a,temp b)
{
this->x = a;
this->y = b;
}
temp max(){ return x > y ? x : y; }
temp min() { return x > y ? y : x; }
private:
temp x; temp y;
};
int main()
{
/*write your code here*/
return 0;
}
将函数放在类体外定义:
一般格式为:
template <模板参数>
class 类名
{
……;
}
template <模板参数>
inline 返回值类型 类名 <模板类型参数>::成员函数名(形参表)
{函数体}
重点注意:在类体外面定义成员函数时,必须用template重写类模板声明!!!
不重新声明就会报错:
正确代码:
#include <iostream>
using namespace std;
template <class temp>
class compare
{
public:
compare(temp a, temp b)
{
this->x = a;
this->y = b;
}
temp max();
temp min();
private:
temp x; temp y;
};
template <class temp>
inline temp compare<temp>::max()//不重新声明就会报错
{
return x > y ? x : y;
}
template <class temp>
inline temp compare<temp>::min()//不重新声明就会报错
{
return x > y ? y : x;
}
int main()
{
/*write your code here*/
return 0;
}
结构图:
四.类模板对象
类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象之后才能使用。
初始化类模板时,只要传给它指定的数据类型(如int float double等),编译器就用指定的类型来代替末班参数产生相应的模板类。
用类模板定义对象的一般格式:
类名<模板实例化参数类型>对象名(构造函数实参列表)
或者:
类名<模板实例化参数类型>对象名
#include <iostream>
using namespace std;
template <class temp>
class compare
{
public:
compare(temp a, temp b)
{
this->x = a;
this->y = b;
}
temp max();
temp min();
private:
temp x; temp y;
};
template <class temp>
inline temp compare<temp>::max()//不重新声明就会报错
{
return x > y ? x : y;
}
template <class temp>
inline temp compare<temp>::min()//不重新声明就会报错
{
return x > y ? y : x;
}
int main()
{
compare<int>INT(2, 3);
cout << INT.max() << endl;//3
cout << INT.min() << endl;//2
compare<double>DOUBLE(2.2, 3.3);
cout << DOUBLE.max() << endl;//3.3
cout << DOUBLE.min() << endl;//2.2
return 0;
}
五.再举一个例子
本代码实现的是坐标的输入与输出。
#include <iostream>
using namespace std;
template<class temp>
class point
{
private:
temp x;
temp y;
public:
point (temp a=0,temp b=0):x(a),y(b){}
void setxy(temp, temp);
void showxy()
{
cout << x << "," << y << endl;
}
temp getx() { return x; }
temp gety() {return y; }
};
template<class temp>
inline void point<temp>::setxy(temp a, temp b)
{
this->x = a;
this->y = b;
}
int main()
{
point<int>a(3, 4);
a.showxy();
point<float>b(1.2, 3.4);
b.showxy();
return 0;
}