泛型编程基础—模板(初识)

泛型编程基础——模板

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
分享
二维码
< <上一篇
下一篇>>