呃,好久没更新C++了,不过也快更新完了。说实话,我对于泛型编程(GP)也不是很了解,除了用STL之外,自己很少去写模板。模板类的用户,通常是应用程序员。也许对于写底层库的程序员来说,泛型编程才会经常接触吧。
实现自己的模板(template)
类模板成员函数的定义语法:
template <typename elemtype>
BinaryTree<elemtype>::BinaryTree(const BinaryTree&){}
//BinaryTree是类名,在前面加了BinaryTree<elemtype>::作用域后,后面的都不需要再加了
正确编译模板类的方法:
1、因为模板实例化需要看到模板的定义,而不仅仅是声明。所以模板类的定义全部放在头文件中。这种叫做包含编译模型(见C++PRIMER p543)。
当然,可以在头文件中的最后包含源文件,这样可使得定义和声明分开。不过工程中就不能添加这个.cpp了,因为这个.cpp编译通不过。其实就是在头文件的最后include进去就可以了。
2、分开头文件和源文件,在main中包含源文件
3、使用分别编译模型,export关键字目前VC不支持。
BinaryTree<elemtype>格式在类模板以及成员的定义式中可以不加,其余情况都需要以BinaryTree<elemtype>的格式来修饰。题外:二叉树前置遍历:先根,后左右。中置遍历:先左,后根,再右。后置遍历:先左右,后根。
模板机制帮助我们将类定义式中“与类型相依”和“独立于类型之外”的两部分分开来。
传递模板参数列表,产生特定类型的类模板。只有在类模板及其成员的定义时,不需传递模板参数。
使用模板类型作为函数参数时,最好使用const reference的方式传递,这样即便是类类型的参数也能高效的传递。
同样的,使用模板类型的构造函数中,也应该尽可能在成员初始化列表里为每个类型参数进行初始化工作。因为如果是内置类型,就没有什么差别。但是如果是自定义类型,在成员初始化列表里进行初始化,就会更加高效。
指针引用:int *& i;不但可以改变指针本身,也可以改变指针所指向的对象。
模板参数不一定非得是某种类型不可,也可以用常量表达式作为模板参数。
成员模板函数,可以在类内的定义成员模板函数,使得这个函数支持不同的类型,而不需要去管该类是模板类还是非模板类。
