C++ Template模板函数与模板类

版权声明:转载请注明出处 https://blog.csdn.net/qq_42292831/article/details/85003452

函数模板扩展了函数重载并简化函数的重载:
利用函数重载可以让多个函数共享一个函数名,只要所重载的函数的参数类型必须有所不同。
但是,由于参数的类型不一样,虽然这些函数所完成的功能完全一样,也必须为每一个重载函数编写代码。


类模板实际上是函数模板的推广,
它是一种不确定类的某些数据成员的类型或成员函数的参数及返回值的类型的类。
(类是对问题的抽象,而类模板是对类的抽象,即更高层次上的抽象)
类模板称为带参数(或参数化)的类,也称为类工厂,它可用来生成多个功能相同而某些数据成员的类型不同或成员函数的参数及返回值的类型不同的类。

****************************************************************************************************************************************

 一:模板函数

//template <class  标识符>
//函数声明

  1> 示例:

#include <bits/stdc++.h>
using namespace std;


template<class T1,class T2>
T1 Max(T1 x1, T2 x2)
{
	return x1 > x2 ? x1 : (T1)x2;
}

template<class T>
T abs(T x)    //控制形参类型与返回值类型一致,返回值的类型由参数值的类型决定
{
	return x<0 ? -x : x;
}
void main_0()
{
	int n = -5;
	double d = -5.5;
	cout << abs(n) << endl;
	cout << abs(d) << endl;
	int a = 10;
	double b = 20;
	cout << Max(a, b) << endl;
}

  2> 注意事项:

 

二: 模板类

☆这里需要明确三步:类的声明,类成员函数/数据成员的初始化、类的实例化

 1> 源码(解释版):

#include <iostream>
using namespace std;

//template < class T,class B >  //这里定义几个,在实例化的时候就要在类的后面实例化几个类型,尽管没有全部使用
template <class T>
class  MyTemClass
{
private:
	T x;
	// 类型参数T用于声明数据成员
public:
	void SetX(T   a);
	// 类型参数T用于声明成员函数的参数
	T GetX() { return    x; };
	// 类型参数T用于声明成员函数的返回值
};

template < class  T >     // 不能省略模板声明
void MyTemClass < T > ::SetX(T a)
{
	x = a;
}

int main()
{
	MyTemClass<int> A;
	A.SetX(5);
	cout << A.GetX() << endl;
	return 0;
}

 2> 源码(应用版):构造数组模板类并实现排序

#include <iostream>
#include <algorithm>
using namespace std;

template <class T1>
class TemplateArray
{
private:
	T1 *p;
	int length;
public:
	~TemplateArray()
	{
		delete[]p;
	}
	TemplateArray(int n)
	{
		length = n;
		p = new T1[n];
	}
	void Init_Array()
	{
		T1 temp_number = 10;
		for (T1 i = 0; i < length; i++)
		{
			*(p + i) = temp_number;
			temp_number--;
		}
	}
	void sort_array_STL()    //使用algorithm库中的模板直接排序
	{
		sort(p, p + length);
	}
	void sort_array()    //使用冒泡老老实实地排序
	{
		T1 temp_data = 0;
		bool ischanged = false;
		for (T1 i = length-1; i > 0; i--)
		{
			for (T1 j = 0; j < i; j++)
			{
				if (*(p + j) > *(p + j + 1))
				{
					temp_data = *(p + j);
					*(p + j) = *(p + j + 1);
					*(p + j + 1) = temp_data;
					ischanged = true;
				}
			}
			if (!ischanged)
			{
				return;
			}
		}
	}
	void Show_Array()
	{
		for (T1 i = 0; i < length; i++)
		{
			cout << *(p + i) << endl;
		}
	}
};

int main()
{
	TemplateArray<int> A(10);    //数组类型为int,长度为10
	A.Init_Array();
	//A.sort_array_STL();
	A.sort_array();
	A.Show_Array();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42292831/article/details/85003452