C++语法之模板函数和模板类
模板函数是什么?就是不指定类型的函数,不指定类型如何写代码?所以得用到模板,可以先用模板代替,就好像方程式,先用x,y代替一样。
它的写法是这样,定义函数时,开头加一句:(其中的T就相当于x,y之类的)
template <typename T>
表示下面是个模板函数,完整代码:
#include <iostream>
using namespace std;
//定义模板函数
template<typename T>
void out(T a)
{
cout << a << endl;
}
int main() {
int a = 112;
char str[10] = "hello";
out(a);
out(str);
}
可以看到,out函数,传入不同类型的参数都正常执行。
这里的typename T,typename表示定义了一个模板参数,用T代替了具体类型。
当然这个T你也可以取别的名字,然后可以有多个typename。只要调用时一致就行。
如:
template<typename T1,typename T2>
这种模板函数,是在编译时根据调用的具体参数来生成函数代码,并不是编译后的代码实现了这个功能。需要明白。
所以像上面,调用时分别传入了int和char类型,那么编译器就会生成两个函数代码,一个是int类型,一个是char类型。
模板函数,适用于不同的类型有着共同的代码,本质上是为了方便灵活编程。
模板类
了解了模板函数,接下来我们再来看看模板类又是怎么回事。
定义了模板类后,那类里面的变量类型也同样可以用模板代替的,如下:
#include <iostream>
using namespace std;
//定义模板类
template<typename T>
class cOut {
public:
T ca; //可以定义成员变量
void out(T a) //参数类型用T代替
{
cout << a << endl;
ca = a;
}
};
int main() {
int a = 112;
char str[10] = "hello";
cOut<int> ct;//定义类对象
ct.out(a);
cOut<char*> cs;
cs.out(str);
}
运行效果:
这里的模板类跟模板函数一样,编译器是没有生成具体的代码的。
所以在定义模板类对象时,必须显式指定类型,告诉编译器生成那种类型的类代码实例化。
如:
cOut<int> ct;//int类型
cOut<char*> cs;// char *类型
就是尖括号加类型名。
所以我们以后看到类似的定义就能知道这大概是个模板类呢,不要奇怪这种用法。