类模板语法
类模板作用:
- 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。
语法:
template<typename T>
类
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
template<class NameType, class AgeType>
class Person {
public:
Person(NameType name,AgeType age) {
this->m_Age = age;
this->m_Name = name;
};
void ShowPerson() {
cout << "name: " << this->m_Name << " age: " << this->m_Age << endl;
}
NameType m_Name;
AgeType m_Age;
};
void example() {
Person<string, int> p1("Tom", 18);
//尖括号的内容是模板参数列表
p1.ShowPerson();
}
类模板和函数模板的区别
- 类模板没有自动类型推导的使用方式
类模板在模板的参数列表中可以有默认参数。
template <class NameType,class AgeType = int>
class Person {
public:
Person(NameType name,AgeType age) {
this->m_age = age;
this->m_name = name;
}
void showPerson() {
cout << "name: " << this->m_name << " age:" << this->m_age << endl;
}
NameType m_name;
AgeType m_age;
};
void example() {
Person<string, int> p("Tom", 100);//因为类模板不能自动类型推导,只能用显示数据类型
p.showPerson();
//We could have a default type here, so we don't have to point one
Person <string> p2("Jack", 10);
}
类模板中的成员函数创建时机
二者创建的时机有区别。
普通类的成员函数一开始就可以创建
但是类模板的成员函数在调用的时候才创建。
class Person1
{
public:
void showPerson1()
{
cout << "Person1 show" << endl;
}
};
class Person2
{
public:
void showPerson2()
{
cout << "Person2 show" << endl;
}
};
template<class T>
class MyClass
{
public:
T obj;
//类模板中的成员函数,并不是一开始就创建的,而是在模板调用时再生成
void fun1() { obj.showPerson1(); }
void fun2() { obj.showPerson2(); }
};
void test01()
{
MyClass<Person1> m;
m.fun1();
//m.fun2();//编译会出错,说明函数调用才会去创建成员函数
}
int main() {
test01();
system("pause");
return 0;
}
上述代码在不进行实例化的时候,模板类不会被创建,所以不存在Myclass这个类,编译正常通过,如果将其实例化,则无法编译通过。
类模板对象做函数参数
制定传入的类型 —直接显示对象的数据类型
- 参数模板化 —将对象中的参数变为模板进行传递
- 整个类模板化 —将这个对象类型 模板化进行传递 ```cpp
template
打印结果是:
```cpp
name= 张三 age= 18
name= 李四 age= 20
T1的类型是class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
T2的类型是int
name= 王五 age= 25
T的数据类型是:class Person<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>