19模板
从功能来看,有些程序非常相似,只是处理对象(数据)的类型不同
例
void sortArray(int b[],int len);
void sortArray(double b[],int len);
可以考虑提供具有相同逻辑功能的程序,而将数据类型作为参数——类属编程
C++中的模板:类模板和函数模板
好处:
更好的代码重用性
用户使用模板时,编译器替换模板参数(类型)
示例
template < class ElementType >
void sortArray(ElementType b[],
int len)
{for (int pass = 0;
pass < len - 1; pass ++ )
for(int i = pass+1; i <= len-1; i++)
if ( b[ pass ] > b[ i ] )
{ElementType hold;
hold = b[ pass ];
b[ pass ] = b[ i ];
b[ i ] = hold;
}
}
函数模板
对不同类型的数据执行相似的操作
1.函数重载
2.函数模板
函数重载——代码冗余
1.增加编程负担
2.程序的维护问题(如功能修改,算法变动)
函数模板为所有的函数提供唯一的一段函数代码
1.置换代码中的类型参数得到模板函数——实例化
2.函数模板不是函数,不能被执行
3.实例化后的模板函数是真正的函数,可以被执行

例子:用类模板实现栈
// tstack.h: 类模板的定义
template < typename ElementType >
class Stack
{public:
Stack( int = 8 ); // 默认栈元素数目为8
~Stack(){ delete [] data; };
int pop(ElementType &num);
int push(ElementType num);
private:
ElementType *data; //栈数据存储
int memNum; //栈元素个数
int size; //栈大小
};
template < typename ElementType >
Stack <ElementType>::Stack(int s)
{size = s > 0 ? s : 8;
data = new ElementType[s];
memNum = 0;
}
template < typename ElementType >
int Stack <ElementType>::pop(
ElementType &num)
{if (memNum==0)
return 0;
num = data[ -- memNum ];
return 1;
}
template < typename ElementType >
int Stack <ElementType>::push(
ElementType mem)
{if (memNum == size)
return 0;
data[ memNum ++ ] = mem;
return 1;
}
//main.cpp:使用类模板
#include <iostream.h>
#include "tstack.h"
main()
{Stack <double> doubleStack(6);
// Stack <double> 得到模板类
double f = 3.14;
cout<<"Pushing elements into
doubleStack:\n";
while (doubleStack.push(f))
{cout << f << ' ';
f += f;
}
cout << "\nStack is full. Cannot push “
<< f << " onto the doubleStack.";
cout<<"\nPopping elements
from doubleStack:\n";
while (doubleStack.pop(f))
cout << f << ' ';
cout<<"\nStack is empty.Cannot pop.\n";
Stack <int> intStack;//intStack是模板类对象
int i = 1;
cout<<"\nPushing elements
into intStack:\n";
while (intStack.push(i))
{cout << i << ' ';
++i;
}
cout<<"\nStack is full.push "
<<i<<"failed.";
cout<<"\n\nPopping elements
from intStack:\n";
while (intStack.pop(i))
cout << i << ' ';
cout <<
"\nStack is empty. Cannot pop.\n";
return 0;
}
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号