数据结构_模板(template)

本文深入解析C++模板的概念,包括函数模板和类模板的定义与使用。通过具体示例,如绝对值函数模板和矩形类模板,展示了模板如何提高代码的可重用性和效率。

1.模板是对具有相同特性函数或类的再抽象,模板是一种参数化的多态性工具。所谓参数化多态性,是指将程序所处理的对象的类型参数化,使一段程序代码可以用于处理多种不同类型的对象。
2.模板分为:函数模板、类模板。模板通过参数实例化可以构建具体的函数或类,称为模板函数和模板类。而模板类参数实例化可以构建对象。
3.如果要对一个数求绝对值,当变量类型分别为int和double时,所写代码十分相似,只略微有所不同:

//对int类型求绝对值:
int abs(int a){
	return a<0?-a:a;
}
//对double类型求绝对值:
double abs(double a){
	return a<0?-a:a;
}

可以看出,对于同一个问题,各函数只是参数类型不一样,其功能在本质上完全相同。此时可以使用函数模板,使代码的可重用性大大提高。
函数模板是参数化的函数,定义格式如下:

template<模板形参表>
返回值类型 函数名(参数表){
	函数体
}

此时对刚刚具有求绝对值功能的函数定义:

#include<iostream>
using namespace std;
template<typename T> //模板定义,一个或多个用逗号分开的模板形式参数。T为模板参数(用来进行类的传递),每一项均由关键字class或者typename(模板定义关键字)引导
T abs(T a){			//定义函数模板
	return a<0?-a:a;
}
int main()
{
	int x=-12;
	double y=12.5;
	cout<<abs(x)<<endl;
	cout<<abs(y)<<endl;
	return 0;
}

模板参数表示一种数据类型,可以是基本数据类型或者类类型。
数据类型在实际函数调用时被实例化,即用调用处的实际数据类型替代它。
4.如果要定义一个矩形类,对它的边长进行运算,则此时对于它的边长是整数还是实数的情况,会有不同的代码。使用类模板,效率会大大提高。
类模板的定义:

template<模板形参表>
class 类模板名
{
	成员的声明;
}

用类的模板定义矩形类:

#include<iostream>
using namespace std;
template<typename T>	//typename或class
class Rectangle				//类模板定义
{
		T x;
	public:
		Rectangle(T xx):x(xx){}
		T fun(){return x*x;}
};										//加上分号!

类模板成员函数定义:
1).若放在类模板定义之中,则与类的成员函数定义方法相同
2).若放在类外定义,格式如下:

template<模板形参表>			//模板形参表有引导词。注意每个函数都要写一遍,因为每个函数都是模板!
返回值类型 类模板名<形参名表>::成员函数名(参数表)  //形参名表无引导词
{
		成员函数体;
}

所以对于刚刚定义的Rectangle类,如果在类外定义成员函数,如:

template<class T>
T Rectangle<T>::circumference(){
		return 2*length*width;
}

5.类模板实例化的格式如下:

类模板名<实际类型>

类模板类的对象的格式如下:

类模板名<实际类型> 对象名(实参表);
#include<iostream>
using namespace std;
template<typename T>			//typename或class
class Rectangle{
		T x;
public:
		Rectangle(T xx):x(xx){}
		T fun(){return x*x;}
};
int main(){
	Rectangle<int> inta(15);		//带参的构造函数
	Rectangle<double> doublea(15);
	cout<<inta.fun()<<endl;
	cout<<doublea.fun()<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值