首页 > C++入门教程 > C++模板与标准模板库
C++模板类实例化
我们可以通过
如果我们定义对象:
【例 1】
我们在例 1 中创建的对象 A,是属于模板类实例化后的类的,而不是属于模板类的。换言之,模板类不进行实例化就不能创建对象。
【例 2】
另外,模板类可以以参数的形式出现在函数的参数列表中,例如例 1 中的输出操作符重载函数“template< class T > ostream & operator<<(ostream & out, const array <T> & A)”,该函数的第二参数是 array <T> 的引用,如果参数列表中有模板类,则函数前面必须加上模板头,在例 1 中的模板头为“template<class T>”。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
< >
指定一种数据类型,从而创建出一个模板类的实例。有了前面定义的模板类,如果我们想创建一个 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>”。
声明:《C++系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。