C++知识梳理-模板-类模板
一 类模板的基本语法规则//定义 templateclass T1,class T2 class 类名 { public: 返回值类型 函数名T1 变量_1,T2 变量_2 T1 变量_1; T2 变量_2; } //调用 类名数据类型_1,数据类型_2p; p.函数名参数_1参数_2);类模板与函数模板有两区别1 类模板没有自动推导类型的调用 2 类模板允许参数列表有默认参数。第2条举例如下。templateclass T1,class T2 int类模板成员函数只有在调用的时候才会建立。二 类模板的使用1.类模板作为函数对象时候有以下三种用法//1 指定传入类型 void function1(Personstring,intp) { p.pfunction(); } //2 参数模板化 templateclass T1,class T2 void function2(PersonT1, T2 p) { p.pfunction(); //如何看出模板参数是什么类型 //typeid(T1).name() } //3 整个类模板化 templateclass T void function3(T p) { p.pfunction(); }2.类模板中的继承1 父是类模板子类继承需要指明类型 2 若子也想灵活则需要也是类模板//1 如果父类是类模板 子类需要明确指出父类中T的数据类型 class Son :public Baseint { }; //如果子类想灵活的继承父类子类也需要是类模板 templateclass T1,class T2 class Son2 :public BaseT2 { public: T1 obj; };3.类模板成员函数类外实现返回值类型 作用域class T1,class T2::成员函数参数列表 {} 作用域class T1,class T2::构造析构函数参数列表 {}4.类模板分文件时候直接就是整合成.hpp文件调用就好了5.类模板与友元1 全局函数 类内实现 2全局函数 类外实现比较复杂用的很少//全局函数 类内实现 templateclass T1,class T2 class Person { friend void printPerson(PersonT1, T2p) { cout name: p.m_name age: p.m_age endl; } public: Person(T1 name, T2 age) { m_name name; m_age age; } private: T1 m_name; T2 m_age; }; //全局函数 类内实现类的声明函数定义需要放在类前面 //提前知道类的存在 templateclass T1, class T2 class Person; //函数模板的实现 templateclass T1, class T2 void printPerson2(PersonT1, T2p) { cout name: p.m_name age: p.m_age endl; } templateclass T1,class T2 class Person { friend void printPerson(PersonT1, T2p) { cout name: p.m_name age: p.m_age endl; } //全局函数 类外实现 //加空模板的参数列表 //如果全局函数 是类外实现 需要让编译器提前知道这个函数的存在 friend void printPerson2(PersonT1, T2p); //属于普通函数声明 public: Person(T1 name, T2 age) { m_name name; m_age age; } private: T1 m_name; T2 m_age; };