注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

数据挖掘

学习数据挖掘

 
 
 

日志

 
 

C++数组模板  

2012-04-03 21:46:01|  分类: C++基本技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
   我们可以定义一个数组模板,并且利用该模板声明其数组成员。声明的方式非常简单,主需要一下两步:

template<class ElementType,int n>;
ElementType a[n];
  第一句话就是定义这个模板,注意其中的参数不再是1个了,而是2个。其中第一个参数就是一个模板的类型ElementType,表示数组a的类型;另外一个是整型变量n,众所周知,它代表的是该数组a的长度。下面,我用一个比较难的程序来说明一下数组模板的作用。
#include <iostream>
using namespace std;
template<class ElementType,int n>
class ArrayTemplate
{
public:
    ArrayTemplate();
    ArrayTemplate(const ElementType &t);
    ElementType& operator[](int i);
    void show();
private:
    ElementType a[n];
};
template<class ElementType,int n>
ArrayTemplate<ElementType,n>::ArrayTemplate()
{
    cout<<"执行不带参数的构造函数\n";
    for (int i=0;i<n;i++)
    {
        a[i]=(i+1);
    }
}
template<class ElementType,int n>
ArrayTemplate<ElementType,n>::ArrayTemplate(const ElementType &t)
{
    cout<<"执行带一个参数的构造函数\n";
    for (int i=0;i<n;i++)
    {
        a[i]=t;
    }
}
template<class ElementType,int n>
ElementType& ArrayTemplate<ElementType,n>::operator[](int i)
{
    cout<<"执行下标运算符函数operator[]\n";
    if (i<0||i>=n)
    {
        cout<<"超出数组的限制,程序终止!\n";
        exit(EXIT_FAILURE);
    }
    return a[i];
}
template<class ElementType,int n>
void ArrayTemplate<ElementType,n>::show()
{
    for(int i=0;i<n;i++)
    {
        cout<<"a["<<i<<"]="<<a[i]<<"\t";
    }
    cout<<endl;
}
int main()
{
    ArrayTemplate<int,4>array_1;
    array_1.show();
    ArrayTemplate<int,4>*array_2=new ArrayTemplate<int,4>[4];
    for(int i=0;i<9;i++)
    {
        array_2[i]=array_1[i];
        array_2[i].show();      
    }
    return 0;
}
  程序分析:
      首先我们在程序的第3行定义了一个数组模板,其类型为ElementType,数组长度为n。然后我们在类ArrayTemplate中于第7行声明了一个不带参数的构造函数,定义在第15行;再在第8行重新声明了一个带一个参数的构造函数,定义在第行。在程序的第9行我们重载了[]运算符。这里注意一下,我们在模板类的外面定义类中的函数的时候,应该有三点注意事项:
必须在函数前面重新声明一下模板,如程序的第14行所示;
要想调用模板类中的函数,不能直接写上类名::函数(),而是要在模板类之后加上模板定义,如15行所示,这样一来,编译器就会知道函数()是来自模板函数的了;
注意程序第33行的重载运算符operator函数的定义。我们在一开始应该先加上“模板类型&”,其次和定义其他模板函数类似,千万不能漏掉“模板类型&”。
      下面,我们从主函数开始进行分析...
      首先在第54行我们调用模板类创建了一个array_1的类型。它其中的变量为int型,然后数组元素一共有4个。这样一来,就表示在模板类ArrayTemplate中的的私有成员变量
?
ElementType a[n];
  实际上就成为了以下的形式:
?
int a[4];
  这样一来,在程序第55行调用show()函数的时候,for循环的次数就会限定为4次(因为n=4),这样就会输出由模板类对象array_1创建的4个数组a[0]、a[1]、a[2]、a[3]的值。然后我们再来看看程序的第56行,这里在堆中创建了4个对象,并把这4个对象放在一个数组中,这个数组就是array_2。由于这个数组中间存放的全部都是对象,那么我们就把array_2叫做对象数组。后面的for循环中我们首先来看看程序第59行的语句:
?
array_2[i]=array_1[i];
  当i=0的时候这句话就相当于
?
array_2[0]=array_1[0];
  注意右边的array_1[0],因为array_1是一个对象而不是一个数组,那么编译器就会调用我们自己在程序的第33行定义的重载[]运算符的函数。它返回的就是array_1中的数组a[i]的值。在这里,因为i=0,所以返回值就是a[0]。而我们从上面可以看到,a[0]=1所以相当于返回1。而特别注意的是array_2[0]的类型为ArrayTemplate类型,而a[0]的类型却是整型,编译器则会使用隐式类型转换:
?
array_2[0]=ArrayTemplate(a[0]);
  将a[0]强制转换为ArrayTemplate类型。这样就会调用位于程序第24定义的带一个参数的构造函数。在这个构造函数中,我们将a[0]的值作为t值传递进去,然后再for循环中将a[0]到a[3]的值全部赋值为t(即a[0],也就是1)。值得注意的一点就在于,这里t代表的a[0]是array_1的数组,而4次循环中的a[i]代表的是array_2对象数组中array_2[0]中的a[0]到a[3]的值!!所以会输出1,1,1,1也就不足为奇了。同理,后面的输出分析方法同前面一样。只有一点,当主程序的for循环,循环到i=4的时候。这时,就会执行operator[]函数中的if语句之后的内容,退出程序。
      整个程序的输出证明了我们的理论:
C++数组模板 - 小坏 - Do  What
  评论这张
 
阅读(856)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018