C++ 类模板与模板类详解

在C++的Template中不少地方都用到了typename与class这两个关键字,有时候这二者能够替换,那么这两个关键字是否彻底同样呢?c++

  事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字代表T是一个类型,后来为了不class在这两个地方的使用可能给人带来混淆,因此引入了typename这个关键字,它的做用同class同样代表后面的符号为一个类型,这样在定义模板的时候可使用下面的方式了:函数

  template<typename T>.在模板定义语法中关键字class与typename的做用彻底同样模板

 

区分类模板与模板类的概念class

  一个类模板(类生成类)容许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,可以取任意类型(包括系统预约义的和用户自定义的)。test

  若是一个类中的数据成员的数据类型不能肯定,或者是某个成员函数的参数或返回值的类型不能肯定,就必须将此类声明为模板,它的存在不是表明一个具体的、实际的类,而是表明一类类。变量

  类模板定义:数据类型

定义一个类模板,通常有两方面的内容:语法

A。首先要定义一个类,其格式为:方法

template<class T>im

class test

{

....

}

test为类名,在类定义体中,若是采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T能够做为普通成员变量的类型。还能够做为成员函数的参数和返回类型等。

例如:

复制代码

1 template<class T>
 2 
 3 class Test
 4 {
 5 private:
 6     T n;
 7     const T i;
 8 public:
 9     Test():i(0) {}
10     Test(T k);
11     ~Test(){}
12 
13     void print();
14     T operator+(T x);
15 };

复制代码

若是在类外定义成员函数,若此成员函数中有模板参数存在,则除了须要和通常类的类外定义成员函数同样的定义外,还须要在函数外进行模板声明
例如:

1 template<class T>
2 void Test<T>::print()
3 {
4     std::cout<<"n="<<n<<std::endl;
5     std::cout<<"i="<<i<<std::endl;
6 }

复制代码

1 template<class T>
2 Test<T>::Test(T k):i(k){ n=k;}
3 
4 template<class T>
5 T Test<T>::operator+(T x){
6     return n + x;
7 }

复制代码

 

关于类模板的使用:类模板的使用其实是将类模板实例化成一个具体的类,它的格式为:类名<实际的类型>

模板类是类模板实例化后的一个产物,说个具体点的例子吧,咱们把类模板比做是一个作饼干的模子,而模板类就是用这个模子作出来的饼干,至于这个饼干是什么味道的就要看你本身在实例化时用的是什么材料了,你能够作巧克力饼干,也能够作牛奶饼干,这些饼干出了材料不同外,其它的东西都是同样的了。

相关文章
相关标签/搜索