您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 第10章 类库和C++的标准模板库STL 2008
《C++面向对象程序设计》教学内容第1章C++概述第2章类和对象第3章面向对象程序设计概述第4章进一步学习类和对象第5章堆与复制构造函数第6章继承性:派生类第7章运算符重载第8章虚函数和多态性第9章模板第10章类库和C++的标准模板库STL第11章输入输出流第12章异常处理第10章类库和C++的标准模板库STL10.1类库的概念10.2C++的标准模板库STL10.1类库的概念1.1.1什么是类库(classlibrary)?1.1.2如何分析、利用类库?1.1.3类库的特点1.1.4类库是面向对象的软件开发环境的核心10.1.1什么是类库?•类库是类的集合,并且给出了多种类之间的关系描述。•为了便于程序员的开发工作,系统提供了一批可供重用的代码。(源程序代码)•具体表现为一组类,通过建立彼此间的继承关系形成类库,以类的形式提供给用户重用。什么是类库?(续)•在设计和实现面向对象的程序的时候,要用类和类库,才能得到所需的对象,即类的实例。•所以,类库是一种预定义的面向对象的程序库。类库的例子•C++StandardSTLlibrary•MicrosoftVisualC++系统中提供的MFC类库。•MFCMicrosoftFoundationClass•BorlandC++系统中提供的OWL类库。•C++Builder系统中提供的VCL类库。类库为软件重用提供基础•OOP提供的继承机制使得程序员可以在已有类的基础上定义自己需要的新类,从而实现了软件模块的重用。程序员分工进一步细化•在面向对象的程序设计范型之下,程序员的队伍可能要分为两种,它们都以类作为工作对象•一个队伍主要是设计类和类库,另一个队伍主要是使用类来设计应用程序。•分工细化就意味着进步10.1.2如何分析、利用类库?•要想发挥面向对象方法的优势,程序员必须知道类库的组织情况。•我们可以通过联机帮助或类库参考手册(类库工作手册)了解:⒈软件开发系统提供的类库的类层次结构。⒉可能需要用到的类及其父类的属性和方法。⒊通过联机文档提供的例子学习有关类的使用方法。衡量应用程序员能力的标准的变化•结构化程序设计时代的标准:每天编写的源代码行数,程序结构清晰。•面向对象程序设计时代的标准:•衡量一个应用程序员的生产力,要看他是否知道如何来最好地发挥已有类库的功能,•要看他有没有能力将已有的类库与新问题紧密的匹配起来,•还要看他不得不另外编写的代码是不是最少。10.1.3类库有什么特点1.通用性2.可扩充性3.概念性与层次性4.灵活性通用性•基于重用的目的,选择具有广泛适用性的东西作为类库的内容,并经过全面的考虑,使之适用于较多的情况。可扩充性•在软件开发过程中,可以添加新的类供以后使用。•对已有的类库进行改进时,只要保持接口不变,修改不会引起外部(即应用系统)软件的变化。概念性与层次性•类库中的每个类的概念要明确,易于理解,将具有某些共同性质的类作为基类。•设计类要有一个明确的目标。•一个好的类应该是容易理解和使用的。10.1.4类库是面向对象的软件开发环境的核心1.OOP开发方法只有基于软件重用的思想,才能真正提高软件开发的效率和质量。2.类库为软件重用提供了基础,程序设计不必再从零开始。3.类库不同于传统的子程序库(函数库),它的性能大大优于子程序库。10.2C++的标准模板库STL10.2.1名字空间namespace简介10.2.2C++标准库的构成10.2.3标准模板库STL简介10.2.4标准模板库STL应用举例10.2.1名字空间namespace简介•日常生活中人名相同引起的名字冲突;•C++程序中出现相同的名字引起的冲突:–容器类库中有一个List类–窗口类库中有一个List类–如果一个程序中要同时使用这两个类库就会发生名字冲突名字冲突的危害•在同一个源文件(编译单元)中出现的名字冲突可以由编译器compiler检查出来:–RedefinedSymbols(ambiguoussymbol)•(参见example10_2)•在不同编译单元(如目标文件)之间的名字冲突可能由链接器Linker检查出来:–Identifiermultiplydefined•也可能导致错误链接,从而产生运行时错误runtimeerror。名字冲突的原因•C++中采用的是单一的全局名字空间(参见)。在这单一的空间中,如果有两个类、两个变量或两个函数的名字完全相同,就会出现名字冲突。作用域的概念scope•局部作用域localscopes:–块作用域–函数作用域–文件作用域•全局作用域globalscopes–全局标识符号:全局变量名、全局函数名、全局类型名等等–全局名字在整个程序范围内有效名字空间namespace•使用名字空间来划分全局名字空间可以避免名字冲突。•解决的办法就是将程序中相同的名字定义在两个不同的名字空间中。名字空间namespace(续)•名字空间就是为解决C++中的变量、函数等的名字冲突而服务的。•程序规模越大,名字空间就越有用。Thelargeraprogramis,themoreusefulnamespacesaretoexpresslogicalseparationsofitsparts.namespace又译作:命名空间、名称空间名字空间的例子//两个在不同命名空间中定义的名字相同的变量namespacemyown1{stringuser_name=myown1;}namespacemyown2{stringuser_name=myown2;}名字空间的名字intmain(){cout\nHello,myown1::user_name...andgoodbye!\n;cout\nHello,myown2::user_name...andgoodbye!\n;return0;}(参见example10_3)用命名空间限制符myown1访问变量user_name用命名空间限制符myown2访问变量user_nameintmain(){usingnamespacemyown1;cout\nHello,user_name...andgoodbye!\n;//usingnamespacemyown2;cout\nHello,myown2::user_name...andgoodbye!\n;return0;}(参见example10_4)用命名空间限制符myown2访问变量user_name无需用命名空间限制符myown1访问变量user_name创建名字空间namespacenamespacename{//declarationanddefinitions}可见,创建名字空间与定义一个类很相似,实际上类名就是一个名字空间的名字。usingnamespace•关键字using将一个名字空间变为可见,实际上只是将该名字空间的名字添加到当前名字空间中。•命令using的作用域从其声明之处开始并持续到当前作用域scope结束。•在使用一个名字空间时,并不会覆盖当前的名字空间。usingnamespace的有效范围intmain(){{usingnamespacemyown1;cout\nHello,user_name...andgoodbye!\n;}usingnamespacemyown2;cout\nHello,user_name...andgoodbye!\n;return0;}名字空间小结一、名字空间解决了C++的名字冲突问题二、注意名字空间namespace的书写格式,和类class相似或相同。三、名字空间名必需是唯一的,否则必需在它们的外面再套上一层名字空间,亦即名字空间可以和类一样的嵌套使用四、同名类在声明实例时必需加上名字空间作用域符“名字空间名::类名”五、不一定只有类才可加上名字空间的外套,其它如,局部变量、函数等都可加上名字空间外套。10.2.2C++标准库的构成•基本的运行库–例如支持动态内存分配、运行时类型信息RTTI•C语言的标准库•标准模板库(STL)•输入输出流类库(I/OStream)和字符串•数值计算库–例如支持复数的计算C++标准库名字空间#includeiostreamusingnamespacestd;intmain(){std::coutHello,world!\n;}C++的标准库定义在名字空间std之中.标准库定义在名字空间std#includeiostream#includestringusingnamespacestd;//该编译指示引入std里的所有符号//使用该编译指示usingnamespacestd;在C++标准类库中定义的名字在本程序中可以使用//否则,iostream,string等c++标准类就不可见了,编译就会出错。10.2.3标准模板库STL简介•StandardTemplateLibrary(STL)•包含常用算法和数据结构的通用库•STL的核心内容是3个基本组件:–容器–算法–迭代器STL中的容器类•容器(container)类是用来保存其它对象的,STL中定义了多种不同类型的容器,例如:–向量vector–线性表list–队列queue–映射map–集合set–字符串string•(还有其他容器类,可以参考其他书籍或者查阅联机手册)常用算法algorithm•排序sort()•查找find()•替换replace()•合并merge()•反序reverse()•统计count()•其他等等算法迭代器(iterator)•迭代器是一种类似于指针的对象。可以使用迭代器来访问容器中的元素,就像我们使用指针来访问数组一样。•STL中定义了五种迭代器:–随机访问迭代器RandIter–双向迭代器BiIter–前向迭代器ForIter–输入迭代器InIter–输出迭代器OutIterSTL的简单使用方法•在实际的C++面向对象程序设计中,STL库将起着举足轻重的作用。•STL是一个非常庞大、复杂的类库•目前已经有不少专著介绍STL•我们通过简单的实例介绍最基本的应用方法10.2.4标准模板库STL应用举例1.向量vector2.线性表list3.队列queue4.映射map5.字符串string1.向量vector•向量vector类可用来支持动态数组,动态数组是指可以根据需要改变大小的数组。•可以很容易地声明一个vector类对象,例如:vectorintiv;vectorintcv(5);vectorintcv(5,’x’);vectorintiv2(iv);vector应用实例//Accessavectorusinganiterator.#includeiostream#includevectorusingnamespacestd;intmain(){vectorcharv;//createzero-lengthvectorinti;//putvaluesintoavectorfor(i=0;i10;i++)v.push_back('A'+i);vector应用实例(续)//canaccessvectorcontentsusingsubscriptingfor(i=0;i10;i++)coutv[i];coutendl;//accessviaiteratorvectorchar::iteratorp=v.begin();while(p!=v.end()){cout*p;p++;}return0;}2.线性表list•线性表list类定义了双向的线性表,又可称为双向链表。List类只支持顺序访问。•下面的C++程序通过实例化链表list类模板建立了一个保存字符的链表,接着使用类模板的排序方法sort()进行排序,然后输出经过排序后的字符。线性表list应用实例(续)//Sortalist.#includeiostream
本文标题:第10章 类库和C++的标准模板库STL 2008
链接地址:https://www.777doc.com/doc-3856710 .html