第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.

Slides:



Advertisements
Similar presentations
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
Advertisements

第 2 章 初探 C++.
Memory Pool ACM Yanqing Peng.
第一章 C语言概述 计算机公共教学部.
高级语言程序设计 C++程序设计教程(下) 2006年春季学期 与一些教材的区别 偏重理论,不去讨论某个系统的具体使用方法,但会涉及实现技术
第14章 c++中的代码重用.
Using C++ The Weird Way Something about c++11 & OOP tricks
資料大樓 --談指標與陣列 綠園.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
函數(一) 自訂函數、遞迴函數 綠園.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
单片机原理与应用 C/C++在现代数字计算机上的实现.
Scope & Lifetime 前言 Local Scope Global Functions & Objects
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第11章 运算符重载 什么是运算符重载 运算符重载的方法 几个特殊的运算符的重载 自定义类型转换运算符 运算符重载实例.
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
Classes: A Deeper Look, Part 1
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
Operator Overloading; String and Array Objects
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
辅导课程六.
并发机制 结果应该为: 线程 1: 1 线程 1: 2 线程 1: 3 线程 1: 4 线程 1: 5 线程 2: 6 线程 2: 7
6 使用者函數 6.1 函數定義 宣告函數 呼叫函數 呼叫多個函數 6-6
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
类类型 C++支持的内置类型和操作,如 int i=10; i=i%6; i=i+4;
第八章 多态性和虚函数 胡昊 南京大学计算机系软件所.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
$9 泛型基础.
程式結構&語法.
4 條件選擇 4.1 程式基本結構 循序式結構 選擇式結構 重複式結構 4-3
C#程序设计基础 $3 成员、变量和常量.
第10讲 构造函数和析构函数 构造函数 析构函数 This 指针.
物件導向程式設計 CH2.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
第三章 数据抽象.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第 9 章 建構函式與解構函式.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第 4 章 类的高级部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第6章 异常处理 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
C++程序语言设计 Chapter 14: Templates.
Presentation transcript:

第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院

7.1 函数模板 模板:函数和类模板。 函数模板简化重载。编译器遇到函数调用时,将根据实参类型和函数模板一起产生函数代码。 函数模板并不是真正意义上的函数,定义形式: template < 类型参数表 > 返回值类型 函数名 ( 形式参数表 ) { // 函数体 }

7.1.1 从函数重载到函数模板 函数重载是函数名相同,参数一定不完全相同,采用函数重载,要对每个函数分别写出相应的代码。例如:

int square ( int number ) { return number * number ; } float square ( float number ) 采用函数模板实现square: template < class T > T square ( T number )

template < class T > T square ( T number ) { 【例7.1】函数模板应用举例。 template < class T > T square ( T number ) { return number * number ; } int main ( ) { int userInt ; float userFloat ; cin >> userInt >> userFloat ; cout << "它们的平方分别是:" ; cout << square ( userInt ) << square ( userFloat ); return 0; 7-1.cpp

7.1.2 定义函数模板的方法 (1) 定义一个普通的函数 void swap ( int &var1 , int &var2 ) { 7.1.2 定义函数模板的方法 (1) 定义一个普通的函数 void swap ( int &var1 , int &var2 ) { int temp ; temp = var1 ; var1 = var2 ; var2 = temp ; } (2) 在函数开头加上template < class T >,将函数形参的类型和局部变量temp的类型int采用T替换。

7.1.3 在函数模板中使用多种类型 函数模板中可以使用多种通用类型,每个类型必须具有自己的参数: 7.1.3 在函数模板中使用多种类型 函数模板中可以使用多种通用类型,每个类型必须具有自己的参数: template < class T1 , class T2> void swap ( T1 &var1 , T2 &var2 ) { T1 temp ; temp = var1 ; var1 = ( T1 ) var2 ; var2 = ( T2 ) temp ; }

7.1.4 函数模板重载 template < class T > 7.1.4 函数模板重载 template < class T > T sum ( T valueOne , T valueTwo ) { return valueOne + valueTwo ; } T sum ( T valueOne , T valueTwo , T valueThree ) return valueOne + valueTwo + valueThree ; 调用形式:sum ( num1 , num2 ); sum ( num1 , num2 , num3); 形式之一

7.1.4 函数模板重载 float sum ( float valueOne , float valueTwo ) { 7.1.4 函数模板重载 float sum ( float valueOne , float valueTwo ) { return valueOne + valueTwo ; } template < class T > T sum ( T valueOne , T valueTwo , T valueThree ) return valueOne + valueTwo + valueThree ; 形式之二

7.2 类模板 类模板用于创建类属类和抽象数据类型,从而使程序员可以创建一般形式的类,而不必编写处理不同数据类型的类。 7.2 类模板 类模板用于创建类属类和抽象数据类型,从而使程序员可以创建一般形式的类,而不必编写处理不同数据类型的类。 类模板的定义和实现必须在同一个文件中,通常是头文件。编译器看到模板实现时才展开模板。 Example: Program 7-4.

template < class T > class FreewillArray { T *aptr; int arraySize; void memError(void); // allocation errors void subError(void); // out of range public: FreewillArray( ) { aptr = 0; arraySize = 0;} FreewillArray( int ); FreewillArray(const FreewillArray &); ~FreewillArray( ); int size( ) { return arraySize; } T &operator[ ](const int &); };

// Constructor for FreewillArray class. template < class T > FreewillArray <T>::FreewillArray( int s ) { arraySize = s; aptr = new T [s]; if (aptr == 0) memError(); for (int count = 0; count < arraySize; count++) *(aptr + count) = 0; }

// Copy Constructor for FreewillArray class. template <class T> FreewillArray<T>::FreewillArray ( const FreewillArray &obj ) { arraySize = obj.arraySize; aptr = new T [arraySize]; if (aptr == 0) memError(); for(int count = 0; count < arraySize; count++) *(aptr + count) = *(obj.aptr + count); }

// Destructor for FreewillArray class. template <class T> FreewillArray<T>::~FreewillArray( ) { if (arraySize > 0) delete [ ] aptr; } // memError function. void FreewillArray<T>::memError( ) { cout << "ERROR: allocate memory.\n"; exit(0);

// subError function. template <class T> void FreewillArray<T>::subError(void) { cout << "ERROR: Subscript out of range.\n"; exit(0); } // The argument is a subscript. T &FreewillArray<T>::operator[ ](const int &sub) { if (sub < 0 || sub > arraySize) subError(); return aptr[sub];

{ FreewillArray <int> intTable(10); void main( ) { FreewillArray <int> intTable(10); FreewillArray <float> floatTable(10); int x; for (x = 0; x < 10; x++) { intTable[x] = (x * 2); floatTable[x] = (x * 2.14); } cout << intTable[x] << " "; cout << endl; cout << floatTable[x] << " "; 7-4.cpp