类模板

-----------------siwuxie095

   

   

   

   

   

   

   

类模板

   

   

在 C++ 中,类也有模板,称之为 类模板

   

为什么要有类模板呢?和函数模板的道理一样,是因为在很多使用

场合下,一个类会用到很多次,而在使用过程中发现很多重复的地

方只有它的数据类型不同,这时就要用到 类模板

   

在定义时,需要 template 关键字,以及 typenameclass 作为

定义数据类型参数的关键字

   

   

看如下实例:

   

定义一个数组类:MyArray

   

   

   

在类中,用 T 数据类型定义了一个数据成员的指针和一个成员函数

   

注意:成员函数的定义是写在类内的,在类模板的情况下,于类内

定义一个成员函数,和普通情况下并没有什么不同

   

   

   

但是,在类外定义一个成员函数时,则大不相同:

   

   

   

需要在成员函数的上方,先把 template<class T> 写出来,其写法和

在类上方的一样

   

每在类外定义一个成员函数,都要在它的上方加这么一行代码,同时

需要在类名后面用尖括号括起来,将相应的参数写下来,如果有两个

参数, 需要用逗号隔开

   

   

   

在使用时:

   

   

   

如果要实例化一个对象,则需要在类名后面用尖括号括起来,写入

当前对象的数据类型,如:MyArray<int> arr;,则类模板中的 T

全部替换为 int

   

与函数模板一样,类模板本身并不会产生任何实质性的代码,

只有当实例化一个对象时,在类后面的尖括号中写上一个固

定的参数,这时才会产生出一套代码,称这套代码为 模板类

   

   

   

类模板中多个参数的使用情况,如下:

   

   

   

这里的模板参数比较复杂,既有类型参数,也有变量参数

   

   

   

在实现时:

   

   

   

如果成员函数是在类内定义,和普通的定义没什么两样。如果成员

函数是在类外定义,需要强调的是:在每一个成员函数的上方都要

写上 template<typename T,int KSize>,同时,需要在类名后的

尖括号中写入参数列表

   

   

   

在使用时:

   

   

   

在实例化一个对象时,同样要给定两个参数,一个参数是类型,

另一个参数是常数

   

之后,对象就可以调用 display(),使得当前传入的两个参数

起到应有的效果

   

   

   

特别提醒:在 C++ 中,因为 IDE 环境 以及符合标准等一系列问题,

使得 vs2005、vs2008、vs2010 都无法让模板的 .h 文件 与模板的

.cpp 文件分开进行编译,即 无法写成 .h 文件 和 .cpp 文件的声明

和定义分开的这种情况,必须将所有的代码都写在 .h 文件中,才能

编译通过

   

   

   

   

   

   

   

程序:

   

MyArray.h:

   

#ifndef MYARRAY_H

#define MYARRAY_H

   

#include <iostream>

using namespace std;

   

//注意必须将类的声明和定义写在同一个.h文件中 未来把它包含进来

//写上关键字template 和模板参数列表

template<typename T,int KSize,int KVal>

class MyArray

{

public:

MyArray();

   

//当在类内定义时,不需要去注意什么

~MyArray()

{

delete[]m_pArr;

m_pArr = NULL;

}

void display();

private:

   

//在定义数据成员时往往也要用到模板中的参数 这里是T

//未来把T这种类型定义为什么 那么就可以定义出一个什么类型的指针

T *m_pArr;

};

   

   

//当在类外定义函数时都要在前面加上这一行代码

// 同时在类名后方用尖括号括起来将相应的参数写下来 此时参数前面没有任何内容

template<typename T, int KSize, int KVal>

MyArray<T, KSize, KVal>::MyArray()

{

m_pArr = new T[KSize];

for (int i = 0; i < KSize;i++)

{

m_pArr[i] = KVal;

}

}

   

//template<typename T, int KSize, int KVal>

//MyArray<T, KSize, KVal>::~MyArray()

//{

// delete[]m_pArr;

// m_pArr = NULL;

//}

   

   

template<typename T, int KSize, int KVal>

void MyArray<T, KSize, KVal>::display()

{

for (int i = 0; i < KSize;i++)

{

cout << m_pArr[i]<<endl;

}

}

   

#endif

   

   

   

main.cpp:

   

#include "stdlib.h"

#include "MyArray.h"

   

int main(void)

{

//当实例化时要用尖括号写出当前对象的数据类型

//同时在类中的相应位置就发生了变化 类模板实例化为一个模板类

MyArray<int, 5, 9> arr;

arr.display();

system("pause");

return 0;

}

   

//与函数模板一样 类模板本身并不会产生实质性的代码

//只有当我们去实例化一个对象时将类的后边写上一个固定的参数

//这时才会产生出一套代码 这套代码称之为模板类

//

//模板 代码不能分离编译 因为IDE环境的原因 无法使模板的 .h文件

//与模板的 .cpp文件分开进行编译

//即无法写成 .h文件和.cpp文件 声明和定义分开这种情况

//

//必须将所有代码都写在.h文件中 使用时一起通过include把整个的代码

//全部包含进去 只有这样编译才会通过

   

   

   

   

   

   

   

   

【made by siwuxie095】

原文地址:https://www.cnblogs.com/siwuxie095/p/6817466.html