1.作为新手学习C++的模板,首先应该了解C++的模板有何现实意义?
其现实意义在于:用模板可以使得一段程序可以处理多种不同类型的对象,能大幅节约程序代码(可以不用定义多个实现相同的函数的重载),提高程序设计的效率,提高对象程序的可重用性和可维护性。
2.模板的定义是什么?
如果一段程序可以处理多种不同类型的对象,这段程序就称之为模板。
3.模板分为哪几种?
模板可细分为函数模板和类模板。
4.什么时候应选用模板来设计程序?
(1)对于普通函数而言,如果要设计多个名字相同、具体实现相同而函数参数类型或返回类型不相同的普通函数,这时应选用模板。
(2)对于类而言,如果要设计多个类名字相同、成员(数据成员、成员函数)名字相同、成员函数具体实现相同而数据成员不相同或成员函数参数、返回类型不相同的类,这时应选用模板。
5.如何定义一个函数模板?
6.使用函数模板时需要注意什么?
(1)在每个函数模板定义之前,都需要在前面加上模板的声明。
(2)在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename(或class)。
(3)在template语句与函数模板定义语句之间不允许插入别的语句。
(4)template <typename T>或template <class T>中的 “ T ” 只是函数参数的类型,并不是函数返回的类型,所以函数返回的类型可以设为和T不一样的类型。
(5)虽然template <typename T>或template <class T>中的 “ T ” 指的是函数参数类型,但并不意味着所有的函数参数类型都一定要是T。部分函数参数类型可以不是T,可以是其它类型。
(6)同一般函数一样,函数模板可以重载。可以同时定义多个函数参数类型不同的模板,但不可以定义多个返回类型不同的模板,这样定义会产生二义性,导致编译器不知道我们要调用的究竟是哪个模板。
(7)函数模板与同名的非模板函数可以重载。在这种情况下,调用的顺序是:首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它;若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数并调用它。
7.如何定义一个类模板?
8.使用类模板时需要注意什么?
(1)在每个类模板定义之前,都需要在前面加上模板声明。
(2)类模板在使用时,必须在类模板名字后面缀上<类型参数>
(3)类模板可以有多个类型参数。
(4)由于类没有重载,同样,类模板也没有重载。
(5)由于类中的成员函数可以重载,同样,类模板中的成员函数也可以重载,只是重载过程中需要注意的事项和上述函数模板重载时需要注意的事项一样,最主要是避免产生二义性。
9.不论是函数模板还是类模板,模板的声明和定义为何不应该分别放在.h文件和.cpp文件,而应该一起放在.h文件?
单从编译效果来看,编译不会报错,但是链接的时候会报错,报错效果如下图:
如果是让模板的声明放在.h文件,模板的定义放在.cpp文件,假设在main函数中调用了一个模板类,这时就需要实例化该类模板。但需要注意的是main.cpp里只包含了.h头文件,也就是只有类模板的声明,没有具体实现。而.cpp文件中虽然存在模板的具体实现,但没有在.cpp里使用过这个类模板,就不会生成一个具体化的实例。所以调用的时候发现类模板还没被实例化就会报链接错误。
10.如果非要把模板的声明和定义分别放在.h文件和.cpp文件,要怎么做?
在放模板的定义的.cpp文件里显式的实例化一个模板。但如果是这样的话,那模板的存在就没有多大的意义了,毕竟我们是为了节省代码量才用模板,如果自己动手实例化所有的模板,则代码量没有减少,和不用模板直接定义没有什么区别。