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

(一)函数模板的概念
		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
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值