【嵌入式——C++】模板

【嵌入式——C++】 模板

  • 概念
  • 函数模板
  • 类模板

概念

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

函数模板

建立一个通用的函数,其函数的返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

//函数声明或定义
template<typename T>

template//声明创建模板

typename//表名其后面的符合是一个数据类型可以用class代替

T //通用的数据类型,名称可以替换,通常为大写字母
template <typename T>
void mySwap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

void test01() {
    int a = 10;
    int b = 20;
    mySwap(a, b);
    mySwap<int>(a, b);
    qDebug() << a;
    qDebug() << b;
}

自动类型推导,必须推导出一致的数据类型T,才可以使用。
模板必须要确定出T的数据类型,才可以使用。

普通函数与模板函数的区别

  • 普通函数调用可以发生隐士类型转换;
  • 函数模板用自动类型推导,不可以发生隐士类型转换mySwap(a, b);
  • 函数模板用显示指定类型可以发生隐士类型转换mySwap(a, b);

类模板

建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。
语法template

示例

template <class NameType, class AgeType>
class Person {
public:
    Person(NameType name, AgeType age) {
        this->name = name;
        this->age = age;
    }
    NameType name;
    AgeType age;
};

Person<string,int> p("fxy",99);

类模板和函数模板的区别

  • 类模板没有自动类型推导的使用方式,Person p(“fxy”,99);这么写是错误的;
  • 类模板在模板参数列表中可以有默认参数,template

类模板中成员函数创建时机

  • 普通类中的成员函数一开始就可以创建;
  • 类模板中的成员函数在调用时才创建。

类模板与继承
当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型。如果不指定,编译器无法给子类分配内存。

template <class T>
class Base {
    T m;
};

class Son : public Base<int> {
};

如果想灵活指定出父类中T的类型,子类也需变为类模板。

template <class T1,class T2>
class Son2:public Base<T2>{
    T1 obj;
};

成员函数类外实现

template <class T1, class T2>
class Person1 {
    Person1(T1 name, T2 age);
};

template <class T1, class T2>
Person1<T1, T2>::Person1(T1 name, T2 age) {
    this->name = name;
    this->age = age;
}

你可能感兴趣的:(c++,开发语言,qt,物联网)