有用unity做网站的吗,鞍山58同城二手房出售,企业网站空间在哪里,建设银行网站钓鱼网站类模板类模板是通用类的描述#xff0c;使用任意类型#xff08;泛型#xff09;来描述类的定义。使用类模板的时候#xff0c;指定具体的数据类型#xff0c;让编译器生成该类型的类定义。注意#xff1a;函数模板中可以不指定具体数据类型#xff0c;让编译器自动推到…类模板类模板是通用类的描述使用任意类型泛型来描述类的定义。使用类模板的时候指定具体的数据类型让编译器生成该类型的类定义。注意函数模板中可以不指定具体数据类型让编译器自动推到但是类模板不可以。注意模板编程不支持分离式编译即模板类/模板函数的声明与定义应该放在头文件里否则会在链接时报错template class T
class 类模板名
{类的定义;
};注意1在创建对象的时候必须指明具体的数据类型。2使用类模板时数据类型必须适应类模板中的代码。3类模板可以为通用数据类型指定缺省的数据类型C11标准的函数模板也可以。4模板类的成员函数可以在类外实现。5可以用new创建模板类对象。6在程序中模板类的成员函数使用了才会创建。下面给出示例#include iostream // 包含头文件。
using namespace std; // 指定缺省的命名空间。
template class T1, class T2 string
class AA
{
public:T1 m_a; // 通用类型用于成员变量。T2 m_b; // 通用类型用于成员变量。AA() {} // 默认构造函数// 通用类型用于成员函数的参数。AA(T1 a, T2 b) :m_a(a), m_b(b) { }// 通用类型用于成员函数的返回值。T1 geta() // 获取成员m_a的值。{T1 a 2; // 通用类型用于成员函数的代码中。return m_a a;}T2 getb(); // 获取成员m_b的值。
};template class T1, class T2
T2 AAT1, T2::getb() // 获取成员m_b的值。
{return m_b;
}
int main()
{AAint, string* a new AAint, string(3, 西施); // 用模板类AA创建对象a。cout a-geta() a-geta() endl;cout a-getb() a-getb() endl;delete a;return 0;
}类模板全特化和部分特化模板类具体化特化、特例化有两种完全具体化和部分具体化。具体化程度高的类优先于具体化程度低的类具体化的类优先于没有具体化的类。具体化的模板类成员函数类外实现的代码应该放在源文件中。下面给出示例#include iostream
using namespace std; // 类模板
templateclass T1, class T2
class AA {
public:T1 m_x;T2 m_y;AA(const T1 x, const T2 y) :m_x(x), m_y(y) { cout 类模板构造函数。\n; }void show() const;
};
templateclass T1, class T2
void AAT1, T2::show() const
{cout 类模板x m_x , y m_y endl;
}
// 类模板特化
template
class AAint, string {
public:int m_x;string m_y;AA(const int x, const string y) :m_x(x), m_y(y) { cout 完全具体化构造函数。\n; }void show() const;
};void AAint, string::show() const
{cout 完全具体化x m_x , y m_y endl;
}
// 类模板部分特化
templateclass T1
class AAT1, string {
public:T1 m_x;string m_y;AA(const T1 x, const string y) :m_x(x), m_y(y) { cout 部分具体化构造函数。\n; }void show() const;
};
templateclass T1
void AAT1, string::show() const
{cout 部分具体化x m_x , y m_y endl;
}
int main()
{// 具体化程度高的类优先于具体化程度低的类具体化的类优先于没有具体化的类。AAint, string aa1(8, 张三); // 将使用完全具体化的类。AAchar, string aa2(8, 李四); // 将使用部分具体化的类。AAint, double aa3(8, 9666); // 将使用模板类。
}模板类于继承1模板类继承普通类常见。2普通类继承模板类的实例化版本。3普通类继承模板类。(常见)4模板类继承模板类。5模板类继承模板参数给出的基类不能是模板类。下面主要讲普通类继承模板类#include iostream
using namespace std; templateclass T1, class T2
class BB
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) : m_x(x), m_y(y) { cout 调用了BB的构造函数。\n; }void func2() const { cout 调用了func2()函数x m_x , y m_y endl; }
};templateclass T1, class T2
class AA:public BBT1,T2 // 普通类AA变成了模板类才能继承模板类。
{
public:int m_a;AA(int a, const T1 x, const T2 y) : BBT1,T2(x,y),m_a(a) { cout 调用了AA的构造函数。\n; }void func1() { cout 调用了func1()函数m_a m_a endl;; }
};int main()
{AAint,string aa(3,8, 我是一只傻傻鸟。);aa.func1();aa.func2();return 0;
}模板类继承模板类#include iostream // 包含头文件。
using namespace std; // 指定缺省的命名空间。templateclass T1, class T2
class BB // 模板类BB。
{
public:T1 m_x;T2 m_y;BB(const T1 x, const T2 y) : m_x(x), m_y(y) { cout 调用了BB的构造函数。\n; }void func2() const { cout 调用了func2()函数x m_x , y m_y endl; }
};templateclass T1, class T2
class AA:public BBT1,T2 // 普通类AA变成了模板类才能继承模板类。
{
public:int m_a;AA(int a, const T1 x, const T2 y) : BBT1,T2(x,y),m_a(a) { cout 调用了AA的构造函数。\n; }void func1() { cout 调用了func1()函数m_a m_a endl;; }
};templateclass T, class T1, class T2
class CC :public BBT1, T2 // 模板类继承模板类。
{
public:T m_a;CC(const T a, const T1 x, const T2 y) : BBT1, T2(x, y), m_a(a) { cout 调用了CC的构造函数。\n; }void func3() { cout 调用了func3()函数m_a m_a endl;; }
};int main()
{CCint,int,string cc(3,8, 芜湖);cc.func3();cc.func2();
}模板类继承模板参数给出的基类#include iostream // 包含头文件。
using namespace std; // 指定缺省的命名空间。class AA {
public:AA() { cout 调用了AA的构造函数AA()。\n; }AA(int a) { cout 调用了AA的构造函数AA(int a)。\n; }
};class BB {
public:BB() { cout 调用了BB的构造函数BB()。\n; }BB(int a) { cout 调用了BB的构造函数BB(int a)。\n; }
};class CC {
public:CC() { cout 调用了CC的构造函数CC()。\n; }CC(int a) { cout 调用了CC的构造函数CC(int a)。\n; }
};templateclass T
class DD {
public:DD() { cout 调用了DD的构造函数DD()。\n; }DD(int a) { cout 调用了DD的构造函数DD(int a)。\n; }
};templateclass T
class EE : public T { // 模板类继承模板参数给出的基类。
public:EE() :T() { cout 调用了EE的构造函数EE()。\n; }EE(int a) :T(a) { cout 调用了EE的构造函数EE(int a)。\n; }
};int main()
{EEAA ea1; // AA作为基类。EEBB eb1; // BB作为基类。EECC ec1; // CC作为基类。EEDDint ed1; // DDint作为基类。// EEDD ed1; // DD作为基类错误。
}