zoukankan      html  css  js  c++  java
  • 类模板

    -----------------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】

  • 相关阅读:
    Katta:基于Lucene可伸缩分布式实时搜索方案
    cnprog
    Eclipse开发struts完全指南(二)安装与配置
    MYSQL 数据库导入导出命令
    ubuntuapache下隐藏thinkphp入口文件index.php
    PHP过滤指定字符串,过滤危险字符
    // 关闭调试模式  define('APP_DEBUG', false);
    Javascript读书笔记(1):从零开始
    Facebook messages实现解读
    《推荐系统实践》
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6817466.html
Copyright © 2011-2022 走看看