随笔 - 1  文章 - 0  trackbacks - 0
<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(1)

随笔分类

随笔档案(1)

文章档案(3)

新闻档案(1)

搜索

  •  

最新评论

开博第一篇,那就从模板开始我的里程吧。呵呵 

第一部分、利用模板编写通用代码 

1、 C++支持通用程序设计(编写可重用的代码),工具:模板 

2、 模板概述

①、函数是对值得参数化方式。

②、模板扩展了参数化的概念,使用模板可以对数据类型以及参数化。使用模板编写的代码可以独立于传递给代码的值,而且独立于这些值得数据类型。

③、C++标准模板库是用模板建立的,要充分利用C++标准模板库,就必须懂得模板的基础知识。

3、 类模板(class template

①、类模板主要是用作存储对象的容器和数据结构,来表现类模板更通用的本质。

②、采用模板可以在不指定数据类型的情况下编写类,这样一来,客户代码可以指定自己需要的数据类型来实例化模板。

③、类模板定义说明
    Itemplate <typename T> (注:蓝色为C++关键字,以后的学习中,默认表示)
       对数据类型的参数化表现。
    IIGridconst Grid<T>& src
    IIIvoid 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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理