开博第一篇,那就从模板开始我的里程吧。呵呵
第一部分、利用模板编写通用代码
1、 C++支持通用程序设计(编写可重用的代码),工具:模板
2、 模板概述
①、函数是对值得参数化方式。
②、模板扩展了参数化的概念,使用模板可以对数据类型以及值参数化。使用模板编写的代码可以独立于传递给代码的值,而且独立于这些值得数据类型。
③、C++标准模板库是用模板建立的,要充分利用C++标准模板库,就必须懂得模板的基础知识。
3、 类模板(class template)
①、类模板主要是用作存储对象的容器和数据结构,来表现类模板更通用的本质。
②、采用模板可以在不指定数据类型的情况下编写类,这样一来,客户代码可以指定自己需要的数据类型来实例化模板。
③、类模板定义说明…
I、template <typename T> (注:蓝色为C++关键字,以后的学习中,默认表示)。
对数据类型的参数化表现。
II、Grid(const Grid<T>& src)
III、void setElementAt(int x, int y, const T& inElem);
④、模板类的方法定义:必须以template <typename T>开始。模板可以指定任何类型,如:指针类型,类,基本类型,甚至可以是另一个模板类型。
Grid<vector<int> > ※必须在两个相邻的尖括号之间留一个空格,防止和IO流的>>冲突。
在栈上动态的分配Grid模板也是可以的:Grid<int>* myGrid = new Grid<int>();
4、编译器如何处理模板
①、选择性实例化
在为多种不同的数据类型实例化模板时,由于编译器会给每种数据类型都生成一个模板代码的副本,所以为多种不同的数据类型实例化模板可能导致代码膨胀,使用模板时,最后可能得到极其庞大的可执行文件。不过编译器只会针对特定类型实际调用的类方法生成代码,所以这个问题有所缓解。
②、类型方面的模板要求
在编写独立于类型的代码时,必须对这些类型做一定的假设。如果要使用某种数据类型对模板实例化,而对于特定程序的模板来说,该数据类型并不支持模板中定义的全部操作,则代码不能编译成功。然而,即使要使用的数据类型不支持模板代码所需的全部操作,也可以采用选择性实例化来使用其中的一部分方法。
5、模板代码在文件之间的分布
可以采用一下机制来实现模板文件的包含:
①、在头文件中定义模板
模板方法定义放在一个单独的头文件中,并在类定义所在的头文件中用#include包含这个头文件,但是要确保包含方法定义的#include语句在类定义的后面,否则代码不能编译。
例:
//Grid.h
Template <typename T>
Class Grid
{
//Class definition omitted for brevity
}
#include “GridFunctionDef.h”
②、在原文件中定义模板(推荐)
可以把方法的定义放到源文件中,但是仍然需要保证该方法定义对于使用模板的代码是可用的。为此,可以在模板类定义头文件中用#include包含方法实现源文件。
C++标准实际定义了一种方法,可以把模板方法定义放在源文件中,而不需要通过#include包含在头文件中。这个关键字是[export].但是很多的编译器还不支持。
posted on 2007-07-12 10:15
鹿鹿 阅读(152)
评论(0) 编辑 收藏 引用