c++模板初阶

  1. 模板初识

模板可以分为:函数模板和类模板。
定义形式:
temelate<模板参数表>
模板定义体

(1)temelate为声明模板的关键字;
(2)模板的参数列表可以包括一个或多个模板参数,每个模板参数由关键字class/typename(表示任何内部类型或用户自定义类型)和模板形参组成,当模板参数多于一个时,用逗号隔开;
(3)模板定义体是该模板的作用体,可以是函数或者是类。
(4)模板只有经过参数实例化变为一个类型参数具体的函数,才能完成函数的功能。

  1. 函数模板

1)有两个参数类型不同但是函数功能完全相同的函数,类似这样的情况就可以编写一个模板函数。例如:
两个函数:

>int abs(intx)
{
	Return x<0 ? -x : x;
}
double abs(intx)
{
	Return x<0 ? -x : x;
}

函数模板:

Template<class T>//模板形参为T
T abs(T x)//函数模板
{
If(x>=0)
{
return x;
}
else
{
return -x;
}
}

这样就可以传任意类型的数进行相加,不用像之前那样定义多个函数了。 2)函数模板的实例化
函数模板的实例化,实际上就是给函数模板传入不同类型的参数并使用该函数,它分为隐式实例化和显式实例化两种。  隐式实例化
让编译器根据实参推算参数类型,不过需要注意的是:在给模板函数传参时,一次计算只能传一种类型的参数,否则编译器会难以分辨参数类型且编译器一般不会进行类型转换操作。
 显示类型转化 在函数名后的<>中指定模板参数的实际类型,例如:

Int main()
{    
int a = 10;    
double = 20.0; 
Add<int>(a, b); // 显式实例化        
return 0; 
}

3)模板参数的匹配原则  一个非模板函数可以和一个同名的的模板函数可以同时存在。
 在其他外部条件都相同的情况下,系统在调用时会优先调用普通函数。当模板的参数匹配度高于普通函数时,调用模板函数。
 模板函数不允许隐式类型转换(如:将char类型字符转换成阿斯卡玛值的int类型),但是普通函数可以进行隐式类型转换。

2、类模板

(1)类模板的定义方式:
template<class T1, class T2, …, class Tn>
class 类模板名
{ // 类内成员定义
};
(2)类模板的实例化:
类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,只有实例化的结果才是真正的类。
例如:

#include <iostream>
#include <cstdlib>
using namespace std;
template <class numtype>
class Compare
{
private:
	numtype x, y;
public:
	Compare(numtype a, numtype b)
	{
		x = a;
		y = b;
	}
	numtype max()
	{
		return(x > y) ? x : y;
	}
	numtype min()
	{
		return (x > y) ? x : y;
	}
};
int main()
{
	Compare<int>cmpl(3,7);//定义对象cmpl,用于两个整数的比较
	cout << cmpl.max() << endl;
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值