概念
模板指C++程序设计设计语言中采用类型作为参数的程序设计,支持通用程序设计。模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
模板是一种对类型进行参数化的工具;
通常有两种形式:函数模板和类模板;
函数模板 针对仅参数类型不同的函数;
类模板 针对仅数据成员和成员函数类型不同的类。
1.函数模板
template <class 形参名,class 形参名,......>
返回类型 函数名(参数列表)
{
函数体
}
其中template和class是关键字,class可以用typename 关键字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为:
template <class T> void swap(T& a, T& b){}
当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中c和d是double类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。
2.类模板
template<class 形参名,class 形参名,…>
class 类名{ ... };
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。比如
template<class T> class A{
public:
T a;
T b;
T qzj(T c, T &d);
};
在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数qzj。
模板特化
1.模板函数特化
使用模板时会遇到一些特殊的类型需要特殊处理,不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数。当使用一个判断相等的模板函数时,如下:
template<class T>
bool Isequal(T& p1, T& p2){
return p1 == p2;
}
该模板函数在对于字符串进行比较时就不能使用了,对于字符串我们不能直接比较,因此直接特化出一个专门供字符串使用的模板参数:
template<>
bool Isequal<char*>(char*& p1, char*& p2){
return strcmp(p1, p2) == 0;
}
2.模板成员函数特化
3.模板类特化
类的模板特化分为两种,一种是全特化,一种为偏特化
全特化: 即将所有的模板类型都进行特化
template <class T1, class T2>
class Test{
}
template <>
class Test<int , char>{
}
偏特化:对于模板的类型做一些限制
偏特化份为两种 一种是部分特化,一种是对于模板类型的进一步限制
部分特化:就是只对函数模板的一部分模板类型进行特化
template <class T1, class T2>
class Test2{
}
template <class T1>
class Test2<T1 , char>{
}
对模板类型限制,主要的类型基础不变
template <class T1, class T2>
class Test2{
}
template <class T1 , class T2 >
class Test2<T1* , T2*>{
}
模板类AutoPtr
构造函数
C++中的类需要定义与类名相同的特殊成员函数时,这种与类名相同的成员函数叫做构造函数;
构造函数可以在定义的时候有参数;
构造函数没有任何返回类型。
构造函数的调用: 一般情况下,C++编译器会自动的调用构造函数。特殊情况下,需要手工的调用构造函数。
class Test{
public:
Test() {
}
}
析构函数
C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数是析构函数;
析构函数没有参数和没有任何返回类型;
析构函数在对象销毁的时候自动调用;
析构函数调用机制: C++编译器自动调用。
class Test{
~Test(){
}
}