第十章 模板 丘志杰 电子科技大学 计算机学院 软件学院.

Slides:



Advertisements
Similar presentations
第四章 类、对象和接口.
Advertisements

四資二甲 第三週作業 物件導向程式設計.
第一章 C语言概述 计算机公共教学部.
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
C语言程序设计 第八章 函数.
高级语言程序设计 主讲人:陈玉华.
函數(一) 自訂函數、遞迴函數 綠園.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第4章 函数与预处理 4.1 概述 4.2 定义函数的一般形式 4.3 函数参数和函数的值 4.4 函数的调用 *4.5 内置函数
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
教材 《C++程序设计》.谭浩强. 清华大学出版社 王雪晶
第4章 选择结构程序设计 4.1 选择结构和条件判断 4.2 用if语句实现选择结构 4.3关系运算符和关系表达式
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
第八章 函数.
五、链 表 1、单链表 2、双向链表 3、链表应用.
第五張 方法.
Ch02-基礎語法.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
$10 可空类型.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第十章 指针.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第七章 函数及变量存贮类型 7.1 函数基础与C程序结构 7.2 函数的定义和声明 7.3 函数的调用 7.4 函数的嵌套与递归
第7章 陣列與指標 7-1 陣列的基礎 7-2 一維陣列的處理 7-3 二維與多維陣列的處理 7-4 陣列的函數參數
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
六、函数 教学目标: 函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现 函数的参数传递方式 C语言程序设计.
C++语言程序设计 C++语言程序设计 第五章 函数 第十一组 C++语言程序设计.
C语言大学实用教程 第5章 函数与程序结构 西南财经大学经济信息工程学院 刘家芬
Java變數 2014/6/24.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
C语言程序示例: 1.输入10个数,按从小到大的顺序排序。 2.汉诺塔问题。.
1.2 C语言程序的结构与书写规则 一、 C语言程序的总体结构
Oop8 function函式.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第三章 数据抽象.
C程序设计.
第5章 函 数.
第一章 C语言概述 教师:周芸.
C语言程序设计 李祥 QQ:
第2章 数据类型、运算符与表达式 2.1 程序设计概述
第3章 数据类型、运算符与表达式.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 类型、对象、运算符和表达式.
第2章 数据类型与表达式 学习目的与要求: 掌握C 语言的基本数据类型及使用方法 掌握C程序中常用的运算符和表达式 了解数据类型的转换.
第二章 基本数据类型 ——数据的表示.
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
Review 1~3.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
本节内容 指针类型.
第七章  数 组.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
第三章 高级函数特性.
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
本节内容 在堆中创建对象 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++程序语言设计 Chapter 14: Templates.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第十二章 C与C C转入C++时不需改变的内容 12.2 C转入C++的一些与类无关的 新特性
Presentation transcript:

第十章 模板 丘志杰 电子科技大学 计算机学院 软件学院

C++最重要的特征之一就是代码重用,为了实现代码重用,代码必须具有通用性。通用的代码需要不受数据类型的影响,并且可以自动适应数据类型的变化。这种程序设计类型称为参数化程序设计(泛型程序设计)。 2019/2/19

模板是C++支持参数化程序设计的工具,通过它可以实现参数化多态性。 所谓的参数化多态性,就是将程序所处理的对象的类型参数化,使得一段程序可以处理多种不同类型的对象。 2019/2/19

函数模板和模板函数 请大家考虑这样的问题:写一个函数求两个值中的最大者。作为强类型的语言,C++ “不允许”也不应该两种不同类型的参数进行比较。一般的解决办法就是写一系列的函数,来分别完成整型、浮点型和用户自定义类型的求解。 int max(int x,int y){…} float max(float x,float y){…} 可以想像,所有这些函数(的代码)几乎都是一模一样的,只是操作的类型不同。这使程序代码变得累赘而加大维护难度。 2019/2/19

这样做虽然解决了代码维护问题,但是由于宏定义只是在编译时进行简单的宏展开,避开了类型检查机制,因此可能带来一些难以发觉的错误。 一个变通的方法是使用宏定义: #define max(x, y) ((x) > (y) ? (x) : (y)) 这样做虽然解决了代码维护问题,但是由于宏定义只是在编译时进行简单的宏展开,避开了类型检查机制,因此可能带来一些难以发觉的错误。 2019/2/19

使用C++的模板可以轻松地解决上述问题。在这种情况下,数据类型本身就是一个参数,例如max函数的模板可以定义为: template <class T> T max(T x, T y) { return x > y ? x : y; } 关键字template后的尖括号表明,max函数要用到一个叫做T的参数(我们称作模板参数),而这个参数是一种类型。该模板的含义就是无论参数T为int、char或其他数据类型(包括类类型),函数max的语意都是对x和y求最大值。 2019/2/19

这样定义的max代表了一类具有相同程序逻辑的函数,它不是一个真正的函数,被称为函数模板。函数模板本身是不被编译的,所以函数模板不能直接使用,必须被实例化后,也就是给定类型参数T后才能使用: void main() { double a = 1.0, b; b = max(a, 2.0); } 在上面的代码中,函数模板接受了一个隐含的参数:double,编译器自动将函数模板扩展成一个完整的关于double数据比较大小的函数,然后再在函数模板被调用的地方产生合适的函数调用代码。由函数模板实例化出的函数称为模板函数。 2019/2/19

就像类和对象的关系一样,函数模板将具有相同正文的一类函数抽象出来,可以适应任意类型T。 函数模板与模板函数的关系: 模板函数 max(int x,int y) 函数模板 max(T x,T y) max(double x,double y) max(X x,X y) 实例化 就像类和对象的关系一样,函数模板将具有相同正文的一类函数抽象出来,可以适应任意类型T。 2019/2/19

请思考 对于上述的max函数模板,如果参与比较的是两个类对象(如Complex类的对象),该怎么办? Complex c1,c2,c3; c3=max(c1,c2); 那么编译器将不能明白“>”运算符作用在类类型上是什么意思。在这种情况下,为了避免这个问题,必须为参与运算的类类型重载“>”运算符。 2019/2/19

重载模板函数 请思考下面情况: void Func(int num,char ch) { int a=max(num,ch);//错误 int b=max(ch,num);//错误 } 在这种情况下,为函数模板提供了两个不同的类型(int和char),那么这也会引起错误:编译器无法按模板的规则实例化出那样的函数。但是int和char直接的隐式类型转换是很普遍的。 解决上述问题的,C++允许一个函数模板可以使用多个模板参数或者重载一个函数模板。 2019/2/19

例子:使用多个模板参数 template <class T,class D> T max(T x,D y) { return (x>y)?x:y; } void main() int a=9; char b=34; int rr=max(a,b); 2019/2/19

例子:重载一个函数模板 //在redhat下使用g++编译并执行下面程序 template <class T> T max(T x,T y) { return (x>y)?x:y; } int max(int x,int y) void main() int num=1; char ch=2; max(num,num); //调用max(int,int) max(ch,ch); //调用max(T,T) max(num,ch); //调用max(int,int) max(ch,num); //调用max(int,int) 2019/2/19

类模板与模板类 请看下面双向链表的例子: class node { int value; node *prev,*next; public: node(){prev=NULL;next=NULL;} void setValue(int value){this->value=value;} void append(node *p); }; 2019/2/19

void node::append(node *p) { p->next=this->next; p->prev=this; if(next!=NULL) next->prev=p; next=p; } void main( ) { node *list_head; node node,node1,node2; node.setValue(1); node1.setValue(2); node2.setValue(3); list_head=&node; list_head->append(&node1); list_head->append(&node2); } 2019/2/19

类模板机制比较完美地解决了这个问题,我们将node类改造如下: 如果链表中的节点要保存char、double甚至是类类型的数据呢?该如何办?为了让该双向链表适应不同的类型,我们不得不写一系列的类,诸如int型node类、double型node类、以及类类型node类。而这些类除了操作的类型不同外,其它的部分都几乎一模一样。这对我们管理源代码带来极大的麻烦。 类模板机制比较完美地解决了这个问题,我们将node类改造如下: 2019/2/19

template <class T> class node { T value; node *prev,*next; public: node(){prev=NULL;next=NULL;} void setValue(T value){this->value=value;} void append(node *p); }; 2019/2/19

template <class T> void node<T>::append(node *p) { p->next=this->next; p->prev=this; if(next!=NULL) next->prev=p; next=p; } void main( ){ node<int> *list_head; node<int> node,node1,node2; node.setValue(1); node1.setValue(2); node2.setValue(3); list_head=&node; list_head->append(&node1); list_head->append(&node2); } 2019/2/19

用template来声明一个类模板,node<T>是该类模板的名字。 类外实现成员函数的语法为: template <class T> void node<T>::append(node *p){….} 用模板实参实例化的类称为模板类,在声明一个对象时完成类模板实例化的过程: node<double> *list_head; node<double> node,node1,node2; 2019/2/19

就像类和对象的关系一样,模板类将具有相同正文的一类类类型抽象出来。 类模板与模板类的关系: 模板类 node<int> 类模板 node<T> node<char> node<X> 实例化 就像类和对象的关系一样,模板类将具有相同正文的一类类类型抽象出来。 2019/2/19