共计 1197 个字符,预计需要花费 3 分钟才能阅读完成。
泛型编程
-
泛型编程是指:应用一个非凡的类型(泛型)来定义变量,写一个模板函数,以适应传递不同类型的参数,下列的 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:};
正文完