CPP_类模板与模板类

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

类模板与模板类

1 模板类的使用

#include 
using namespace std;

template 
class Test
{
private:
    T _t;
public:
    Test(T t);
    void my_echo();
};

template  Test::Test(T t):_t(t)//在实现成员函数时做参数化列表赋值
{
    cout<<"_t="<<_t< 
   

2 类模板与模板类的概念

⑴什么是类模板

一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。
  如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。

⑵类模板定义

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

A. 首先要定义类

其格式为:
template 
class foo
{
……
}

foo 为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:
template
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
void Test::print(){
    std::cout<<"n="<template
Test::Test(T k):i(k){n=k;cnt++;}
template
T Test::operator+(T x)
{
     return n + x;
}

C. 在类定义体外初始化const成员和static成员变量

在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明
例如

template
int Test::cnt=0;
template
Test::Test(T k):i(k){n=k;cnt++;}

D. 类模板的使用

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

模板类是类模板实例化后的一个产物。说个形象点的例子吧。我把类模板比作一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做豆沙饼干,这些饼干的除了材料不一样外,其他的东西都是一样的了。

3 类模板的派生

  可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。派生方法:

⑴ 从类模板派生类模板可以从类模板派生出新的类模板

它的派生格式如下例所示:
template 
class base
{
……
};
 
template 
class derive:public base
{
……
};

与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base

类模板派生非模板类

从类模板派生非模板类  可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template。例如:

template 
class base
{
……
};
 
class derive:public base
{
……
};

在定义derive类时,base已实例化成了int型的模板类。

转载于:https://my.oschina.net/crooner/blog/147396

你可能感兴趣的:(CPP_类模板与模板类)