泛型设计(1)

<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>

IntArray 类为预定义的整型数组类型提供了一个有用的替代类型。如果用户希望使用一

个double 或string 类型的数组,那该怎么办呢?实现一个double 类型的数组与IntArray 类的

区别只是在其所包含的元素的类型不同,而代码本身无需改变。

C++的模板设施提供了一种机制,它能够将类成函数定义内部的类型和值参数化。

parameterizing 我们要到10.1 节才会讨论值参数,这些参数在其他方面不变的代码中

用作占位符,以后这些参数会被绑定到实际类型上,可能是内置的类型也可能是用户定

义的类型。例如在Array 类模板中,我们把数组所包含的元素的类型参数化以后,当我

们实例化instantiate 一个特定类型的实例时,如int、double 或string 类型的Array 数组,

就可以在程序中直接使用这三个实例,就好像我们已经显式地为它们编写过代码一样。现在

来看一下怎样把IntArray 类转换成Array 类模板。下面是定义

template < class elemType >

class Array {

public:

// 把元素类型参数化

explicit Array( int size = DefaultArraySize );

Array( elemType *array, int array_size );

Array( const Array &rhs );

virtual ~Array() { delete [] ia; }

bool operator==( const Array& ) const;

bool operator!=( const Array& ) const;

Array& operator=( const Array& );

int size() const { return _size; }

virtual elemType& operator[](int index){ return ia[index]; }

virtual void sort();

virtual elemType min() const;

virtual elemType max() const;

virtual int find( const elemType &value ) const;

protected:

static const int DefaultArraySize = 12;

int _size;

elemType *ia;

};

关键字template 引入模板参数由一对尖括号< > 括起来——本例中有一个参数

elemType 关键字,class 表明这个参数代表一个类型标识符,elemType 代表实际的参数名。

它在Array 类定义中出现了七次,都是作为实际类型的占位符。

在Array 类的每次实例化中,不论是实例化为int、double 或string 等等,实例化的实际

类型都将代替elemType 参数,下面的例子演示了怎样使用Array 类模板

#include <iostream>

#include "Array.h"

int main()

{

const int array_size = 4;

// elemType 变成了int

Array<int> ia(array_size);

// elemType 变成了double

Array<double> da(array_size);

// elemType变成了char

Array<char> ca(array_size);

int ix;

for ( ix = 0; ix < array_size; ++ix ) {

ia[ix] = ix;

da[ix] = ix * 1.75;

ca[ix] = ix + 'a';

}

for ( ix = 0; ix < array_size; ++ix )

cout << "[ " << ix << " ] ia: " << ia[ix]

<< "\tca: " << ca[ix]

<< "\tda: " << da[ix] << endl;

return 0;

}

你可能感兴趣的:(C++,c,C#)