二、C++浏览
这本书好难~感觉要先过一遍再重新回头看。
5、泛型设计
泛型指的是类型是广泛的,用一个模板实现不同数据类型相同的功能。
实现方式:C++内设机制,可以将类成函数定义内部的类型和值参数化【大概理解:把类型先设置成变量,然后最后附上实际的类型】,以下是示例:
template < class elemType > //template引入模板,参数是elemType,class代表了一个类型
class Array {
public:
// 把元素类型参数化
explicit Array( int size = DefaultArraySize ); //explicit 表示显式转换【只支持显式转换】
Array( elemType *array, int array_size ); //elemType 在这里都是占位符,由实际类型决定
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;
};
在主函数中使用方法:
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);
在使用的时候,只需要在尖括号里面加上实际的类型即可。在生成时会生成相应的类型的数组【书里之前写的函数体】。在调用时,并不是所有的成员函数都会马上被实例化,而是要用到的时候才会被实例化【有助于节省资源16.8讨论】。
类模板也可以作为基类或者派生类。【可以继承】在使用自己定义的函数时,如果要对模板类进行操作,那么函数也应该是模板函数。
Q1:给出下列类型声明template <class elemType> class Array;enum Status { ... };typedef string *Pstring;如果存在的话 下面哪些对象的定义是错误的(a) Array< int*& > pri( 1024 );(b) Array< Array<int> > aai( 1024 );(c) Array< complex< double > > acd( 1024 );(d) Array< Status > as( 1024 );(e) Array< Pstring > aps( 1024 );【遇到困难了、、学到之后回头看】