C++类模板

类模板

C++的类模板为生成通用的类声明提供了一种很好的方法。模板提供参数化类型,即能够将类型名作为参数传递给接收方来建立类或函数。例如,将类型名int,传递给AA模板,可以让编译器构造一个对int进行处理的AA类。

定义类模板

正常定义一个处理int类型的类如下:

class AA
 {
 public:
     AA(){}
     ~AA(){ }

     void print(const int &i);
};

采用模板时,将使用模板定义代码开头,一般为template<class T>。关键字template告诉编译器,将要定义一个模板。尖括号的内容相当于函数参数列表。可以把关键字class看作变量的类型名,该变量接受类型作为其值,把T看作该变量的名称。
这里使用class并不意味这T必须是一个类;而是表明T是一个通用的类型说明符,在使用模板时,将使用实际的类型代替它。也可使用关键字typename代替class,template<typename T>。
使用时每个模板成员函数都将以相同的模板前缀打头,还需将类限定符加上类型参数(如果在类内定义函数,可以省略模板前缀和类限定符)。例如:
  void AA::print(const int &i){}
应改为
  template<class T>
  void AA<class T>::print(const T &i){}
要明确一点,这些模板并不是类和成员函数的定义,模板只是说明如何生成类和成员函数。模板的具体实现-如用来处理int类型的类,被称为实例化。不能将模板成员函数放在独立的实现文件中。由于模板不是函数,它们不能单独编译。模板必须与特定的模板实例化请求一起使用。为此,最简单的方法是将所有模板信息放在一个头文件中,并在要使用这些模板的文件中包含改头文件,如下

#pragma once

//类模板
template<class T>
class AA
{
public:
    AA() {}
    ~AA(){  }

    void print(const T &i);
};

template<class T>
void AA<T>::print(const T &i)
{
    cout << "print" << endl;
}

使用类模板

仅在程序中包含类模板并不能生成模板类,必须请求实例化。为此,需要声明一个类型为模板类的对象,方法是使用所需的具体类型替换泛型名。例如创建两个对象,一个用于存储int,另一个用于存储double
  AA<int> a1;
  AA<double> a2;
看到上述声明后,编译器将按AA<T>模板来生成两个独立的类声明和两组独立的类方法。类声明AA将使用int代替模板中所有的T,而类声明AA<double>将使用double代替模板中所有的T。
泛型标识符-例如这里的T称为类型参数,这意味着它们类似于变量,但是赋给它们的不能是数字,只能是类型。注意,必须显示提供所需的类型,这与常规函数模板是不同的。

类模板和模板类

类模板:是一个通用的类,其数据成员类型,函数类型不是固定的,用一个参数表示类型,就是上述生成类的方案,一般以template开头。
模板类:是类模板指定了具体类型后生成的类,是实例化后的产物,例如定义个具体类型模板类对象AA<int> a。

模板实例化

隐式实例化: 即声明一个或多个对象,指出所需的类型,而编译器使用通用模板提供的处方生成具体的类定义。
  AA<int> a1;//隐式实例化
编译器在需要对象前,不会生成类的隐式实例化:
  AA<int> *a;//指针 并没有指向具体对象,不会实例化
  a = new AA<int>;//创建具体对象,实例化。
第二条语句导致编译器生成类的定义,并根据该定义创建一个对象。

显示实例化:使用关键字template并指出所需类型来声明类时,编译器将生成类声明的显示实例化。声明必须位于模板定义所在的名称空间中。下面声明将AA<double>定义为一个类:
template class AA<double>;
这种情况下,虽然没有创建或提及类对象,编译器也将生成类定义。和隐式实例化一样,也将根据通用类模板来生产实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值