C++ 类模板
来源:互联网 发布:淘宝网2016全年交易额 编辑:程序博客网 时间:2024/06/06 09:15
一,C++类模板
继承与包含并不总是能解决重用代码的需要。例如,Stack类与Queue类都是容器类,容器类设计用来存储其他对象或数据类型。可以定义专门用于存储double值或string对象的Stack类,除了保存的对象类型不同外,这两种Stack类的代码是相同的。然而,与其编写新的类声明,不如编写一个泛型(即独立于类型的)栈。然后将具体的类型作为参数传递给这个栈,这样就可以使用通用的代码生成存储不同数据类型的栈。模板提供参数化类型,即能将类型名作为参数传递给接收方法来建立类或函数。
二,定义类模板
template <typename Type>class Queue{private: struct Node{ Type item; struct Node *next; }; Node *first; Node *rear; int queue_size;public: Queue(); ~Queue(); bool isEmpty() const; bool push(const Type); bool pop(); bool getFront(const Type &); int queueSize() const;};关键字template告诉编译器,将要定义一个模板, 尖括号中的内容相当于函数的参数列表。上面声明的模板不是类与成员函数定义,它们是C++编译器指令,说明了如何生成类和成员函数定义。模板的具体实现(如用来处理string对象的栈类),被称为实例化或具体化。不能将模板成员函数放在独立的实现文件中。由于模板不是函数,它们不能单独编译,模板必须与特定的模板实例化请求一起使用。
三,使用类模板
仅在程序中包含模板并不能生成模板类,而必须请求实例化。
Queue<int> qu1;Queue<double> qu2;看到上述声明之后,编译器将按Queue<Type>模板来生成两个独立的类声明和两组独立的类方法。
注意:
必须显示的提供所需的类型,这与常规的函数模板是不同的,因为编译器可以根据函数的参数类型来确定要生成哪种函数。
四,模板与非类型参数
template <typename Type, int n>class ArrayTP{private: Type ar[n];public: ArrayTP(){}; ArrayTP(Type &v){ for(int i = 0; i < n; i ++){ ar[i] = v; } } void show(){ for(int i = 0; i < n; i ++){ cout<<ar[i]<<" "; } cout<<endl; }};假设有下面的声明
ArrayTP<int, 10> ar(num);这导致编译器定义名为ArrayTP<int, 10>的类,并创建一个类型为ArrayTP<int, 10>的ar对象。上面的模板声明中,int指出n的类型为int,这是一个非类型参数。上面使用非类型参数创建数组模板的主要缺点是,每种数组大小都将生成自己的模板。下面的声明将生成两个独立的类声明:
ArrayTP<int, 10> a(num);ArrayTP<int, 11> b(num);
五,模板的多功能性
1,可以将用于常规类的技术用于模板类。
2,模板可以使用多个类型参数。
template <class T1, class T2>class pair{...};
3,默认类型模板参数
可以为类型参数提供默认值
template <class T1, class T2 = int>class pair{...};
六,模板的具体化
类模板与函数模板很相似,可以有隐式实例化、显示实例化和显示具体化,它们统称为具体化。
1,隐式实例化
声明一个或多个对象,编译器将使用模本生成具体的类定义
int num = 5;ArrayTP<int, 10> a(num);
2,显示实例化
使用关键字template指出所需类型来声明类,编译器将生成类声明的显示实例化。
template class ArrayTP<string, 100>;
3,显示具体化
显示具体化是特定类型的定义。有时候可能需要在为特殊类型实例化时,对模板进行修改,使其行为不同。例如,假设已经为用于表示排序后数组的类(元素在加入时被排序)定义一个模板:
template <class Type>class sortedArray{...};模板使用>来进行值的比较。对于数字,这管用。对于自定义的类,只要类定义了operator>方法,这也管用。但如果Type是由const char *表示的字符串,这将不管用。实际上,模板可以正常工作,但是字符串按地址进行排序。这要求类定义使用strcmp(),而不是>来对值进行比较。在这种情况下,可以提供一个显式模板具体化,这将采用为具体类型定义的模板。下面声明一个专供const char *类型使用的模板,其中的实现代码使用strcmp()来进行值的比较,而不是>来对值进行比较。
template <> class sortedArray<const char *>{...};
当具体化模板与通用模板都与实例化请求匹配时,编译器将使用具体化模板。
4,部分具体化
C++允许部分具体化,即部分限制模板的通用性。
//general templatetemplate <class T1, class T2> class pair{...};//specialization with T2 set to inttemplate <class T1> class pair<T1, int>{...};//specialization with T1 and T2 set to inttemplate <> class pair<int, int>{...};如果有多个模板可供选择,编译器将使用具体化程度最高的模板。
pair<double, double> p1; //use general pair template pair<double, int> p2; //use pair<T1, int> partial specialization pair<int, int> p3; //use pair<int, int> explicit specialization
0 0
- 【c/c++】类模板
- 【C/C++】模板类
- 【c++】模板和模板类
- C/C++:函数模板与类模板
- [C/C++]模板函数与模板类
- c++vector模板类
- c++vector模板类
- c++:类模板
- [C++]类模板
- C++:类模板
- 【c++】类模板
- C++stack模板类
- 类模板与模板类(C++)
- C++,template,类模板和函数模板
- C++:函数模板、类模板及其特化
- C++---函数模板与类模板
- Linux C/C++ 模板:类模板(主模板)
- C/C++_log2000_函数模板与类模板笔记1
- POJ 2386 Lake Counting
- freemark 全局变量 定义 不生效
- 创建对象的几种方式
- iOS 架构相关
- DDk
- C++ 类模板
- springmvc下富文本UEditor的使用
- 链接不过:undefined symbol
- adobe reader 怎么添加书签
- nested exception is org.apache.ibatis.exceptions.PersistenceException:报错解决。
- hdu
- Linux CentOS6 64位升级3.1内核的方法记录
- Android之进程间通信(IPC)-Messenger
- AWS S3 Not Allowed (Service: Amazon S3; Status Code: 405; Error Code: 405 Not Allowed; Request ID: n