- (一)C++类模板与模板类:
(1)类模板的定义:
1)关键在于模板,所谓模板,就是可以产生多个实例,所以类模板为多个类。
2)类中的数据成员类型,或成员函数的参数类型,返回值类型不定。
(2)类模板的范例:
template <class T>
class Test{
private:
T n;
const T i;
static T cnt;
public:
Test():i(0){}
Test(T k);
~Test(){}
void print();
T operator+(T x);
};
使用这个Vector模板就可以产生很多的class(类),Vector <int> 、Vector <char> 、Vector < Vector <int> > 、Vector <Shape*> ……。
(3)类模板的通用数据成员,通用成员函数类外声明:
B. 在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明
例如
template<class T>
void Test<T>::print(){
std::cout<<"n="<<n<<std::endl;
std::cout<<"i="<<i<<std::endl;
std::cout<<"cnt="<<cnt<<std::endl;
}
如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T x){
return n + x;
}
C. 在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
(4)模板类:
关键在于类,是类模板中参数实例化后产生的一个类。
如:Vector <int> 、Vector <char> 、……全是模板类。
----------------------------------------------
(二)C++的函数模板与模板函数:
(1)函数模板:
函数模板的重点是模板。表示的是一个模板,专门用来生产函数,可以产生多个函数。
(2)函数模板的范例:
template <class T>
//或写成: template <typename T> 函数参数的类型T
T abs(T val)
{
return val<0 ? -val : val;
}
在运用的时候,可以显式(explicitly)生产模板函数,fun <int> 、fun <double> 、fun <Shape*> ……。
也可以在使用的过程中由编译器进行模板参数推导,帮你隐式(implicitly)生成。
fun(6);//隐式生成fun <int>
fun(8.9);//隐式生成fun <double>
fun(‘a’);// 隐式生成fun <char>
Shape* ps = new Cirlcle;
fun(ps);//隐式生成fun <Shape*>
(3)模板函数:
模板函数的重点是函数。表示的是由一个模板生成而来的函数。
类模板与模板类 &&函数模板与模板函数
最新推荐文章于 2020-08-04 22:03:00 发布