C/C++学习----第五章 模板
2006-10-27 10:41
344 查看
第五章 模板
5.1函数模板
函数模板是一份被C++编译器用于为指定的变量类型构造函数的函数蓝图。使用模板,程序可以指示编译器为不同的变量类型自动创建函数代码。当C++编译器用正确的类型名替换函数首部的T时,编译器将用该类型替换在函数代码中指定的符号。为了让编译器知道所需函数类型,可以在模板定义后指定需要应用的函数原型。(使用#define宏,避开了类型检查机制)template <class T>
T average(T *array, int num)
{
T sum = 0;
for(int i = 0; i < num; i++)
{
sum + = array[i];
}
return (sum/num);
}
int average(int *array, int num); //模板函数原型1
float average(float *array, int num); //模板函数原型2
必须将模板参数T实例化,才能完成具体的函数功能。用模板实参实例化的函数成为模板函数。
5.2重载模板函数
重载模板函数的方法:<1>利用函数模板的函数体
此时,只需要声明函数原型,各模板参数的实参类型必须一致。
int average (int *, int);
此时, average(char *, int), average(float *, int )成为可能。支持数据类型间的隐式转换。
<2>重新定义函数体
同一般的函数重载一样。
模板函数与重载的非模板函数的调用规则:
<1>寻找一个参数完全匹配的函数,如果找到,调用它;
<2>寻找一个函数模板,将其实例化产生一个匹配的模板函数,如果找到,调用它;
<3>通过类型转换可产生参数匹配,如果找到了,调用它。
非以上情况时,调用失败。
支持多种类型的模板:
在创建函数类型时,有时不同的函数使用不同或多种各自不同的类型,此时,模板定义需要在template关键字之后为每一个类型指定符号。
template <class T1, class T2> //模板使用多种类型
int sum_and_compare(T1 *array, T2 value, int num)
{
T2 sum = 0;
for(int i = 0; i < num; i++)
{
sum + = array[i];
}
return ((sum>value)?1:0);
}
5.3类模板
template <class T>class stack
{
public:
stack(int size);
T push(T value);
T pop(void);
int is_empty(void){
return isempty;
}
int is_full(){
return isfull;
}
private:
T *storage;
int elements;
int isempty;
int isfull;
int stack_size;
};
template <class T>
T stack<T>::push(T value)
{
if(is_full()){
return 0;
}
else{
isempty = 0;
storage[elements++]=value;
if(elements == stack_size)
isfull =1;
return value;
}
}
void main(void)
{
stack<int> value(10);
stack<float> price(5);
}
相关文章推荐
- C/C++学习----第五章 模板
- C++模板学习
- C++模板学习 (转)
- [置顶]C++学习笔记之模板篇
- C++模板学习(转载)
- 【C++基础学习】引起类模板被实例化情形总结
- C++模板学习
- C++模板学习
- C++学习笔记6--高级强制类型转换 命名空间和模块化编程 C预处理器 链接和作用域 函数模板 类模板 内联模板 容器和算法
- C++模板学习
- C++学习笔记--模板
- C++模板学习
- C++ template模板的学习
- C++学习笔记之模板(1)——从函数重载到函数模板
- C++ 学习练手 - 双向链表的模板实现
- 【C++】【STL】STL学习之旅二:模板
- 金庸小说考试之模板方法模式学习笔记[C++版]
- C++学习笔记--模板
- C++学习模板篇(静态数据成员与静态成员函数)
- c++模板学习