类库和C的标准模板库STL.ppt_第1页
类库和C的标准模板库STL.ppt_第2页
类库和C的标准模板库STL.ppt_第3页
类库和C的标准模板库STL.ppt_第4页
类库和C的标准模板库STL.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+面向对象程序设计教学内容,第1章 C+概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C+的标准模板库STL 第11章 输入输出流 第12章 异常处理,第10章 类库和C+的标准模板库STL,10.1 类库的概念 10.2 C+的标准模板库STL,10.1 类库的概念,1.1.1 什么是类库(class library)? 1.1.2 如何分析、利用类库? 1.1.3 类库的特点 1.1.4 类库是面向对象的软件开发环境的核心,10.1.1 什么是类库?,类库是类的集合,并且给出了多种类之间的关系描述。 为了便于程序员的开发工作,系统提供了一批可供重用的代码。 (源程序代码) 具体表现为一组类,通过建立彼此间的继承关系形成类库,以类的形式提供给用户重用。,什么是类库? ( 续),在设计和实现面向对象的程序的时候,要用类和类库,才能得到所需的对象,即类的实例。 所以,类库是一种预定义的面向对象的程序库。,类库的例子,C+ Standard STL library Microsoft Visual C+系统中提供的MFC类库。 MFC Microsoft Foundation Class Borland C+系统中提供的OWL类库。 C+ Builder 系统中提供的VCL类库。,类库为软件重用提供基础,OOP提供的继承机制使得程序员可以在已有类的基础上定义自己需要的新类,从而实现了软件模块的重用。,程序员分工进一步细化,在面向对象的程序设计范型之下,程序员的队伍可能要分为两种,它们都以类作为工作对象 一个队伍主要是设计类和类库,另一个队伍主要是使用类来设计应用程序。 分工细化就意味着进步,10.1.2 如何分析、利用类库?,要想发挥面向对象方法的优势,程序员必须知道类库的组织情况。 我们可以通过联机帮助或类库参考手册(类库工作手册)了解: 软件开发系统提供的类库的类层次结构。 可能需要用到的类及其父类的属性和方法。 通过联机文档提供的例子学习有关类的使用方法。,衡量应用程序员能力的标准的变化,结构化程序设计时代的标准:每天编写的源代码行数,程序结构清晰。 面向对象程序设计时代的标准: 衡量一个应用程序员的生产力,要看他是否知道如何来最好地发挥已有类库的功能, 要看他有没有能力将已有的类库与新问题紧密的匹配起来, 还要看他不得不另外编写的代码是不是最少。,10.1.3 类库有什么特点,通用性 可扩充性 概念性与层次性 灵活性,通用性,基于重用的目的,选择具有广泛适用性的东西作为类库的内容,并经过全面的考虑,使之适用于较多的情况。,可扩充性,在软件开发过程中,可以添加新的类供以后使用。 对已有的类库进行改进时,只要保持接口不变,修改不会引起外部(即应用系统)软件的变化。,概念性与层次性,类库中的每个类的概念要明确,易于理解,将具有某些共同性质的类作为基类。 设计类要有一个明确的目标。 一个好的类应该是容易理解和使用的。,10.1.4 类库是面向对象的 软件开发环境的核心,OOP开发方法只有基于软件重用的思想,才能真正提高软件开发的效率和质量。 类库为软件重用提供了基础,程序设计不必再从零开始。 类库不同于传统的子程序库(函数库),它的性能大大优于子程序库。,10.2 C+的标准模板库STL,10.2.1 名字空间namespace简介 10.2.2 C+标准库的构成 10.2.3 标准模板库STL简介 10.2.4 标准模板库STL应用举例,10.2.1 名字空间namespace简介,日常生活中人名相同引起的名字冲突; C+程序中出现相同的名字引起的冲突: 容器类库中有一个List类 窗口类库中有一个List类 如果一个程序中要同时使用这两个类库就会发生名字冲突,名字冲突的危害,在同一个源文件(编译单元)中出现的名字冲突可以由编译器 compiler 检查出来: Redefined Symbols ( ambiguous symbol ) (参见example10_2) 在不同编译单元(如目标文件)之间的名字冲突可能由链接器Linker检查出来: Identifier multiply defined 也可能导致错误链接,从而产生运行时错误 runtime error。,名字冲突的原因,C+中采用的是单一的全局名字空间(参见)。在这单一的空间中,如果有两个类、两个变量或两个函数的名字完全相同,就会出现名字冲突。,作用域的概念 scope,局部作用域 local scopes : 块作用域 函数作用域 文件作用域 全局作用域 global scopes 全局标识符号:全局变量名、全局函数名、全局类型名等等 全局名字在整个程序范围内有效,名字空间 namespace,使用名字空间来划分全局名字空间可以避免名字冲突。 解决的办法就是将程序中相同的名字定义在两个不同的名字空间中。,名字空间 namespace (续),名字空间就是为解决C+中的变量、函数等的名字冲突而服务的。 程序规模越大,名字空间就越有用。 The larger a program is, the more useful namespaces are to express logical separations of its parts. namespace又译作 :命名空间、名称空间,名字空间的例子,/两个在不同命名空间中定义的名字相同的变量 namespace myown1 string user_name = “myown1“; namespace myown2 string user_name = “myown2“; ,名字空间的名字,int main() cout “n“ “Hello, “ myown1:user_name “. and goodbye!n“; cout “n“ “Hello, “ myown2:user_name “. and goodbye!n“; return 0; (参见example10_3),用命名空间限制符myown1访问变量user_name,用命名空间限制符myown2访问变量user_name,int main( ) using namespace myown1; cout “n“ “Hello, “ user_name “. and goodbye!n“; / using namespace myown2; cout “n“ “Hello, “ myown2:user_name “. and goodbye!n“; return 0; (参见example10_4),用命名空间限制符myown2访问变量user_name,无需用命名空间限制符myown1访问变量user_name,创建名字空间,namespace namespacename / / declaration and definitions ,可见,创建名字空间与定义一个类很相似,实际上类名就是一个名字空间的名字。,using namespace,关键字 using 将一个名字空间变为可见,实际上只是将该名字空间的名字添加到当前名字空间中。 命令using的作用域从其声明之处开始并持续到当前作用域scope结束。 在使用一个名字空间时,并不会覆盖当前的名字空间。,using namespace 的有效范围,int main( ) using namespace myown1; cout “n“ “Hello, “ user_name “. and goodbye!n“; using namespace myown2; cout “n“ “Hello, “ user_name “. and goodbye!n“; return 0; ,名字空间小结,一、名字空间解决了C+的名字冲突问题 二、注意名字空间namespace的书写格式,和类class相似或相同。 三、名字空间名必需是唯一的,否则必需在它们的外面再套上一层名字空间,亦即名字空间可以和类一样的嵌套使用 四、同名类在声明实例时必需加上名字空间作用域符“名字空间名:类名” 五、不一定只有类才可加上名字空间的外套,其它如,局部变量、函数等都可加上名字空间外套。,10.2.2 C+标准库的构成,基本的运行库 例如支持动态内存分配、运行时类型信息RTTI C语言的标准库 标准模板库(STL) 输入输出流类库( I/O Stream)和字符串 数值计算库 例如支持复数的计算,C+标准库名字空间,#include using namespace std; int main( ) std: :cout “Hello, world!n“; ,C+的标准库定义在 名字空间 std之中.,标准库定义在名字空间std,#include #include using namespace std; /该编译指示引入std 里的所有符号 /使用该编译指示using namespace std;在C+标准类库中定义的名字在本程序中可以使用 /否则,iostream,string 等c+标准类就不可见了,编译就会出错。,10.2.3 标准模板库STL简介,Standard Template Library ( STL) 包含常用算法和数据结构的通用库 STL的核心内容是3个基本组件: 容器 算法 迭代器,STL中的容器类,容器(container)类是用来保存其它对象的,STL中定义了多种不同类型的容器,例如: 向量 vector 线性表 list 队列 queue 映射 map 集合 set 字符串string (还有其他容器类,可以参考其他书籍或者查阅联机手册),常用算法,排序 sort( ) 查找 find( ) 替换 replace( ) 合并 merge( ) 反序 reverse( ) 统计 count( ) 其他等等算法,迭代器(iterator),迭代器是一种类似于指针的对象。可以使用迭代器来访问容器中的元素,就像我们使用指针来访问数组一样。 STL中定义了五种迭代器: 随机访问迭代器 RandIter 双向迭代器 BiIter 前向迭代器 ForIter 输入迭代器 InIter 输出迭代器 OutIter,STL的简单使用方法,在实际的C+面向对象程序设计中,STL库将起着举足轻重的作用。 STL是一个非常庞大、复杂的类库 目前已经有不少专著介绍STL 我们通过简单的实例介绍最基本的应用方法,10.2.4 标准模板库STL应用举例,向量 vector 线性表 list 队列 queue 映射 map 字符串string,1. 向量 vector,向量vector类可用来支持动态数组,动态数组是指可以根据需要改变大小的数组。 可以很容易地声明一个vector类对象,例如: vector iv; vector cv(5); vector cv(5,x); vector iv2(iv);,vector应用实例,/ Access a vector using an iterator. #include #include using namespace std; int main( ) vector v; / create zero-length vector int i; / put values into a vector for(i=0; i10; i+) v.push_back(A + i);,vector应用实例(续),/ can access vector contents using subscripting for(i=0; i:iterator p = v.begin( ); while(p != v.end() cout *p “ “; p+; return 0; ,2. 线性表 list,线性表 list 类定义了双向的线性表, 又可称为双向链表。List类只支持顺序访问。 下面的C+程序通过实例化链表list类模板建立了一个保存字符的链表,接着使用类模板的排序方法sort( )进行排序,然后输出经过排序后的字符。,线性表list应用实例(续),/ Sort a list. #include #include #include using namespace std; int main() int i; list lst; / create a list of random characters for(i=0; i10; i+) lst.push_back(A+ (rand()%26);,线性表list应用实例(续),cout :iterator p = lst.begin(); while(p != lst.end() cout *p; p+; cout endl endl; / sort the list lst.sort( );,线性表list应用实例(续),cout “Sorted contents: “; p = lst.begin(); while(p != lst.end() cout *p; p+; return 0; ,3. 映射 map,映射map类定义了一个关联容器,并且在容器中使用唯一的关键字来映射相应的值。 map类对象是一系列关键字值的匹配对。 map的功能在于:只要知道了一个值的关键字,就可以找到这个值。 下面的实例程序通过实例化标准库中的map类模板映射建立了一些英文单词与其反义词的对应关系,利用这种对应系可以迅速查找到一个词的反义词。,映射map类应用实例,/ A map of word opposites, using strings. #include #include #include using namespace std; int main( ) int i; map m; m.insert(pair(“yes“, “no“); m.insert(pair(“up“, “down“); m.insert(pair(“left“, “right“); m.insert(pair(“good“, “bad“);,映射map类应用实例(续),string s; cout s; map:iterator p; p = m.find(s); if(p != m.end() cout second; else cout “Word not in map.n“; return 0; ,4. 队列 queue,队列(queue)是一个先进先出(FIFO: First In First Out)的数据结构,在程序设计中经常使用。 对一个队列常用的操作有,在队列尾增加一个元素、在队列头取一个元素以及测试队列是否为空、是否为满等操作。,队列queue的应用实例,Using queue class in the Standard C+ Library, Instantiate a queue for strings and demonstrate the following functions in main( ) to show that you know how to use this class: queue:push( ) queue:pop( ) queue:empty( ) queue:front( ) queue:back( ) queue:size( ),#include #include #include using namespace std; void main( ) queue str_queue; str_queue.push(“string1“); str_queue.push(“string2“); str_queue.push(“string3“);,cout“the size of the queue is: “str_queue.size()endl; cout“the front one “str_queue.front()endl; cout“the back one “str_queue.back()endl; str_queue.pop( ); str_queue.pop( ); str_queue.pop( ); if (str_queue.empty( ) cout“ the queue is empty!“endl; ,5. 字符串类 string,C+提供了两种处理字符串的方法: 以空字符0结尾的字符数组 容器类string类的对象(标准库中的string类) 使用标准库中的string类的三个理由: 一致性(字符串定义为一种数据类型) 方便性(可以使用标准的运算符) 安全性(不会出现数组越界错误),字符串类 string应用实例,/ Demonstrate insert(), erase(), and replace(). #include #include using namespace std; int main() string str1(“This is a test“); string str2(“ABCDEFG“); cout “Initial strings:n“; cout “str1: “ str1 endl; cout “str2: “ str2 “nn“;,字符串类 string应用实例(续),/ demonstrate insert() cout “Insert str2 into str1:n“; str1.insert(5, str2); cout str1 “nn“; / demonstrate erase() cout “Remove 7 characters from str1:n“; str1.erase(5, 7); cout str1 “nn“;,字符串类 string应用实例(续),/ demonstrate

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论