C++类模板使用详解

灰太狼 2022-08-20 15:23 265阅读 0赞

来自 Oracle® Solaris Studio 12.4:C++ 用户指南


类模板

类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。
类模板尤其适用于描述通用但类型安全的数据结构。


类模板声明

类模板声明仅提供了类的名称和类的模板参数。
此类声明是不完整的类模板。
以下示例是名为 Array 类的模板声明,该类可接受任何类型作为参数。

  1. template <class Elem> class Array;

如下该模板用于名为 String 的类,该类接受 unsigned int 作为参数。

  1. template <unsigned Size> class String;

类模板定义

类模板定义必须声明类数据和函数成员,如以下示例所示。

  1. template <class Elem> class Array
  2. {
  3. Elem* data;
  4. int size;
  5. public:
  6. Array( int sz );
  7. int GetSize();
  8. Elem& operator[]( int idx );
  9. };
  10. template <unsigned Size> class String
  11. {
  12. char data[Size];
  13. static int overflows;
  14. public:
  15. String( char *initial );
  16. int length();
  17. };

与函数模板不同,类模板可以同时有类型参数(如 class Elem)和表达式参数(如 unsigned Size)。表达式参数可以是:

  • 具有整型或枚举的值
  • 指向对象的指针或到对象的引用
  • 指向函数的指针或到函数的引用
  • 指向类成员函数的指针

类模板成员定义

类模板的完整定义需要类模板函数成员和静态数据成员的定义。
动态(非静态)数据成员由类模板声明完全定义。

函数成员定义

模板函数成员的定义由模板参数专门化后跟函数定义组成。
函数标识符通过类模板的类名称和模板参数限定。
以下示例说明了 Array 类模板的两个函数成员的定义,该模板中指定了模板参数 template <class Elem>。每个函数标识符都通过模板类名称和模板参数 Array<Elem> 限定。

  1. template <class Elem> Array<Elem>::Array( int sz )
  2. {
  3. size = sz;
  4. data = new Elem[size];
  5. }
  6. template <class Elem> int Array<Elem>::GetSize()
  7. {
  8. return size;
  9. }

如下示例说明了 String 类模板的函数成员的定义。

  1. #include <string.h>
  2. template <unsigned Size> int String<Size>::length( )
  3. {
  4. int len = 0;
  5. while (len < Size && data[len]!= \0’)
  6. len++;
  7. return len;
  8. }
  9. template <unsigned Size> String<Size>::String(char *initial)
  10. {
  11. strncpy(data, initial, Size);
  12. if (length( ) == Size)
  13. overflows++;
  14. }

静态数据成员定义

模板静态数据成员的定义由后跟变量定义的模板参数专门化组成,在此处变量标识符通过类模板名称和类模板实元参数来限定。

  1. template <unsigned Size> int String<Size>::overflows = 0;

类模板的用法

模板类可以在使用类型的任何地方使用。
指定模板类包括了提供模板名称和参数的值。以下示例中的声明根据 Array 模板创建 int_array 变量。变量的类声明及其一组方法类似于 Array 模板中的声明和方法,只是 Elem 替换为了 int。

  1. Array<int> int_array(100);

此示例中的声明使用 String 模板创建 short_string 变量。

  1. String<8> short_string("hello");

需要任何其他成员函数时,您可以使用模板类成员函数。

  1. int x = int_array.GetSize( );
  2. int x = short_string.length( );

发表评论

表情:
评论列表 (有 0 条评论,265人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++中模板使用详解

    1. 模板的概念。 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大

    相关 C++ 函数模板&模板详解

    在 C++ 中,模板分为函数模板和类模板两种。函数模板是用于生成函数的,类模板则是用于生成类的。 函数模板&模板函数     类模板&模板类  必须区分概念 函数模板是模板