1 / 18
文档名称:

C--程序语言设计.ppt

格式:ppt   大小:236KB   页数:18页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

C--程序语言设计.ppt

上传人:wxc6688 2022/6/2 文件大小:236 KB

下载得到文件列表

C--程序语言设计.ppt

相关文档

文档介绍

文档介绍:C++程序语言设计
Chapter 14: Templates
Outline
函数模板
类模板
标准模板库STL
回顾vector
vector是一个模板(template),可以有效的用于不同的类型。
把类型名输入到尖C++程序语言设计
Chapter 14: Templates
Outline
函数模板
类模板
标准模板库STL
回顾vector
vector是一个模板(template),可以有效的用于不同的类型。
把类型名输入到尖括号内,让编译器知道vector所用的类,即vector将要保存的类。
vector<string> v;
ifstream in("");
string line;
while (getline(in, line))
{
(line);
}
vector<int> v;
for (int i = 0; i < 10; i ++)
{
(i);
}
模板(template)
将类型作为参数传给模板,由编译器生成该类型的函数或者类。
通用编程:模板允许以通用类型(而不是具体类型)的方式编写程序。
参数化类型:类型采用参数表示。
函数模板
编写一个交换两个int值的函数
void swap (int & a, int & b)
{
int temp;
temp = a;
a = b;
b = temp;
}
再编写一个交换两个double值的函数
再编写一个交换两个char值的函数
解决方案一
复制原来的代码,并分别用double和char替换所有的int
优点:
思路简单明了
缺点:
浪费时间,容易出错
如果修改算法,都需要修改
解决方案二
利用函数模板自动完成,只需指明其类型参数即可。
template <class T>
void swap (T & a, T & b){
T temp;
temp = a; a = b; b = temp;
}
关键字class在较新的编译器中可以用typename替换。
参看代码:
注意事项
模板与宏类似,由预处理域移至编译域。
模板并不处理函数,只是告诉编译器如何定义函数。
关键字typename更为明显的说明参数T表示类型,但大量的代码库还是使用class。
函数模板不能缩短可执行程序,最终的代码不包含任何模板,只包含实际生成的函数。
好处在于使生成多个函数定义简单、可靠。
函数模板重载
可以像重载常规函数定义那样重载函数模板定义。
被重载的函数模板的函数特征必须不同。
并非所有的函数模板参数都必须是函数模板参数类型。
参看代码:
显示具体化
假设有如下结构:
struct job {
char name[40];
double salary;
int floor;
}
若只交换salary和floor成员,怎么办?
提供一个具体化函数定义,称为显式具体化
template <> void Swap<job>(job &, job &);
显示具体化
非模板函数
void Swap (job &, job &);
模板函数
template <class T>
void Swap (T &, T &);
显式具体化模板函数
template <>void Swap<job> (job &, job &);
非模板函数优先于显式具体化模板函数和模板函数,而显式具体化模板函数优先于模板函数。参考代码:
类模板
继承和组合并不是总能够满足重用代码的需要,还要用到类模板。
比如容器类,算法代码相同,只有保存的对象类型不同。
可以编写一个通用的容器类,将具体的类型作为参数传递给它。
类模板语法
采用template<class T>进行声明
template<class T>
class Array{
enum { size = 100 };
T A[size];
public:
T& operator[](int index) {
return A[index];
}
};
int main(){
Array<int> ia; Array<float> fa;}
非内联函数定义
需要在成员函数定义前看到template声明
在引用模板类名的地方,必须伴有该模板的参数列表
参看代码:
头文件
通常,即使是在创建非内联函数定义时,都把类模板的所有声明和定义放入一个头文件中。
不同的编译器实现方式不同,大多数允许在一个独特的cpp文件中放置类模板的定义,需要采用新的export关键字,且每个定