zoukankan      html  css  js  c++  java
  • 7.2 C++模板类实例化

    参考:http://www.weixueyuan.net/view/6399.html

    总结:

      array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类array中所有的类参数T都用int来代替。

      我们称array < int >和array < double >成为模板类的实例。

      我们在例1中创建的对象A是属于模板类实例化后的类的,而不是属于模板类的。换言之模板类不进行实例化就不能创建对象。

      另外模板类可以以参数的形式出现在函数的参数列表中,如果参数列表中有模板类,则函数前面必须加上模板头,在例1中的模板头为“template< class T >”。

    我们可以通过“< >”指定一种数据类型,从而创建出一个模板类的实例。有了前面定义的模板类,如果我们想创建一个int数组可以按照如下方式使用模板类:

    array < int > a(10);

    array < int >表明用int类型来代替模板类中的类参数“T”,编译器会将模板类array中所有的类参数T都用int来代替。例如类中的私有成员变量“T * num;”会被替换为“int * num;”。对类中的成员函数也会进行相同的替换,如“T & operator[]( int );”将会被替换为“int & operator[]( int );”。

    如果我们定义对象:

    array < double > D(10);

    则模板类中所有的类参数“T”都将被换为double。我们称array < int >和array < double >成为模板类的实例。使用这些实例就与使用普通类是一样的。

    例1:

    #include <iostream>
    using namespace std;
    
    template< class T >
    class array
    {
    public:
        array( int );
        T & operator[]( int );
        const T & operator[] ( int )const;
        int getlen() const { return length; }
        ~array();
    private:
        array(){};
        int length;
        T * num;
    };
    
    template < class T >
    array< T >::array( int n )
    {
        num = new T[n];
        length = n;
    }
    
    template < class T >
    array< T >::~array()
    {
        delete[] num;
    }
    
    template< class T >
    T & array< T > ::operator[] ( int i )
    {
        if( i < 0 || i >= length )
            throw string( "out of bounds" );
        return num[i];
    }
    
    template< class T >
    const T & array< T > ::operator[] (int i) const
    {
        if( i < 0 || i >= length)
            throw string( "out of bounds" );
        return num[i];
    }
    
    template< class T >
    ostream & operator<<( ostream & out, const array <T> & A )
    {
        for(int i=0; i < A.getlen(); i++)
            out<< A[i] << " ";
        return out;
    }
    
    int main()
    {
        array< int > A(10);
        for(int i = 0; i < 10; i++)
        {
            A[i] = 2*i;       
        }
        cout<<A<<endl;
        return 0;
    }

    本例是一个完整的模板类示例,在该例中我们定义了一个array模板类,在主函数中我们对其进行了实例化,“array< int > A(10);”实例化之后创建了一个对象A,该对象是一个包含10个元素的整型数组。之后用一个for循环给数组赋初值,由于我们重载了下标操作符,因此可以凭借下标直接访问相应的数组元素。之后直接输出A数组的所有元素,此时调用的是输出操作符重载函数。

    我们在例1中创建的对象A是属于模板类实例化后的类的,而不是属于模板类的。换言之模板类不进行实例化就不能创建对象。

    例2:

    Arrar A(10);
    Array< T > A(10);
    Template< class T > Array <T> A(10);

    在本例中,三种定义对象的方式都是无效的,模板类不进行实例化是无法创建对象的。

    另外模板类可以以参数的形式出现在函数的参数列表中,例如例1中的输出操作符重载函数“template< class T > ostream & operator<<(ostream & out, const array <T> & A)”,该函数的第二参数是array <T>的引用,如果参数列表中有模板类,则函数前面必须加上模板头,在例1中的模板头为“template< class T >”。

  • 相关阅读:
    jQuery 复选框全选反选
    Linux安装JDK详细步骤
    C++Primer>#include<iostream>与#include<iostream.h>以及#inclue<string> 和 #include<string.h>的区别
    OpenCV常见的几种背景消除的方法
    无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
    #include<iostream>与#include<iostream.h>以及#inclue<string> 和 #include<string.h>的区别
    CEdit控件输入数字限制(转)
    将自己的博客转移,优化
    Window Style
    this指针基础介绍
  • 原文地址:https://www.cnblogs.com/yongpan/p/7942574.html
Copyright © 2011-2022 走看看