C/C++学习笔记(2)--函数模板template<typename T>,类模板详解(1)

来源:互联网 发布:windows可以删除吗 编辑:程序博客网 时间:2024/05/11 02:42
(一)函数模板的概念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); //定义类模板对象,调用带参构造函数

0 0
原创粉丝点击