泛型编程
泛型编程是指:应用一个非凡的类型(泛型)来定义变量,写一个模板函数,以适应传递不同类型的参数,下列的 T1 和 T2 就是一种泛型。
template <class T1,class T2>
- 留神:模板不反对拆散编译,即申明在 .h 文件,定义在 .cpp 文件。
- 然而能够在.h文件中定义,而后在蕴含这个h头文件的 .cpp 文件中利用。
一般函数在编译时函数名会被编译称特殊符号。
int add(int a,int b); //编译时会被编译成 _Z4addii(?)
- 而函数模板在编译阶段基本不会被编译为特殊符号,因为它没有实例化。
- 所以在链接时,依据_Z4addii这个名字会找不到对应的函数原型。
函数模板
- 申明办法:template <class T> 示意将 T 申明为一种变量类型(泛型)
- 依据传入的参数类型,T能够主动匹配对应的类型。
- 这样就能够使一个函数能够用于不同变量类型中,减少函数的复用,这就是函数模板。
- 不同中央调用函数模板时,调用的不是同一个函数,尽管都是同一个模板
- 编译器在这里,将模板依据实参类型进行了实例化,实例化成不同的函数。
- 留神:如果存在非模板函数的同名函数,如果条件雷同的状况下,则会优先调用非模板函数。
template <class T1,class T2>T1 ADD(T1& x1, T2& x2){ return x1+x2;}int main(){ int a1 = 10, b1 = 20; char a2 = 5, b2 = 10; ADD(a1, b1); //这个与上面这个都是调用的Swap函数 ADD(a1, a2); //然而调用的不是同一个函数 cout << "a1 = " << a1 << " b1 = " << b1 << endl; cout << "a2 = " << a2 << " b2 = " << b2 << endl; return 0;}
类模板
- 在类中某些变量类型应用泛型,定义对象时必须应用显性实例化对象,否则编译器无奈判断是什么变量类型。
template <class T1>class vector{public: T1 _a; int _size; int _capacite;};int main(){ vector<int> v1; vector<char> v2; v1._a = 10; //存储int类型 v2._a = 'a'; //存储char类型 return 0;}
模板参数
- 模板参数分为类型形参和非类型形参。
类型形参
下列 T1 就是类型形参,能够像 int 等作为变量类型,用来定义变量。
template <class T1>class vector{public: T1 _a; int _size; int _capacite;};
非类型形参
- 下列 N 就是非类型形参,不能作为变量类型,然而能够作为常量应用。
留神:
- 浮点数、类对象、字符串等不能作为非类型形参(只能是整形)
- 非类型的模板参数必须在编译阶段就能确认后果。
- 非类型形参在类的外部无奈更改。
template <class T1,size_t N = 10>class vector{public: };