设为首页 加入收藏

TOP

C++ 类模板和模板类的深入解析(一)
2014-07-19 23:04:03 来源: 作者: 【 】 浏览:140
Tags:  模板 深入 解析

  1、在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?

  答:class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了:      template<typename T>.在模板定义语法中关键字class与typename的作用完全一样。

  2.类模板与模板类的概念

  (1) 什么是类模板

  一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

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

  (2)类模板定义

  定义一个类模板,一般有两方面的内容:

  A.首先要定义类,其格式为:

  template <class T>

  class foo

  {

  ……

  }

  foo 为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:

  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);

  };

  B. 在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明

  例如

  template<classT>

  voidTest<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++;}

   

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言接口与实现实例 下一篇基于ACE的定时器模板类

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)
·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)