外链网站推荐,百度搜索推广产品,凡科网站建设教程,做手机网站模板是泛型编程的基础#xff0c;即与类型无关的逻辑代码。
利用模板机制可以显著减少冗余信息#xff0c;能大幅度地节约程序代码#xff0c;进一步提高面向对象程序的可重用性和可维护性。
模板是实现代码重用机制的一种工具#xff0c;它可以实现类型参数化#xff1b;…模板是泛型编程的基础即与类型无关的逻辑代码。
利用模板机制可以显著减少冗余信息能大幅度地节约程序代码进一步提高面向对象程序的可重用性和可维护性。
模板是实现代码重用机制的一种工具它可以实现类型参数化
模板分为函数模板和类模板。
为了使用函数名相同参数不同返回值可同可不同的函数时我们起初用了重载的方式。
#includeiostream
using namespace std;int add(int a,int b)
{return ab;
}double add(double a,double b)
{return ab;
}int main()
{coutret1add(1,2)endl;coutret2add(2.3,3.0)endl;getchar();return 0;
}但是运用重载的方式写起来比较不方便尤其是重载的函数较多时为了解决这类问题我们用函数模板来实现这种功能。
#includeiostream
using namespace std;
template class T
T add(const T a,const T b)
{couttype:typeid(a).name()endl; //显示类型return ab;
}int main()
{coutret1add(1,2)endl;//还可以显示实例化显示指定T为int即addint(1,2)coutret2add(2.3,3.0)endl; //adddouble(2.3,3.0)getchar();return 0;
}以上函数中函数参数类型都是相同的当我们遇到形如add(1,2.3);一个参数为int一个参数为double型此时我们可以这样定义
template class T1,class T2
T add(const T1 a,const T2 b)
{return ab;
}
当然肯定有人会想模板函数可以构成重载吗 答案是肯定的。
#includeiostream
using namespace std;int add(int a,int b)
{return ab;
}double add(double a,double b)
{return ab;
}
template class T
T add(const T a,const T b)
{couttype:typeid(a).name()endl; return ab;
}int main()
{coutret1add(1,2)endl;coutret2add(2.3,3.0)endl;getchar();return 0;
}
当模板构成重载调用add的函数时它会先调用非模板类的函数性能比较高而模板函数内部还得调用有推演过程判断它是什么类型效率上会有所降低。2.模板类
对于普通函数来说,我们拿typedef重定义一个类型当需要改的时候需要将int改掉就可以了
typedef int DataType;class SEQLIST
{
private:DataType *data;
};
而我们为了适应更多的类型于是引入了模板类我们这样定义体现了其高度复用的优势
templateclass T
class SeqList
{
private:T* data;
};
写一个模板类实现SeqList的动态顺序表吧
#includeiostream
using namespace std;template class T
class SeqList
{
public:SeqList():_data(NULL),_size(0),_capacity(0){}SeqList(const SeqListT s);SeqListT operator(const SeqListT s);~SeqList(){if(_data ! NULL){delete[] _data;}}void CheckCapacity();void PushBack(const T d);void PopBack();void PushFront(const T d);void PopFront();void Print();
private:T *_data;int _size;int _capacity;
};
template class T
SeqListT::SeqList(const SeqListT s)
{_data new T[s._size*sizeof(T)];int i 0;for(i 0;i s._size; i){_data[i] s._data[i];}_size s._size;_capacity s._capacity;
}
template class T
SeqListT SeqListT::operator(const SeqListT s)
{int i 0;if(this s){return *this;}_size s._size;_capacity s._capacity;delete _data;_data new T[_capacity];for(i 0; i _size; i){_data[i] s._data[i];}return *this;
}
template class T
void SeqListT::CheckCapacity()
{if(_size _capacity){T* tmp new T[_capacity*23];//memcpy(tmp,_data,_size*sizeof(T));int i 0;for(i 0; i _size; i){tmp[i] _data[i];}delete[] _data;_data tmp;_capacity _capacity*23;}
}
template class T
void SeqListT::PushBack(const T d)
{CheckCapacity();_data[_size] d;_size;
}
template class T
void SeqListT::PopBack()
{CheckCapacity();_size--;
}template class T
void SeqListT::PushFront(const T d)
{int i ;CheckCapacity(); for(i _size; i 0; i--){_data[i] _data[i-1];}_data[0] d;_size;
}template class T
void SeqListT::PopFront()
{int i;CheckCapacity();for(i 0; i _size; i){_data[i] _data[i1];}_size--;
}
template class T
void SeqListT::Print()
{int i 0;for(i 0; i _size; i){cout_data[i] ;}coutendl;
}int main()
{SeqListint seq;SeqListint seq1;coutseq:endl;cout尾插1234endl;seq.PushBack(1);seq.PushBack(2);seq.PushBack(3);seq.PushBack(4);seq.Print();cout尾删endl;seq.PopBack();seq.Print();cout头删endl;seq.PopFront();seq.Print();coutseq2:endl;SeqListint seq2(seq);seq2.Print();cout头插567endl;seq.PushFront(5);seq.PushFront(6);seq.PushFront(7);seq.Print();seq1 seq;coutseq1:endl;seq1.Print();getchar();return 0;
}模板就说到这里啦有好的建议还希望大家提出来欢迎来访哦。