1、类模板
类模板跟函数模板一样,类模板也是对数据的类型进行了参数化处理,
将数据的类型泛华,这样一个函数可以调用不同类型 的数据进行处理,这就是模板的方便之处,不用重复的定义调用不同数据类型的函数,
下面是不用函数模板的代码:
<span style="font-size:18px;">class Stack
{
public:
void push(int i);
int pop();
private:
enum { size = 100 };
int sarray[size];
int scout;
};</span>
这个类只能处理int 类型的整数,不能处理float型 double型,char型的数据,想要处理这些类型的数据,
必须重新定义相应数据的类
如果定义为模板类,这些过程都可以省略
<span style="font-size:18px;">template <typename> T
class Stack
{
public:
void push(int i);
T pop();
private:
enum { size = 100 };
T sarray[size];
int scout;
};</span>
定义一个模板类,这样都可以吹各种类型的数据,提高的效率
2、模板的定义
一个类模板的定义时以关键字template开始的,后面跟一堆尖括号,括号内容是模板的参数列表
语法:
template<typename T ,typename T1....................>
class 类模板名
{
}
注意当在类外定义成员函数时,成员函数的上面得写类模板的表达式
stack<T> 表示一个容器,存储的数据类型是T型
<span style="font-size:18px;">template <typename> T
class Stack
{
public:
void push(int i);
T pop();
private:
enum { size = 100 };
T sarray[size];
int scout;
};
template <typename T>
T stack<T>::pop()
{
return sarray[];
}</span>
stack<class T,int size=100>
模板的范例:
#include<cstdlib>
#include<iostream>
using namespace std;
template<typename T,int size=100>
class Stack
{
public:
Stack() :sicout(0){}
bool push(constT &i);
bool pop(T &i);
int get_size() const
{
return sicout;
}
private:
T s_iarray[size];
int sicout;
};
template<typename T,int size>
bool Stack<T, size>::push(const T &i)
{
if (sicout < size)
{
s_iarray[sicout++] = i;
return true;
}
else
{
return false;
}
}
template<typename T,int size>
bool Stack<T, size>::pop(T &i)
{
if (sicout >= 0)
{
i = s_iarray[--sicout];
return true;
}
else
{
return false;
}
}
int main()
{
cout << "模板" < endl;
Stack<int>iv;
iv.push(1);
cout << "压入1" << endl;
iv.push(2); cout << "压入2" << endl;
iv.push(3); cout << "压入3" << endl;
cout << "元素个数" << endl;
cout << iv.get_size() << endl;
cout << "单出元素" << endl;
int e = 0;
iv.pop(e);
cout << e << endl;
system("pause");
return 0;
}
3、模板函数中的非参数类型