文章目录
- 前言:
- 💞1.函数模板
- 💞1.1 函数模板的概念
- 💞1.2 函数模板的格式
- 💞1.3 函数模板的原理
- 💞1.4 函数模板的实例化
- 💞1.5 模板参数的匹配原则
- 💞2.类模板
- 💞1.1 类模板的概念
- 💞1.2 类模板的格式
- 💞1.3 类模板的优点
- 最后:
前言:
模板就相当于我们高中写作文时套用的作文模板,在大多数情况下是可以通用的。那么我们要是在编程中也想利用这种方式呢?那就不得不提起泛型编程——编写与类型无关的通用代码,是代码复用的一种体现。模板只是泛型编程的基础。模板又可以分为函数模板和类模板。
💞1.函数模板
💞1.1 函数模板的概念
函数模板代表了一个函数的家族,这个函数不受类型的限制,比如可以传int
类型也可以传double
类型,在使用时被参数化,根据实参的类型而产生特定类型的函数。
💞1.2 函数模板的格式
template< typename T>
返回值类型 函数名(参数列表)
{}
template<typename T>
void Swap(T& left, T& right)
{
T tmp = left;
left = right;
right = tnmp;
}
🎯注意:template
是定义模板参数的关键字,也可以使用class
但不能用struct
代替class
💞1.3 函数模板的原理
函数模板并不是一个函数,而是编译器按使用方式而生成特定类型函数的一个摸具。
在编译阶段,编译器会根据传来的实参类型来生成出对应的类型函数以供使用。
💞1.4 函数模板的实例化
不同类型的参数使用模板时,称为函数模板的实例化,模板参数实例化又分为隐式实例化
和显式实例化
🍒 隐式实例化:让编译器根据实参来推演出对应的函数类型
template<typename T>
T Add(T& a, T& b)
{
return a + b;
}
int main()
{
int x = 1; int y = 2;
Add(x, y); //隐式实例化
double m = 2.0; double n = 3.0;
Add(m,n); //隐式实例化
//但不能像下面这样传,一个传int类型,一个传double类型,因为模板参数列表中只有一个T,编译器无法确定T为int还是double
//Add(x,m);
//如果非要传如何处理呢? 1.强制类型转化一下 2.使用显式实例化
return 0;
}
🍒 显式实例化:在函数名后加上指定类型
int main()
{
int i = 10;
double l = 30.0;
Add<int>(i,l); //显式实例化
return 0;
}
💞1.5 模板参数的匹配原则
1. 非模板函数和模板函数可以同时存在,模板函数可以被实例化成这个非模板函数,在调用时编译器会优先调用非模板函数
int Add(int left, int right)
{
return left + right;
}
template<typename T>
T Add(T left, T right)
{
return left + right;
}
int main()
{
Add(1, 2);//调用非模板函数
Add<int>(1,2);//调用编译器特化的Add版本
return 0;
}
2.对于非模板函数和能实例化出同类型的模板函数,编译器会优先调用非模板函数,不会从模板函数产生一个实例。如果模板函数可以产生一个更匹配的函数,那么将选择模板函数。
//非模板函数int加法函数
int Add(int left, int right)
{
return left + right;
}
//通用的加法函数
template<typename T1,typename T2>
T1 Add(T1 left, T2 right)
{
return left + right;
}
int main()
{
Add(1,2); //与非模板函数匹配,不需要函数模板实例化
Add(1,2.0);//模板函数可以生成更加匹配的函数,编译器会根据实参生成更加匹配的Add函数。
return 0;
}
3. 模板函数不支持自动类型转换,但普通函数可以进行自动类型转换
💞2.类模板
💞1.1 类模板的概念
类模板允许程序员编写与类型无关的代码,通过使用类模板,就可以生成特定类型的类,而无需为每种类型都编写特定的代码。
💞1.2 类模板的格式
template < typename T>
class 类模板名
{
类中成员定义
};
//类模板
template<class T>
class Point
{
public:
T x, y;
Point(T a,T b)
:x(a)
,y(b)
{}
T distanceFromOrigin()
{
return std::sqrt(x * x + y * y);
}
};
Print
类模板中有两个变量x
和y
,它们都是类型T
.构造函数接受两个参数来初始化x
和y
,distanceFromOrigin
计算并返回点到原点的距离。
要使用类模板,我们需要指定模板参数的类型,并且创建该类型的对象。例如:
int main()
{
Point<int> a(3, 4);
cout << a.distanceFromOrigin() << endl;
Point<double> b(2.5,3.5);
cout << b.distanceFromOrigin() << endl;
return 0;
}
💞1.3 类模板的优点
&emsp;类模板的好处是提高了类型的安全性,减少了代码的重复量。通过使用类模板,我们可以编写与类型无关的代码,并在需要时生成特定的类。
最后:
以上就是对c++
模板的介绍,如有错误望各位大胆指出,如果这篇文章帮助到了你,记得关注,点赞,收藏, 欲知下篇如何,关注我,请尽请期待