目录
1.2 模板类的派生与继承(仅介绍模板类继承非模板类和从模板类派生一个类模板的情况)
一、 类模板
1.1 模板类基础语法
声明类模板
template <typename T> 或者 template < class T> //带参数T的模板声明,类型T不是类,而是对类的描述,常称为类模板
模板类声明的一般方法
template <类模板参数>
class 类名
{
//类体
};
用类模板定义对象
类名 <模板实例化参数模型> 对象名 (构造函数实参列表);
类名 <模板实例化参数模型> 对象名; //默认或者无参数构造函数
在类体外面定义成员函数时,必须用template重写模板类声明。
template <类模板参数>
返回类型 类名 <模板类型参数> :: 成员函数名(函数参数列表)
{
//函数体
}
<模板类型参数> 是指 template 的"<>"内使用 class(或typename) 声明的类型参数,构造函数和析构函数没有返回类型,另外C++函数的返回值类型可以是除数组和函数以外的任何类型。
1.2 模板类的派生与继承(仅介绍模板类继承非模板类和从模板类派生一个类模板的情况)
模板类继承非模板类时,由它派生的类的数据成员可以是不同的类型,而模板类派生一个类模板时,两者的数据成员类型一致。
二、 向量与泛型算法
与操作对象的数据类型相互独立的算法称为泛型算法
1.定义向量列表
四种构造函数:
1) vectot<type> name; //定义type的向量列表
2) vectot<type> name(length) //定义具有length个type的向量,元素初始化为0
3) vectot<type> name(length, a ) //定义具有length个type的向量,元素初始化为a
4) vectot<type> name1(lname) //使用已定义的向量name构造向量name1
2.泛型指针
泛型算法:与操作对象的数据类型相互独立。
泛型指针的一般形式:vector <type>::iterator 泛型指针名 //逆向为reverse_iterator
3.向量最基本的操作方法
1)访问向量容量信息的方法
size(); //返回当前向量中已经存放的对象的个数
max_size(); //返回向量可以容纳最多对象的个数(由硬件决定)
capacity(); //返回无序再次分配内存就能容纳的对象个数
empty(); //向量为空时返回true
max_size() >= capacity() >=size()
2)访问向量中对象的方法
front(); //返回向量中第1个对象
back(); //返回向量中最后1个对象
operator[ ](size_type, n); //返回向量中的第n+1个对象(下标为n的向量元素)
3)在向量中插入对象的方法
Push_back(Const T&); //向向量尾部插入一个对象
Insert(iterator it,const T&); //是向it所指向量位置前插入1个对象。
Insert(iterator it,size_type n,const T&X); //是向it所指向量位置前插入n个值为X的对象。
4)在向量中删除对象的方法
Pop_back(Const T&); //删除向量中最后一个对象
Erase(iterator it); //删除it所指向的容器对象
Clear(); //删除向量中的所有对象,empty()返回true值
历年真题:
1.模板函数的真正代码是在源程序中__调用函数_时产生。
2.insert(iterator it,const T&)是向it所指向量位置前__插入__个对象。
3.下列有关模板的描述中,错误的是
- A.模板把数据类型作为一个设计参数,称为参数化程序设计
- B.使用时,模板参数与函数参数相同,是按位置而不是名称对应的
- C.模板实例化参数类型包括数据类型和值
- D.类模板与模板类是同一个概念
【答案】D
【解析】一个类模板(类生成类)允许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。模板类是类模板实例化后的一个产物。
【知识点】模板