2.类模板
语法
template<class T>
类
#include <iostream>
using namespace std;
template<class Nametype,class Agetype>
class Person
{
public:
Person(Nametype name, Agetype age)
{
this->name = name;
this->age = age;
}
Nametype name;
Agetype age;
};
int main()
{
Person<string, int>p1("猴", 20);
cout << p1.age << " " << p1.name << endl;
}
1)类模板和函数模板的区别
1.类模板没有自动类型推导的使用方式
2.类模板在模板参数列表中可以有默认参数
#include <iostream>
using namespace std;
template<class Nametype,class Agetype=int>
class Person
{
public:
Person(Nametype name, Agetype age)
{
this->name = name;
this->age = age;
}
Nametype name;
Agetype age;
};
int main()
{
Person<string>p1("猴", 20);
cout << p1.age << " " << p1.name << endl;
}
2)类模板中成员函数创建时机
普通类中的成员函数一开始就可以创建
类模板中成员函数调用时才创建
3)类模板对象作函数参数
三种传入方式
1:指定传入的类型
2:参数模板化
3:整个类模板化
#include <iostream>
using namespace std;
template<class T1,class T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->m_Age = age;
this->m_Name = name;
}
void show()
{
cout << m_Age << " " << m_Name << endl;
}
T1 m_Name;
T2 m_Age;
};
//1.指定传入的类型
void Print1(Person<string, int>&p)
{
p.show();
}
//2.参数模板化
template <class T1,class T2>
void Print2(Person<T1,T2>&p)
{
p.show();
//显示指定类型
cout << typeid(T1).name() << endl;
cout << typeid(T2).name() << endl;
}
//3.类模板化
template <class T>
void Print3(T &p)
{
p.show();
//显示指定类型
cout << typeid(T).name() << endl;
}
int main()
{
Person<string, int>p("猴", 20);
Print1(p);
Print2(p);
Print3(p);
}
4)类模板与继承
template <class T>
class Father
{
T a;
};class Son:public Father <int> 必须指定数据类型传入父类
为了灵活选择数据类型,子类也为类模板
#include <iostream>
using namespace std;
template<class T>
class Father
{
T a;
};
template <class T1, class T2>
class Son :public Father<T2>
{
public:
Son()
{
cout << typeid(T1).name() << endl;
cout << typeid(T2).name() << endl;
}
T1 a;
};
int main()
{
Son<string, char>son;
}
5)类模板成员函数类外实现
这个比较简单,和成员函数类外实现一样,只需要显式指定类型即可
#include <iostream>
using namespace std;
template <class T1,class T2>
class Person
{
public:
Person(T1 name, T2 age);
void show();
T1 name;
T2 age;
};
template <class T1,class T2>
Person<T1, T2>::Person(T1 name, T2 age)
{
this->age = age;
this->name = name;
}
template <class T1, class T2>
void Person<T1, T2>::show()
{
cout <<this-> name << endl;
cout <<this-> age << endl;
}
int main()
{
Person<string, int>p("猴", 20);
p.show();
}
6)类模板分文件编写
类模板成员函数创建时机在调用阶段,导致分文件编写时链接不到
解决方法:
1.直接包含.cpp源文件
2.将声明和实现写到同一个文件中,并更改后缀名为.hpp
7)类模板与友元
1.全局函数类内实现 ------类内声明友元
2.全局函数类外实现 ------提前让编译器知道全局函数存在
#include <iostream>
using namespace std;
//全局函数类外实现
template <class T1 ,class T2>
class Person;
template <class T1, class T2>
void show2(Person<T1, T2> p)
{
cout << p.name << p.age;
}
template <class T1,class T2>
class Person
{
//全局函数类内实现
friend void show1(Person<T1, T2> p)
{
cout << p.name << p.age;
}
全局函数类外实现 函数模板
friend void show2<>(Person<T1, T2> p);
public:
Person(T1 name,T2 age)
{
this->age = age;
this->name = name;
}
private:
T1 name;
T2 age;
};
void test01()
{
Person<string, int>p("猴子", 20);
show1(p);
}
void test02()
{
Person<string, int>p("猴子", 20);
show2(p);
}
int main()
{
test01();
test02();
}