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
- C/C++学习笔记(2)--函数模板template<typename T>,类模板详解(1)
- C++Template学习笔记之函数模板
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++,template,类模板和函数模板
- C++template ;模板学习
- C++template 模板类2
- C++中的模板template <typename T>
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++中template<class T> && template <typename T>(模板区分)
- 模板声明中template <typename T>和template <class T>
- 聊聊的Android缓存(三)
- 【BZOJ1264】[AHOI2006]基因匹配Match【DP】【LCS】【树状数组】
- SpringMVC 报错java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path
- 一个简要的示例说明Linux内核的container_of 的用法
- 复习继承和接口、抽象类
- C/C++学习笔记(2)--函数模板template<typename T>,类模板详解(1)
- USB识别与传输
- 找倍数(优先队列解法)
- android 小练习(一) ---仿微信UI主界面
- 【Redis】一 CentOS 6.7 redis3 集群安装
- 逻辑回归的向量化实现样例
- 学习翻译中英文词典工具
- 获取桌面壁纸作为App背景
- java入门:doc命令运行java文件