C++类模板深入理解2
1、认识在Template中Typename和class关键词。
在c++的Template中很多地方都用到了typename与class这两个关键字,而且有时候二者可以替换,那么是不是这两个关键字完全一样呢?事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename T>.在模板定义语法中关键字class与typename的作用完全一样。所以这原本是C++设计时没有考虑的一个问题。
回到我们的正题,首先认识什么是类模板?
(1) 什么是类模板
一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。
如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。
template<typename T>
class A
{ public:
A(T t)
{ this->t= t;
}
T &getT( )
{ return t;
}
protected:
public:
T t;
};void main()
{ //模板了中如果使用了构造函数,则遵守以前的类的构造函数的调用规则
A<int> a(100);
a.getT();
return;
}
2 继承中的类模板
注意:
子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么(数据类型的本质:固定大小内存块的别名)A<int>
class B :public A<int>
{ public:
B(int i) : A<int>(i) //实例化基类抽象类型参数
{
}
void printB()
{ cout<<"A:"<<t<<endl;
}
protected:
private:
};