模板类,通用类型名与非类型参数

C++中有一系列用来存储和修改变量的类,用来实现栈和队列等数据结构,但若是每次遇到一种变量类型就要重写一个存储该类型的stack类未免太麻烦,为了解决这个问题,就需要使用模板类。

例:用模板类实现的一个简单stack类

template <class Type>
class Stack{
private:
       Type items[10];
       int top;
public:
       Stack();
       bool push(const Type& item);
       bool pop(const Type& item);
       bool isfull();
};

template<class Type>
Stack<Type>::Stack(){
       top=-1;
}

template<class Type>
bool Stack<Type>::push(const Type& item){
       if(top<9){
              items[++top]=item;
              return true;
       }
       else{return false;}
}

template<class Type>
bool Stack<Type>::pop(const Type& item){
       if(top>0){
              item=items[top--];
              return true;
       }
       else{return false;}
}

template<class Type>
bool Stack<Type>::isfull(){
       if(top==9)return true;
       else return false;
}
若要声明一个栈实例,语法如下:
Stack<int> intstack;
Stack<double> doublestack;
Stack<string> stringstack;



模板类还能用于动态定义数组长度,用模板参数来提供常规数组的大小,举例如下:

template<class Type,int n>  //n为一个非类型参数,或称为表达式参数
class Stack{
private:
       Type items[n];
       int top;
public:
       bool isfull;
       bool push(const Type& item);
       bool pop(const Type& item);
};

......

若要声明一个栈实例,语法如下:

Stack<int,10> intstack;

Stack<double,20> doublestack;


非类型参数还有一些限制,总结如下:

①非类型参数只能为整型,枚举类型,引用或指针。因此template<class Type,double n>是不合法的,但template<class Type,double *p>是合法的。

②模板代码中不能修改非类型参数的值,也不能使用其地址,所以n++,&n等操作是不合法的。这也造成了模板类创建数组的一大缺点,数组创建后无法动态改变大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值