泛型编程基础—模板(初识)
泛型编程基础——模板
1.何为泛型编程?
编写与类型无关的通用代码,是代码复用的一种手段
2.为何c++引入模板?
因为C语言不能很好地复用,C++做以改善引入模板
而模板包括函数模板和类模板
一、函数模板使用语法
关键字template<class/typename T(自己起)>
void 函数名(T& a,T& b)
{}
//简单以一个交换函数为例
template<class T>
void Swap(T& x,T& y)
{
T tmp=x;
x=y;
y=tmp;
}
定义模板参数T(可自己定,但多习惯用T,含义为temp),其之前可以用typename,也可以用class,都一样的。
二、模板原理
- 在编译器预处理阶段,进行函数模板的推演,由实参推出形参的类型T是什么,从而实现模板的实例化。
- 本质上就是,本该由你自己书写的代码,然后不想重复书写,你便给一个模板,编译器通过模板,帮你生成对应的代码。
注意:模板在调用时,有现成匹配的函数的情况下,绝对不会去实例化模板;有更匹配的,会优先匹配类型最合适的
int a=1,b=2;
double c=1.1,d=2.2
cout<<Add(a,b)<<endl;//隐式实例化
cout<<Add<int>(a,c)<<endl;//将a,c以int方式+
//显示实例化,不让编译器推演,显示指定类型
//c发生隐式类型转换后传入
cout<<Add(a,(int)c)<<endl;
//将C进行强制类型转换成int,结果和上一步相同
强转和隐式类型转换都是生成一个临时变量,该临时变量就是强转或隐式类型转换的类型。以上述代码为例,c的类型不变仍为double,只是生成了一个int类型的临时变量。
三、类模板
以顺序表为例:
namespace RH //防止与库发生过冲突,放在自己的命名空间里
{
template<class T>
class Vector
{
public:
Vector()
:_a(nullptr)
,_size(0)
,_capacity
{}
~Vector()
{
delete[] _a;
_a=nullptr;
_size=_capacity=0;
}
private:
{
T* _a;
size_t _size;
size_t _capacity;
}
};
}
int main()
{
RH::Vector<int> V1; //显示实例化int型
RH::Vector<double> V2; //显示实例化double型
return 0;
}
注意:当模板的定义与声明分离时,要在定义时再加上模板参数,同时,模板不支持分离编译!!
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
最后的最后谢谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!!
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码