1.类模版语法
类模版作用
*建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟函数类型来代表.
语法:
template<typename T>
类
解释:template -- 声明创建模版
typename -- 表面其后面的符号是一种数据类型,可以用class代替
T -- 通用的数据类型,名称可以替换,通常为大写字母
//类模版
template<class NameType,class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->m_Name = name;
this->m_Age = age;
}
void showPerson()
{
cout << "name:" << this->m_Name << "age:" << this->m_Age << endl;
}
NameType m_Name;
AgeType m_Age;
};
void test01()
{
Person<string, int> p1("孙悟空", 999);
}
2.类模版与函数模版区别
类模版与函数模版的区别主要有两点:
1.类模版没有自动类型推导的使用方式
2.类模版在模版参数列表中可以有默认参数
//类模版与函数模版区别
template<class NameType,class AgeType = int>//默认情况下告诉编译器是个整型
class Person
{
public:
Person(NameType name, AgeType age)
{
this->m_Name = name;
this->m_Age = age;
}
void showPerson()
{
cout << "name: " << this->m_Name << "age=" << this->m_Age << endl;
}
NameType m_Name;
AgeType m_Age;
};
//1.类模版没有自动类型推导使用方式
void test01()
{
//Person p("孙悟空",1000);//错误,无法用自动类型推导
Person<string,int> p("孙悟空", 1000);//正确,只能用显示指定类型
p.showPerson();
}
//2.类模版在模版参数列表中可以有默认方式参数
void test02()
{
Person<string>p("猪八戒", 999);
}
3.类模版中成员函数创建时机
*类模版中的成员函数在调用时才创建
4.类模版对象做函数参数
学习目标:
*类模版实例化出的对象,向函数传参的方式
一共有三种传入方式:
1.指定传入的类型 -- 直接显示对象的数据类型
2.参数模版化 -- 将对象的参数变为模版进行传递
3.整个类模版化 -- 将这个对象类型模版进行传递
//类模版对象做函数参数
template<class T1,class T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->m_Name = name;
this->m_Age = age;
}
void showPerson()
{
cout << "姓名: " << this->m_Name << "年龄: " << this->m_Age << endl;
}
T1 m_Name;
T2 m_Age;
};
//1.指定传入类型
void printPerson1(Person<string, int>& p)
{
p.showPerson();//类模版的对象做函数中的参数
}
void test01()
{
Person<string, int>p("孙悟空", 100);
/*这时不是通过p - 这个孙悟空去直接调这个showPerson,
而是把他传到一个函数中,让他作为实参,在函数体内部中去调用这个成员函数*/
}
//2.参数板化
template<class T1,class T2>
void printPerson2(Person<T1, T2>& p)
{
p.showPerson();
cout << "T1的类型为: " << typeid(T1).name * () << endl;
cout << "T2的类型为: " << typeid(T2).name * () << endl;
}
void test02()
{
Person<string, int>p("猪八戒", 90);
}
//3.整个类模版化
template<class T>
void printPerson3(T& p)
{
p.showPerson();
}
void test03()
{
Person<string, int>p("唐僧", 30);
printPerson3(p);
}
5.类模版与继承
当类模版碰到继承时,需要注意一下几点:
*当子类继承的父类是一个模版时,子类在声明的时候,要指定出父类中T的类型
* 如果不指定,编译器无法给子类分配内存
* 如果想灵活指定出父类中T类型,子类也需要变为类模版
//类模版与继承
template<class T>
class Base
{
T m;
};
//class Son :public Base
//报错,因为不知道继承下来的东西占多少空间,必须要知道父类中的T类型才能继承给子类
class Son :public Base<int>
{
};
void test01()
{
Son s1;
}
//如果想灵活指定父类中T类型,子类也需要变类模版
template<class T1,class T2>
class Son2 :public Base<T2>
{
T1 obj;
};
void test02()
{
Son2<int, char>S2;
}