一、类模板的定义格式
定义(实现)模板类要放在头文件里
三、模板也可以有模板参数,例如
在普通类前添加
template <class Type>
class class_name{}
//或者
template <typename Type>
class class_name{}
template <typename Type1,typename Type2>
class class_name{};
定义类模板代码:
#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
template <typename Type>
class MyStack
{
public:
MyStack();
bool isEmpty();
bool ifFull();
bool Push(const Type& item);//压入栈
bool Pop();//移除栈顶元素
Type& Top();
virtual ~MyStack();
private:
int top;//栈顶的索引
enum {MAX=10};//类似于static常量
Type items[MAX];//保存栈元素
};
template <typename Type>
//注意,一定要加上Type
MyStack<Type>::MyStack() : top(0){}
template <typename Type>
bool MyStack<Type>::isEmpty()
{
return top==0;
}
template <typename Type>
bool MyStack<Type>::ifFull()
{
return top==MAX;
}
template <typename Type>
bool MyStack<Type>::Push(const Type& item)
{
if(top<MAX)
{
items[top++] = item;
return true;
}
return false;
}
template <typename Type>
bool MyStack<Type>::Pop()
{
if(top>0)
{
top--;
return true;
}
return false;
}
template <typename Type>
Type& MyStack<Type>::Top()
{
return items[top-1];
}
template <typename Type>
MyStack<Type>::~MyStack()
{
delete[] items;
}
#endif // MYSTACK_H
二、使用模板类
定义(实现)模板类要放在头文件里
#include <iostream>
#include "MyStack.h"
#include <string>
using namespace std;
int main()
{
MyStack<int> TestMystack;
TestMystack.Push(2);
TestMystack.Push(3);
TestMystack.Push(4);
TestMystack.Push(5);
TestMystack.Push(6);
TestMystack.Push(7);
//cout<<TestMystack.isEmpty()<<endl;
cout<<TestMystack.Top()<<endl;
TestMystack.Pop();
cout<<TestMystack.Top()<<endl;
TestMystack.Pop();
cout<<TestMystack.Top()<<endl;
return 0;
}
三、模板也可以有模板参数,例如
template <typename Type,int n>
- 模板参数可以有默认值
- 模板参数称为非类型参数(non-type)或表达式参数
- 表达式参数的限制:
- 表达式参数可以是整型,枚举,引用,或者指针
- 即double 类型的是错误的,但是double * p类型的是可以的
- 模板不能修改表达式参数的值,也不能使用参数的地址 ,即不能使用&n,n++之类的语句
- 实例化模板时,表达式参数必须是常量
#ifndef MYARRAY_H
#define MYARRAY_H
//自定义一个动态数组
//数组的属性有数组的大小
template <typename type,int n>
class MyArray
{
public:
MyArray() {};
explicit MyArray(const type& v);
type & operator[](int i);
virtual ~MyArray();
private:
type arr[n];
};
template <typename type,int n>
MyArray<type,n>::MyArray(const type& v)
{
for(int i = 0;i<n;i++)
{
arr[i] = v;//需要重载[]运算符
}
}
template <typename type,int n>
type& MyArray<type,n>::operator[](int i)
{
return arr[i];
}
template <typename type,int n>
MyArray<type,n>::~MyArray()
{
delete[] arr;
}
#endif // MYARRAY_H
#include <iostream>
#include "myarray.h"
using namespace std;
int main()
{
//初始化表达式参数是5,即数组容量是5,每个值是2(构造函数)
MyArray<double,5> test(2);
for(int i = 0;i<5;i++)
cout<<test[i]<<endl;
return 0;
}
四、递归使用模板
template<template<typename,argv>,argv>
多个类型参数
MyArray<MyArray<int,5>,3> test2;
五、默认类型模板参数
template<typename t1,typename t2=int>
class test{};
在调用的时候,省略t2的值是可以的