一.使用
类模板和函数模板的定义和使用类似。
函数模板:https://blog.csdn.net/weixin_44190648/article/details/121934692
有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。
- 类模板用于实现类所需数据的类型参数化。
- 类模板在表示数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的数据类型的影响。
- 类模板必须显式指定类型。
- 类模板在调用时候,可以自动推导类型。
template<class T>
class Person {
public:
T mId;
T mAge;
Person(T mId,T mAge) {
this->mId = mId;
this->mAge = mAge;
}
void Show() {
cout << "ID:" << this->mId << ",Age:" << this->mAge << endl;
}
};
void test01() {
//函数模板在调用的时候,可以自动类型推导
//类模板必须显式指定类型
Person<int> p(10, 20);//<int>指定类型
p.Show();
Person<string> p1("123", "123");
p1.Show();
}
结果:
二.类模板派生普通类
template<class T>
class Person {
public:
Person() {
this->mAge = 0;
}
T mAge;
};
//继承Person类
class SubPerson :public Person<int> {//必须定义类型
};
派生的普通类必须定义父类类型。
原因:类区定义对象,这个对象需要编译器分配空间。
三.类模板派生类模板
template<class T>
class Animal {
public:
T mAge;
Animal(T age) {
this->mAge = age;
}
void Jiao() {
cout << mAge << "猫猫在叫" << endl;
}
};
//派生模板类
template<class T>
class Cat :public Animal<T> {};
四.类模板—类内和类外实现
类内:
太简单了!
类外:
template<class T1,class T2>
class Person {
private:
T1 mName;
T2 mAge;
public:
Person(T1 name,T2 age);
void Show();
};
template<class T1,class T2>//注意
Person<T1,T2>::Person(T1 name,T2 age) {//注意
this->mName = name;
this->mAge = age;
}
template<class T1, class T2>
void Person<T1,T2>::Show() {
cout << "Name=" << mName << ",Age=" << mAge << endl;
}
void Test() {
Person<string,int> p1("aaa", 25);//注意
p1.Show();
}
运行结果:
五.类模板中使用友元
方法一:Linux和window都可以编译通过。
template<class T1, class T2>
class Person
{
//方法一:友元函数
friend ostream& operator<<<T1,T2>(ostream& os, Person<T1,T2>& p);
public:
Person(T1 name, T2 age);
private:
T1 mName;
T2 mAge;
};
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) {
this->mName = name;
this->mAge = age;
}
template<class T1, class T2>
ostream& operator<<(ostream& os,Person<T1,T2>& p) {// <<操作符重载
os << "Age=" << p.mAge << ",Name=" << p.mName << endl;
return os;
}
int main() {
Person<string, int> p1("aaa", 25);
cout << p1 << endl;
}
方法二:window可以编译通过,Linux不能编译通过。
template<class T1, class T2>
class Person
{
template<class T1, class T2>//方法二:友元函数
friend ostream& operator<<(ostream& os, Person<T1,T2>& p);
public:
Person(T1 name, T2 age);
private:
T1 mName;
T2 mAge;
};
template<class T1, class T2>
Person<T1, T2>::Person(T1 name, T2 age) {
this->mName = name;
this->mAge = age;
}
template<class T1, class T2>
ostream& operator<<(ostream& os,Person<T1,T2>& p) {// <<操作符重载
os << "Age=" << p.mAge << ",Name=" << p.mName << endl;
return os;
}
int main() {
Person<string, int> p1("aaa", 25);
cout << p1 << endl;
}