C++程序语言设计 Chapter 14: Templates.

Slides:



Advertisements
Similar presentations
微型企業 之租稅及會計實務 田嘉昇 會計師 致遠會計師事務所 民國 00 年 00 月 00 日 田嘉昇 會計師 致遠會計師事務所 民國 00 年 00 月 00 日.
Advertisements

单元二:面向对象程序设计 任务二:借书卡程序设计.
电子成绩单项目实现.
做好就业与自主创业的准备.
四資二甲 第三週作業 物件導向程式設計.
Memory Pool ACM Yanqing Peng.
面向对象的程序设计(一).
公文/檔案管理作業流程 簡 報 總務處 文書組 報告人:田至琴 9 7 年3 月7 日 1 1.
Chapter9 金融监管体系.
Linked List Operations
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
1、基本概念 2、插入排序 3、交换排序 4、选择排序 5、归并排序 6、基数排序 7、外部排序
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第五章 模 板.
類別樣板 Class Template 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體(instance)
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
第2章回顾 标识符:不用记,动手 关键字:if, else, switch, for, while, do, break, continue, void, …… 局部变量和成员变量 ①变量作用域 ②内存布局 基本数据类型 ①4类8种 ②互相转换 流程控制语句 ①分支 if……else, switch.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
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++ 的信心。
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
Java程序设计 第9章 继承和多态.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
第四章 小技巧.
C++程序设计 string(字符串类) vector(容器类).
Ch02-基礎語法.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
语义分析概述 符号表 第六章 语义分析.
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
潘爱民 C++ Overview 潘爱民
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++大学基础教程 第10章 运算符重载 北京科技大学 2019/5/7 北京科技大学.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第二章 类型、对象、运算符和表达式.
陣列 東海大學物理系‧資訊教育 施奇廷.
累堆排序法 (Heap Sort).
Review 1~3.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
第 9 章 建構函式與解構函式.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
Class 2005/05/25.
第2章 Java语言基础.
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
Presentation transcript:

C++程序语言设计 Chapter 14: Templates

Outline 函数模板 类模板 标准模板库STL

回顾vector vector是一个模板(template),可以有效的用于不同的类型。 vector<string> v; ifstream in("FillVector.cpp"); string line; while (getline(in, line)) { v.push_back(line); } vector<int> v; for (int i = 0; i < 10; i ++) { v.push_back(i); }

模板(template) 将类型作为参数传给模板,由编译器生成该类型的函数或者类。 通用编程:模板允许以通用类型(而不是具体类型)的方式编写程序。 参数化类型:类型采用参数表示。

函数模板 编写一个交换两个int值的函数 再编写一个交换两个double值的函数 再编写一个交换两个char值的函数 void swap (int & a, int & b) { int temp; temp = a; a = b; b = temp; } 再编写一个交换两个double值的函数 再编写一个交换两个char值的函数

解决方案一 复制原来的代码,并分别用double和char替换所有的int 优点: 缺点: 思路简单明了 浪费时间,容易出错 如果修改算法,都需要修改

解决方案二 利用函数模板自动完成,只需指明其类型参数即可。 关键字class在较新的编译器中可以用typename替换。 template <class T> void swap (T & a, T & b){ T temp; temp = a; a = b; b = temp; } 关键字class在较新的编译器中可以用typename替换。 参看代码:funtemp.cpp

注意事项 模板与宏类似,由预处理域移至编译域。 模板并不处理函数,只是告诉编译器如何定义函数。 关键字typename更为明显的说明参数T表示类型,但大量的代码库还是使用class。 函数模板不能缩短可执行程序,最终的代码不包含任何模板,只包含实际生成的函数。 好处在于使生成多个函数定义简单、可靠。

函数模板重载 可以像重载常规函数定义那样重载函数模板定义。 被重载的函数模板的函数特征必须不同。 并非所有的函数模板参数都必须是函数模板参数类型。 参看代码:twotemps.cpp

显示具体化 假设有如下结构: 若只交换salary和floor成员,怎么办? 提供一个具体化函数定义,称为显式具体化 struct job { char name[40]; double salary; int floor; } 若只交换salary和floor成员,怎么办? 提供一个具体化函数定义,称为显式具体化 template <> void Swap<job>(job &, job &);

显示具体化 非模板函数 模板函数 显式具体化模板函数 void Swap (job &, job &); 模板函数 template <class T> void Swap (T &, T &); 显式具体化模板函数 template <>void Swap<job> (job &, job &); 非模板函数优先于显式具体化模板函数和模板函数,而显式具体化模板函数优先于模板函数。参考代码:twoswap.cpp

类模板 继承和组合并不是总能够满足重用代码的需要,还要用到类模板。 比如容器类,算法代码相同,只有保存的对象类型不同。 可以编写一个通用的容器类,将具体的类型作为参数传递给它。

类模板语法 采用template<class T>进行声明 template<class T> class Array{ enum { size = 100 }; T A[size]; public: T& operator[](int index) { return A[index]; } }; int main(){ Array<int> ia; Array<float> fa;}

非内联函数定义 需要在成员函数定义前看到template声明 在引用模板类名的地方,必须伴有该模板的参数列表 参看代码:Array.cpp

头文件 通常,即使是在创建非内联函数定义时,都把类模板的所有声明和定义放入一个头文件中。 不同的编译器实现方式不同,大多数允许在一个独特的cpp文件中放置类模板的定义,需要采用新的export关键字,且每个定义都要一export开始。

使用类模板 仅在程序中包含类模板并不能生成模板类,需要请求实例化。 与常规的函数模板不同,实例化类模板必须显式的提供所需的类型。 vector<string> v; vector<int> v; 与常规的函数模板不同,实例化类模板必须显式的提供所需的类型。 Swap (3, 4); Swap (0.4, 3.2);

标准模板库STL 阅读文档 C++ STL轻松导学.doc 来源: http://morningspace.51.net/index.php

下次课内容 异常处理、XML解析 谢谢大家!