类模板
-----------------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"); return 0; }
//与函数模板一样 类模板本身并不会产生实质性的代码 //只有当我们去实例化一个对象时将类的后边写上一个固定的参数 //这时才会产生出一套代码 这套代码称之为模板类 // //模板 代码不能分离编译 因为IDE环境的原因 无法使模板的 .h文件 //与模板的 .cpp文件分开进行编译 //即无法写成 .h文件和.cpp文件 声明和定义分开这种情况 // //必须将所有代码都写在.h文件中 使用时一起通过include把整个的代码 //全部包含进去 只有这样编译才会通过 |
【made by siwuxie095】
posted on 2017-05-06 17:40 siwuxie095 阅读(155) 评论(0) 编辑 收藏 举报