C++模板

泛型编程

  • 泛型编程是指:使用一个特殊的类型(泛型)来定义变量,写一个模板函数,以适应传递不同类型的参数,下列的 T1 和 T2 就是一种泛型。

    template 
  • 注意:模板不支持分离编译,即声明在 .h 文件,定义在 .cpp 文件。
  • 但是可以在.h文件中定义,然后在包含这个h头文件的 .cpp 文件中应用。
  • 普通函数在编译时函数名会被编译称特殊符号。

    int add(int a,int b);   //编译时会被编译成 _Z4addii(?)
  • 而函数模板在编译阶段根本不会被编译为特殊符号,因为它没有实例化。
  • 所以在链接时,根据_Z4addii这个名字会找不到对应的函数原型。

函数模板

  • 声明方法:template 表示将 T 声明为一种变量类型(泛型)
  • 根据传入的参数类型,T可以自动匹配对应的类型。
  • 这样就可以使一个函数可以用于不同变量类型中,增加函数的复用,这就是函数模板。
  • 不同地方调用函数模板时,调用的不是同一个函数,虽然都是同一个模板
  • 编译器在这里,将模板根据实参类型进行了实例化,实例化成不同的函数。
  • 注意:如果存在非模板函数的同名函数,如果条件相同的情况下,则会优先调用非模板函数。
template 
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;
}

C++模板_第1张图片

类模板

  • 在类中某些变量类型使用泛型,定义对象时必须使用显性实例化对象,否则编译器无法判断是什么变量类型。
template 
class vector
{
public:
    T1 _a;
    int _size;
    int _capacite;
};

int main()
{
    vector v1;   
    vector v2;
    v1._a = 10;    //存储int类型
    v2._a = 'a';   //存储char类型
    return 0;
}

模板参数

  • 模板参数分为类型形参和非类型形参。

类型形参

  • 下列 T1 就是类型形参,可以像 int 等作为变量类型,用来定义变量。

    template 
    class vector
    {
    public:
      T1 _a;
      int _size;
      int _capacite;
    };

    非类型形参

  • 下列 N 就是非类型形参,不能作为变量类型,但是可以作为常量使用。
  • 注意:

    • 浮点数、类对象、字符串等不能作为非类型形参(只能是整形)
    • 非类型的模板参数必须在编译阶段就能确认结果。
    • 非类型形参在类的内部无法更改。
template 
class vector
{
public:
    
};

你可能感兴趣的:(c++)