类模板
让编程改变世界
Change the world by program
需要注意的地方
在创建模板时,还可以用template <typename T>来代替template <class T>,它们的含义是一样一样的。 注意,template <class T>中的class并不意味着T只能是一个类。 再强调一次,不要把函数模板分成原型和实现两个部分。 如果编译器看不到模板的完整代码,它就无法正确地生成代码。 所得到的出错信息从“不知所云”到“胡说八道”什么样都有。 为了明确地表明swap()是一个函数模板,还可以使用swap<int>(i1, i2)语法来调用这个函数。 这将明确地告诉编译器它应该使用哪一种类型。 如果某个函数对所有数据类型都将进行同样的处理,就应该把它编写为一个模板。 如果某个函数对不同的数据类型将进行不同的处理,就应该对它进行重载。类模板
类模板与函数模板非常相似:同样是先由你编写一个类的模板,再由编译器在你第一次使用这个模板时生成实际代码。 [codesyntax lang="cpp"]template[/codesyntax] 构造器的实现将是下面这样: [codesyntax lang="cpp"]class MyClass{ MyClass(); void swap(T &a, T &b);}
MyClass[/codesyntax] 因为MyClass是一个类模板,所以不能只写出MyClass::MyClass(),编译器需要你在这里给出一种与MyClass()配合使用的数据类型,必须在尖括号里提供它。 因为没有确定的数据类型可以提供,所以使用一个T作为占位符即可。 接下来的示例程序将使这一切更加明朗。 我们即将编写一个基于模板的栈。 栈是实际编程过程中一种非常有用的数据结构,它是一种数据存储机制。 栈只提供两个函数:一个用来吧数据压入栈的顶部,另一个用来从栈取出顶部元素(先进后出) 尽管无数次在耳边徘徊,但没有学习过汇编语言的鱼油对于栈这个概念可能还是熟悉又陌生的。 尽管如此,我们还是时刻都在使用它们! [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/08/栈原理演示.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] [/kml_flashembed] [buy] [/buy] [Downlink href='http://urlxf.qq.com/?IR7Z3aY']视频下载[/Downlink] [Downlink href='http://kuai.xunlei.com/d/LONXEXHLQYHG']备胎下载[/Downlink]::MyClass(){ // 初始化操作。}