C++类模板

C++类模板

开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年06月10日

模板是c++减少代码量的一种机制。是把一些繁琐的代码去掉,条件是定义完全相同,数据类型不同,意思是把数据类型参数化,而类型参数化称为参数模板,又为类属。
类模板则复杂一些,因为类有继承、成员、友元等,不过也是为了减少一些代码量,类模板用于实现类所需数据的类型参数化,类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。
它声明和函数模板差不多,但是类属至少要出现一次,如下面例子,Type至少要在Tclass类中出现一次。
例:
template< typename Type >
class TClass
{
private:
Type DateMember;
};
如果没有出现编译器也不会报错,但是template< typename Type >就变成无意义代码,函数的形式参数类型可以是类模板或类模板的引用,对应的实际参数是该类模板实例化的模板类对象。
当一个函数拥有类模板参数时,这个函数必定是函数模板,我前面说到类模板复杂,那么这个复杂则体现之一在类的层次结构,一个类模板在类层次结构中既可以是基类也可以是派生类:类模板派生类模板、类模板派生普通类、普通类派生类模板
从类模板A派生一个类模板B例子如下
class A
{
public:
A (int s); virtual ~A ();
protected:
int size; T * element;
};
template < typename T >
class B : public A < T >
{
public:
B (int low = 0, int height = 1);
private: int min;
};
类模板派生类模板,没有把类A的模板特性丢失。
类模板派生普通类,在定义派生类时要对基类的抽象类参数实例化,从普通类派生类模板,意味着派生类添加了抽象类数据成员。例子如下
template< typename T >
class A
{
public:
A(T x) { t = x; }
void out() { cout << t << endl; }
protected:
T t;
};
class B : public A
{
public:
B(int a, double x) : A (a) { y = x; }
void out() { A ::out(); cout << y << endl; }
protected:
double y;
};
在该例子中,类B在继承类A继承的int类型的类A是把A的模板转化为int类型,所以普通类继承模板类,并不能把模板类的特性继承,而是把模板类转化成某种类型,再继承。
普通类派生模板类只是模板类得到普通的数据成员。比前面两个要简单。
类模板还有一个复杂和繁琐的地方则是在类模板中可以声明各种友元关系, 一个函数或函数模板可以类是或类模板的友元, 一个类或类模板可以是类或类模板的友元类, 声明这种模板之间的友元关系符号比较烦琐,容易出现一些小问题,需要不断的修改。
具体描述如下:
template class X
{
friend void f1();//函数f1成为类模板X实例化的每个模板类的友员函数
}
template class X
{
friend void f2(X &);//对特定类型(如int),使模板函数f2(X&)成为X的友员
}
template class X
{
friend void A::f3();//A类的成员函数f3成为类模板X实例化的每个模板类的友员函数
}
template class X
{
friend void B::f4(X &);
//对特定类型(如int),使模板类B的成员函数f4(X&)成为模板类X的友员
}
template class X
{
friend class Y;// Y类的每个成员函数成为类模板X实例化的每个模板类的友员函数
}
template class X
{
friend class Z;//对特定类型(如int),使模板类Z所有成员函数成为模板类X的友员
}
以上就类模板的内容,大家可以根据自己所需去运用类模板。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值