1.类模板基本语法
template<class TypeName,class TypeAge>
class Person
{
public:
Person(TypeName name, TypeAge age)
{
this->name = name;
this->age = age;
}
void Show()
{
cout << "name:" << this->name << endl;
cout << "age:" << this->age << endl;
}
TypeName name;
TypeAge age;
};
void test01()
{
Person<string, int> p("Tom", 20);//(实例化)在此指定希望的数据类型
p.Show();
}
2.类模板与函数模板的区别
<1>类模板没有自动类型推导,因此调用时必须显式地定义数据类型
template<class TypeName,class TypeAge>
class Person
{
public:
Person(TypeName name, TypeAge age)
{
this->name = name;
this->age = age;
}
void Show()
{
cout << "name:" << this->name << endl;
cout << "age:" << this->age << endl;
}
TypeName name;
TypeAge age;
};
void test01()
{
//Person<> p("Tom", 20);隐式指定类型,CPP无法推出所属类型。必须显式指定数据类型
Person<string, int> p("Tom", 20);
p.Show();
}
<2>类模板中可以有默认数据类型,而函数模板则不可以
template<class TypeName,class TypeAge = int>//在此指定了TypeAge的默认参数
class Person
{
public:
Person(TypeName name, TypeAge age)
{
this->name = name;
this->age = age;
}
void Show()
{
cout << "name:" << this->name << endl;
cout << "age:" << this->age << endl;
}
TypeName name;
TypeAge age;
};
void test01()
{
Person<string> p("Tom", 20);//因为第二个数据类型已经指定,所以调用时可以不用显式声明数据类型
p.Show();
}
3.类模板中的成员函数的创建时机
在一开始定义类模板时,成员函数不进行创建;只有在实例化一个对象的时候指定T的数据类型,类模板的成员函数才进行创建。
class c1
{
public:
void showFunc1()
{
cout << "showFunc1()的调用" << endl;
}
};
class c2
{
public:
void showFunc2()
{
cout << "showFunc2()的调用" << endl;
}
};
template<class T>
class myClass
{
public:
T temp;
void show1()
{
temp.showFunc1();
}
void show2()
{
temp.showFunc2();
}
};
void test01()
{
myClass<c1> p;//在此指定T的数据类型之后,成员函数才进行创建
p.show1();
//p.show2();
}
4.类模板与子类继承
template<class T1,class T2>
class Base
{
public:
Base(T1 name, T2 age)
{
this->name = name;
this->age = age;
}
Base()
{
this->name = "Tom";
this->age = 20;
}
T1 name;
T2 age;
};
class Children2 :public Base<string, int>//子类在继承类模板时,必须指定类模板中的成员变量的数据类型
{
public:
};
template<class T1,class T2>
class Children1 :public Base<T1,T2>//如果不指定父类模板的成员变量的数据类型,子类也要写成类模板
{
public:
};
5.类模板的成员函数的类外实现
template<class T1,class T2>
class Person
{
public:
Person(T1 name, T2 age);
void showPerson();
T1 name;
T2 age;
};
template<class T1,class T2>//在类外实现成员函数时,每个成员函数的实现都需要加上模板声明
Person<T1, T2>::Person(T1 name, T2 age)//Person后必须要有<>,强调其是模板类,否则和一般的类无异
{
this->name = name;
this->age = age;
}
template<class T1, class T2>//在类外实现成员函数时,每个成员函数的实现都需要加上模板声明
void Person<T1, T2>::showPerson()//Person后必须要有<>,强调其是模板类,否则和一般的类无异
{
cout << "姓名:" << this->name << " 年龄:" << this->age << endl;
}
void test01()
{
Person<string, int> p("Bob", 18);
p.showPerson();
}
6.类模板与友元函数
如果一个全局函数作为一个类模板的友元函数,那么这个全局函数也必须是函数模板