part1:
一、C++模板简介(1)
int Max(int a,int b)
{
return (a>b)? a:b;
}
long Max(long a,long b)
{
return (a>b)? a:b;
}
char Max(char a,char b)
{
return (a>b)? a:b;
}
以上三个函数都是比较大小,但是由于返回和输出类型不同,导致需要写三个函数(函数重载)。未解决这个问题,引入模板(template)
C++模板简介(2)
template<typename T> T MAX(T a,T b)
{
return (a>b)? a:b;
}
T是泛化的,非具体的。
使用模板,可以省去一堆冗余代码。
模板:是C++的一种特性,允许函数或类(对象)通过泛型(generic types)的形式表现。
两种模板:类模板(class template):使用泛型参数的类
函数模板(Function template):使用泛型参数的函数
C++模板简介(3)
模板实例化
1、实例化:就是将上面的T指定一个具体的类型。这个函数才确定。
显示实例化:直接给出T的类型。
隐形实例化:不给出T,根据a,b的定义编译器推导给出T的类型
二、C++函数模板(1)
函数模板就是参数化的一族函数,也就是表示一类函数。
template<typename T>//告诉编译器这是个模板函数,并且参数为T
inline T Max(const T&a,const T& b)
{
return (a>b)?a:b;
}
C++函数模板(2)
calss代替typename,语法上是一样的
C++函数模板(3)
模板函数的使用
#include "stdafx.h"
#include<iostream>
using namespace std;
template <typename T>inline T Max(const T& a, const T& b) {
return (a > b) ? a : b;
}
int main()
{
int a = 5, b = 35;
int c = Max(a, b);
cout << c;
return 0;
}
注意:参数类型不能为不同类型
C++函数模板(4)
模板实例化
用具体的型别替代模板参数T的过程叫做实例化,从而产生一个模板实例。
C++函数模板(5)
结论:模板被编译了两次
1)没有实例化之前,检查末班代码本事是否有语法错误
2)实例化期间,检查模板代码的调用是否合法。
C++函数模板(6)
参数推导
模板参数是由传递的实参决定(例子中传入的a为int型,所以模板参数为int)
Max(1,2);
Max(1,3.0);//错误,两个参数类型不相同
强制转换:static_cast(3.0)
显式转换 :Max(1,2,0);
C++函数模板(7)
函数模板重载
inline T Max(const int& a, const int& b);
template <typename T>inline T Max(const T& a, const T& b) ;