-----------------siwuxie095
类模板
在 C++ 中,类也有模板,称之为类模板
为什么要有类模板呢?和函数模板的道理一样,是因为在很多使用
场合下,一个类会用到很多次,而在使用过程中发现很多重复的地
方只有它的数据类型不同,这时就要用到类模板
在定义时,需要template 关键字,以及 typename 和 class 作为
定义数据类型参数的关键字
看如下实例:
定义一个数组类: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");
return0;
}
//与函数模板一样类模板本身并不会产生实质性的代码
//只有当我们去实例化一个对象时将类的后边写上一个固定的参数
//这时才会产生出一套代码这套代码称之为模板类
//
//模板代码不能分离编译因为IDE环境的原因无法使模板的 .h文件
//与模板的 .cpp文件分开进行编译
//即无法写成 .h文件和.cpp文件声明和定义分开这种情况
//
//必须将所有代码都写在.h文件中使用时一起通过include把整个的代码
//全部包含进去只有这样编译才会通过
【made by siwuxie095】