关于c++:C模板

7次阅读

共计 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:};
正文完
 0