您的位置:首页 > 编程语言 > C语言/C++

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: