c++之模板

c++之模板

引入模板的作用:避免代码的重复,编写脱离数据类型的通用模板。 模板是对类型进行参数化的工具,是c++中支持参数化多态的工具。

模板的分类:函数模板、类模板

下面依次介绍函数模板和类模板。

函数模板:
template <class T> or template <typename T>  //模板声明格式
返回值类型 函数名(模板形参表) 
{
	函数体
}

函数调用:
函数名(模板实参表) //和普通的函数调用没有区别,只不过运行时,系统会首先根据参数类型确定数据类型,生成一个模板函数</span>

下面介绍一个使用函数模板的实例
template <typename T>
 T square(T x)// template 语句 和 函数模板定义语句不允许有别的语句
{
   T result;
   result = x * x;
   return result;
};

void main()
{
   int    i, ii;
   float  x, xx;
   double y, yy;

   i = 2;
   x = 2.2;
   y = 2.2;

   ii = square<int>(i);
   cout << i << ": " << ii << endl;

   xx = square<float>(x);
   cout << x << ": " << xx << endl;

   yy = square<double>(y);// 显式使用模板
   cout << y << ": " << yy << endl;

   yy = square(y);//隐式使用模板
   cout << y << ": " << yy << endl;

   return ;
}
    

注意:
     1)模板函数调用时,可以有显式和隐式的调用。
   2)模板声明格式包含以下两种:template <class T> or template<typename T>
   3)模板的声明和定义必须在同一个文件中,如头文件。
  4)在模板函数的定义中,T代表数据类型。
  5)c语言的宏定义也可以实现函数模板的功能,如#define  f(x)   ((x)*(x)) 但是宏定义没有类型检查,函数模板有类型检查。

模板函数运行过程分为两部分:1)传递参数类型,用模板实参将类型参数T进行实例化。2)传递参数,将参数传递给函数。

函数模板使用过程中,出现的一些特殊的情况
1)函数模板可以使用多个模板参数,有几个不同的类型,就用不同的模板参数来代表它。
template <class T,class D>
T max(T a,D b)
{
	return (a>b)?a:b;
}

void main()
{
	float a = 4.5;
	int b = 100;
	cout<<max(100,154.5)<<endl;
	cout<<max(154.5,100)<<endl;
}
2)重载一个函数模板:定义一个模板后,再定义一个重载函数

template <class T>
T maxim(T a,T b)
{
	return (a>b)?a:b;
}
int maxim(int a ,int b)
{
	return (a>b)?a:b;
}//用户自己定义一个同名函数

void main()
{
	int m,n;
	m = 10;
	n = 20;
	char a = 'a',b = 'b';
	char s[10];
	cout<< maxim(m,n)<<endl;//调用函数 实参和函数的参数类型完全一致,直接调用函数
        cout<<maxim(a,b)<<endl;//调用模板 实参和函数参数类型不同,直接调用模板
        cout<<maxim(m,a)<<endl;//调用函数 实参的类型不同,模板不适合,则再次调用函数
        cout<<maxim(m,s)<<endl;//报错-函数也不适合,直接报错
}
上面调用函数的顺序是,先调用函数-其次调用模板函数-再次调用函数。最后如果都不能调用,就直接报错






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值