(一)函数模板的概念
1--假设要编写一个函数对两个参数求和。实际编程中,我们可能希望定义几个这样的函数,每一个都可以对一种
给定类型的值求和,那么,可能自然会想到使用重载函数.例如:
int add(int a,int b)
{
return a+b;
}
double add(double a,double b)
{
return a+b;
}
char add(char a,char b)
{
return a+b;
}
2--这些函数几乎相同,每个函数的函数体是相同的,功能也是相同的,它们之间唯一的区别是形参类型和函数的返回值
类型不同
3--事实上,在具体编写上述代码时,我们必须手工书写所有的代码,所以会使用复制,粘贴,修改等编辑的功能以便得
到另一种类型的求和函数。
4--可是,如果每种类型都需要重复函数的类型和函数体,这样十分麻烦,而且容易出错.
5--更重要的是,我们需要事先知道可能会支持的哪些类型.如果希望将函数的用于未知类型,这种方法就有问题了
1--C++有--模板机制(在java中,泛型机制可以解决),可以使用--函数模板--解决上述问题.
2--函数模板(function template)----是一个独立于类型的函数,这些函数与类型无关,并且只在需要时自动实例化,从而形
成“批量型”的编程方式.
(二)函数模板的定义和使用
1)函数模板的定义
函数模板定义的语法形式为:
template<模板形参列表>函数的返回值类型 函数名(形式参数列表)
{
函数体
}
第一行,称为模板定义,其后称为模板函数
1--模板定义以--关键字template开始,后接模板形参列表
2--模板形参列表(template parameterList)---是一对尖括号<>括起来的一个或多个模板形参表-----------不允许为空
形参之间以逗号隔开,有两种形式:
1--第一种---typename 参数1,typename 参数2....
2--第二种---class 参数1,class 参数2.....
3--模板定义的额后面是函数定义,在函数定义中,可以使用模板形参表中的类型参数,例如:
template<typename T> add(T a,T A b)
{
return a+b;
}
4--函数模板定义语法的含义---是一个通用型函数,这个函数类型和参数类型没有具体的指定,而是用一个类型标记来表示,
类型标记由--编译器--根据所使用的函数而确定,这种---通用型函数---就称为---函数模板
2)函数模板的使用
可以像使用普通函数那样,使用模板函数的调用.代码如下所示:
#include<iostream>
using namespace std;
template<typename T>T add(T a,T b)
{
return a+b;
}
int main()
{
cout<<"int——add"<<add(10,20)<<endl;
cout<<"double——add"<<add(10.2,20.5)<<endl;
cout<<"char——add"<<add(a,A)<<endl;
system("pause");
return 0;
}
(三)函数模板的高级特性
(1)非类型形参
1--模板形参不必全都是--类型,可以使用非类型形参(nontype parameter),一般形式为:
template<typename T,int N> void outchar(T a)
{
for(int i=1;i<=N;i++)
cout<<a;
}
2--在调用函数时,非类型形参必须显式的给出其值,一般形式为:
outchar(char,5)('A');
********************************************************************************************************************
//类模板详解
(一)类模板的定义
1--就像可以定义---函数模板一样,也可以定义---类模板,其定义的一般形式为:
template<模板参数列表>class 类模板名{
1--构造函数
2--析构函数
3--成员函数
4--数据成员
};
2--类模板--必须以--关键字template--开头,后接模板形参列表<template parameter List>
3--模板参数---用一对<>尖括号括住,不允许为空,形参之间以逗号分隔
4--由于--类模板--包含--类型参数--因此,又称为---参数化的类
5--如果说---类是对象的抽象,对象是类的---实例,则类模板是类的抽象,类是模板的实例
6--可以利用类模板---建立支持各种数据类型的类-----相当于java中的泛型
例如,定义一个类模板,表示平面上的点:
template<class T> class Point{
public:
//【1】默认构造函数
Point():x(0),y(0){}
//【2】带参数的构造函数
Point(const T a,const T b):x(a),y(b){}
//【3】成员函数
void Set(T a,T b);
void Display(){
cout<<"x:"<<x<<"y"<<y<<endl;
}
private:
T x,y;
};
(二)类模板对象的定义:
1--用类模板--定义对象时,必须为--模板形参显示的指定类型实参,一般形式为:
类模板名<类型实参表> 对象名类表;
类模板名<类型实参表> 对象名1(实参列表1),对象名2(实参列表2)...
例如:
Point<int> a,b; //定义类模板对象,调用默认构造函数
Point<double e>m(1,2),n(3,4); //定义类模板对象,调用带参构造函数
C/C++学习笔记(2)--函数模板template<typename T>,类模板详解(1)
最新推荐文章于 2024-03-07 21:42:52 发布