模板初级阶段

文章目录

      • 1. 泛型编程
      • 2.函数模板
        • 2.1函数模板的概念
        • 2.2函数模板格式
        • 2.3 函数模板的应用
          • 1.swap函数:
          • 2.参数无法实现类型的传递
          • 3.当出现特定函数和通用函数同时存在时
      • 3.类模板
        • 3.1 类模板的定义格式
        • 3.2 类模板的实例
        • 3.3 类外定义函数;
          • 3.3.1 声明和定义在一个文件内
          • 3.3.2 声明和定义不在一个文件

1. 泛型编程

如何实现一个通用的交换函数呢?
为解决的问题:

void Swap(int& left, int& right)
{
 int temp = left;
 left = right;
 right = temp;
}
void Swap(double& left, double& right)
{
 double temp = left;
 left = right;
 right = temp;
}
void Swap(char& left, char& right)
{
 char temp = left;
 left = right;
 right = temp;
}
......


每个类型都要定义一个函数;太过繁琐;
那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢
解:

祖师爷发明了模板;

2.函数模板

2.1函数模板的概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.2函数模板格式

template
或template
返回值类型 函数名(参数列表){}

注意:
模板初级阶段_第1张图片
这里的调用的不是一个函数;
原理图:
模板初级阶段_第2张图片
面试考题:
函数的两个参数的类型不同使用函数模板怎么解决:
模板初级阶段_第3张图片

解决方法:

1.
cout《Add((int1.12)《endl;
2.
cout<<Add(1.1,(double)2)<<endl;
3.
cout<<Add<int>(1.1,2)<<endl;
2.3 函数模板的应用
1.swap函数:

注意:c++中的库函数包括swap函数;
这是库函数中的定义:
使用了模板将类型可以多样化;
模板初级阶段_第4张图片

2.参数无法实现类型的传递

模板初级阶段_第5张图片
解决方法:显示实例化使用尖括号将类型传给函数;

3.当出现特定函数和通用函数同时存在时

函数调用会调用最符合的函数;
模板初级阶段_第6张图片

3.类模板

3.1 类模板的定义格式

template
或template
返回值类型 函数名(参数列表){}

template<class T1, class T2, ..., class Tn>
class 类模板名
{
 // 类内成员定义
}; 
// 动态顺序表
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{ 
public :
 Vector(size_t capacity = 10)
 : _pData(new T[capacity])
 , _size(0)
 , _capacity(capacity)
 {}
 
 // 使用析构函数演示:在类中声明,在类外定义。
 ~Vector();
 
 void PushBack(const T& data)void PopBack()// ...
 
 size_t Size() {return _size;}
 
 T& operator[](size_t pos)
 {
 assert(pos < _size);
 return _pData[pos];
 }
 
private:
 T* _pData;
 size_t _size;
 size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
 if(_pData)
 delete[] _pData;
 _size = _capacity = 0;
}
3.2 类模板的实例

注意和函数有区别:这里没有参数无法将类型传给类模板;
所以出现了类模板的实例化

// Vector类名,Vector才是类型
Vector<int> s1;
Vector<double> s2;

两对象调用的类不同
模板初级阶段_第7张图片

3.3 类外定义函数;
3.3.1 声明和定义在一个文件内

模板初级阶段_第8张图片
由此例子来加讲解类名和类型的区别:
不使用模板的情况
类名和类型相同;即Vector;
使用模板时
类名:Vector
类型:Vector
类外定义需要声明和使用类型定义:
类外定义的步骤:
1.类内声明
2.类外定义声明;
3.定义;(注意使用类型)
Vector::~Vector()
{}

3.3.2 声明和定义不在一个文件

这种情况;追号不要使用;容易报错;

你可能感兴趣的:(c++,开发语言)