C++模板 — 类模板

请先阅览函数模板相关内容:C++模板 — 函数模板

类模板的定义

1、格式与写法:

#include
using namespace std;
//定义类模板
template
class Ha
{
public:Ha(T1 _t1, T2 _t2);void show();private:T1 t1;T2 t2;
};//类模板的类模板函数的类外定义
template
Ha::Ha(T1 _t1, T2 _t2)
{t1 = _t1;t2 = _t2;
}//类模板的普通函数类外定义
template
void Ha::show()
{T1 tt = t1;cout << "t1=" << t1 << ",t2=" << t2 << endl;
}int main()
{Ha aa(1,2);aa.show();system("pause");return 0;
}

类模板特性

1. 类模板和函数模板的区别

  •  类模板没有自动类型推导的使用方式
  • 类模板在模板参数列表中可以有默认参数

点击查看实现代码

2. 类模板中成员函数和普通类中成员函数创建时机有区别

  • 普通类中的成员函数一开始就可以创建
  • 类模板中的成员函数在调用时才创建

点击查看实现代码:

3. 类模板对象作为函数参数

类模板对象一共有三种传入方式:

  1. 指定传入的类型   --- 直接显示对象的数据类型【最常用】
  2. 参数模板化    --- 将对象中的参数变为模板进行传递
  3. 整个类模板化   --- 将这个对象类型 模板化进行传递

点击查看实现代码:

类模板与继承

相关规则:

  1. 当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型
  2. 如果不指定,编译器无法给子类分配内存
  3. 如果想灵活指定出父类中T的类型,子类也需变为类模板
template  //类模板
class A
{Tl v1; T2 v2;
};template 
class B : public A  //错误写法:“class B:public A”;因为必须知道父类中的T类型才能继承给子类
{T1 v3; T2 v4;
};template 
class C : public B 
{T v5;
};int main()
{B obj1;C obj2;return 0;
}

当编译到main函数中的第一个语句:“B<int, double> obj1;”,编译器用 int 替换类模板 B 中的 T1,用 double 替换 T2,生成 B 类如下:

class B : public A 
{int v3; double v4;
};

B 的基类是 A 。于是编译器就要用 double 替换类模板 A 中的 T1,用 int 替换 T2,生成 A 类如下:

class A 
{double v1; int v2;
};

 

 

类模板中的静态成员

类模板中可以定义静态成员,从该类模板实例化得到的所有类都包含同样的静态成员

#include 
using namespace std;template 
class A
{
private:static int count;
public:A() { count++; }~A() { count--; };A(A &) { count++; }static void PrintCount() { cout << count << endl; }
};template<> int A::count = 0;
template<> int A::count = 0;int main()
{A ia;A da;ia.PrintCount();da.PrintCount();return 0;
}

 

注:部分源代码和阐述出自“黑马程序员相关课程”!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部