建网站 需要签署协议,典当网站,网络营销工具的使用,网站维护的内容一、什么是类模板 类模板用于建立一个通用类#xff0c;类中的成员数据类型可以不具体指定#xff0c;用一个虚拟的类型来代替。它的语法格式如下#xff1a;
templatetypename T类模板与函数模板相比主要有两点区别#xff1a;1) 类模板没有自动类型推导的方式。…一、什么是类模板 类模板用于建立一个通用类类中的成员数据类型可以不具体指定用一个虚拟的类型来代替。它的语法格式如下
templatetypename T类模板与函数模板相比主要有两点区别1) 类模板没有自动类型推导的方式。2) 类模板在模板参数中可以有默认参数。
#include iostreamusing namespace std;// 类模板中可以使用默认参数
templateclass NameType, typename AgeTypeint
class Person
{
public:NameType name;AgeType age;Person(void) {}Person(NameType name, AgeType age) : name(name), age(age) {}void showPerson(void){cout {name: name , age: age } endl;}
};int main(void)
{// 指定NameType为stringAgeType默认为intPersonstring p1(Sakura, 10);p1.showPerson();return 0;
}类模板中的成员函数并不是一开始就创建的而是在模板调用时再生成的。 二、类模板对象做函数参数 类模板对象也可以作为函数的参数总共有三种方式传入
指定传入的类型 —— 直接显示对象的数据类型。参数模板化 —— 将对象中的参数变为模板进行传递。整个类模板化 —— 将这个对象类型模板化进行传递。
#include iostreamusing namespace std;// 类模板中可以使用默认参数
templateclass NameType, typename AgeTypeint
class Person
{
public:NameType name;AgeType age;Person(void) {}Person(NameType name, AgeType age) : name(name), age(age) {}void showPerson(void){cout {name: name , age: age } endl;}
};// 1、指定传入类型
void printPerson1(Personstring, int p)
{p.showPerson();
}// 2、参数模板化
template typename NameType, typename AgeType
void printPerson2(PersonNameType, AgeType p)
{p.showPerson();
}// 3、这个类模板化
templatetypename T
void printPerson3(T p)
{p.showPerson();
}int main(void)
{Personstring, int p(Sakura, 10);printPerson1(p);printPerson2(p);printPerson3(p);return 0;
}三、类模板与继承 当子类继承的父类是一个类模板时子类在声明的时候要指出父类中 T 的类型。如果不指定编译器无法给子类分配内存。如果想要灵活指定出父类父类中的 T 的类型子类也需要变成类模板。
#include iostreamusing namespace std;templatetypename T
class SuperClass
{
public:T a;
};// 子类继承模板类必须知道父类中T类型
class SubClass1 : public SuperClassstring
{};// 如果想要灵活指定父类中T类型则需要使用模板类
templatetypename T1, typename T2
class SubClass2: public SuperClassT1
{T2 b;
};int main(void)
{SubClass1 subClass1;SubClass2string, int subClass2;return 0;
}四、类模板成员函数类外实现 类模板中成员函数的类外实现时需要加上模板参数列表。 新建一个 person.hpp 文件用来保存类的声明和方法。
#pragma once
#include iostreamusing namespace std;// 类模板中可以使用默认参数
templateclass NameType, typename AgeTypeint
class Person
{
public:NameType name;AgeType age;Person(void);Person(NameType name, AgeType age);void showPerson(void);
};在包含 main() 函数的文件中包含刚才定义的头文件然后使用。
#include iostream
// 这里不要包含头文件要包含源文件
// #include person.hppusing namespace std;int main(void)
{Personstring p1(Sakura, 10);p1.showPerson();return 0;
}五、类模板与友元 修改 person.hpp 文件中内容。
#pragma once
#include iostream
#include cstringusing namespace std;templatetypename NameType, typename AgeType
class Person;templatetypename NameType, typename AgeType
void showPerson(PersonNameType, AgeType p);// 类模板中可以使用默认参数
templateclass NameType, typename AgeTypeint
class Person
{// 加空模板的参数列表/// 如果全局函数是类外实现的需要让编译器提前知道这个函数的存在friend void showPerson(PersonNameType, AgeType p);private:NameType name;AgeType age;public:Person(void);Person(NameType name, AgeType age);
};// 类模板的构造函数类外实现
templatetypename NameType, typename AgeType
PersonNameType, AgeType::Person(void) {}templatetypename NameType, typename AgeType
PersonNameType, AgeType::Person(NameType name, AgeType age)
{this-name name;this-age age;
}// 全局函数做友元类外实现
templatetypename NameType, typename AgeType
void showPerson(PersonNameType, AgeType p)
{cout {name: p.name , age: p.age } endl;
}修改包含 main() 函数的文件中的内容。
#include iostream
#include person.hppusing namespace std;int main(void)
{Personstring p1(Sakura, 10);showPerson(p1);return 0;
}