C++类模板使用详解
2016-03-04 22:41
344 查看
来自 Oracle® Solaris Studio 12.4:C++ 用户指南
类模板尤其适用于描述通用但类型安全的数据结构。
此类声明是不完整的类模板。
以下示例是名为 Array 类的模板声明,该类可接受任何类型作为参数。
如下该模板用于名为 String 的类,该类接受 unsigned int 作为参数。
与函数模板不同,类模板可以同时有类型参数(如
具有整型或枚举的值
指向对象的指针或到对象的引用
指向函数的指针或到函数的引用
指向类成员函数的指针
动态(非静态)数据成员由类模板声明完全定义。
函数成员定义
模板函数成员的定义由模板参数专门化后跟函数定义组成。
函数标识符通过类模板的类名称和模板参数限定。
以下示例说明了 Array 类模板的两个函数成员的定义,该模板中指定了模板参数
如下示例说明了 String 类模板的函数成员的定义。
静态数据成员定义
模板静态数据成员的定义由后跟变量定义的模板参数专门化组成,在此处变量标识符通过类模板名称和类模板实元参数来限定。
指定模板类包括了提供模板名称和参数的值。以下示例中的声明根据 Array 模板创建 int_array 变量。变量的类声明及其一组方法类似于 Array 模板中的声明和方法,只是 Elem 替换为了 int。
此示例中的声明使用 String 模板创建 short_string 变量。
需要任何其他成员函数时,您可以使用模板类成员函数。
类模板
类模板描述了一组相关的类或数据类型,它们只能通过类型来区分:整数值、指向(或引用)具有全局链接的变量的指针、其他的组合。类模板尤其适用于描述通用但类型安全的数据结构。
类模板声明
类模板声明仅提供了类的名称和类的模板参数。此类声明是不完整的类模板。
以下示例是名为 Array 类的模板声明,该类可接受任何类型作为参数。
template <class Elem> class Array;
如下该模板用于名为 String 的类,该类接受 unsigned int 作为参数。
template <unsigned Size> class String;
类模板定义
类模板定义必须声明类数据和函数成员,如以下示例所示。template <class Elem> class Array { Elem* data; int size; public: Array( int sz ); int GetSize(); Elem& operator[]( int idx ); };
template <unsigned Size> class String { char data[Size]; static int overflows; public: String( char *initial ); int length(); };
与函数模板不同,类模板可以同时有类型参数(如
class Elem)和表达式参数(如
unsigned Size)。表达式参数可以是:
具有整型或枚举的值
指向对象的指针或到对象的引用
指向函数的指针或到函数的引用
指向类成员函数的指针
类模板成员定义
类模板的完整定义需要类模板函数成员和静态数据成员的定义。动态(非静态)数据成员由类模板声明完全定义。
函数成员定义
模板函数成员的定义由模板参数专门化后跟函数定义组成。
函数标识符通过类模板的类名称和模板参数限定。
以下示例说明了 Array 类模板的两个函数成员的定义,该模板中指定了模板参数
template <class Elem>。每个函数标识符都通过模板类名称和模板参数
Array<Elem>限定。
template <class Elem> Array<Elem>::Array( int sz ) { size = sz; data = new Elem[size]; } template <class Elem> int Array<Elem>::GetSize() { return size; }
如下示例说明了 String 类模板的函数成员的定义。
#include <string.h> template <unsigned Size> int String<Size>::length( ) { int len = 0; while (len < Size && data[len]!= ’\0’) len++; return len; } template <unsigned Size> String<Size>::String(char *initial) { strncpy(data, initial, Size); if (length( ) == Size) overflows++; }
静态数据成员定义
模板静态数据成员的定义由后跟变量定义的模板参数专门化组成,在此处变量标识符通过类模板名称和类模板实元参数来限定。
template <unsigned Size> int String<Size>::overflows = 0;
类模板的用法
模板类可以在使用类型的任何地方使用。指定模板类包括了提供模板名称和参数的值。以下示例中的声明根据 Array 模板创建 int_array 变量。变量的类声明及其一组方法类似于 Array 模板中的声明和方法,只是 Elem 替换为了 int。
Array<int> int_array(100);
此示例中的声明使用 String 模板创建 short_string 变量。
String<8> short_string("hello");
需要任何其他成员函数时,您可以使用模板类成员函数。
int x = int_array.GetSize( ); int x = short_string.length( );
相关文章推荐
- C++内存管理
- c++ primer 第五版的Sales_data类
- jnaerator命令行生成bridj的包(java调用c++动态链接库)
- C、C++中的隐式转换和显示转换
- C语言中一些对文件操作的函数总结
- 全排列(含查重)
- C++ 优先队列
- C++中函数传递数组的探索
- C/C++的内存处理函数
- C++ Primer Plus读书笔记
- C++设计模式之原型模式
- C++ STL map I don't want it to sort!
- C++ STL map I don't want it to sort!
- [C/C++]在头文件中使用static定义变量意味着什么
- 知乎-怎样算是精通c++
- c++第一次作业
- C++中的RAII机制详解
- C/C++程序员面试宝典备忘录
- 经验分享从c到c++
- C++之多继承