您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 10类库和C++的标准模板库STL
《C++面向对象程序设计》教学内容第1章C++概述第2章类和对象第3章面向对象程序设计概述第4章进一步学习类和对象第5章堆与复制构造函数第6章继承性:派生类第7章运算符重载第8章虚函数和多态性第9章模板第10章类库和C++的标准模板库STL第11章输入输出流第12章异常处理第10章类库和C++的标准模板库STL10.1类库的概念10.2C++的标准模板库STL10.1类库的概念10.1.1什么是类库(classlibrary)?10.1.2如何分析、利用类库?10.1.3类库的特点10.1.4类库是面向对象的软件开发环境的核心10.1.1什么是类库?•类库是类的集合,并且给出了多种类之间的关系描述。•为了便于程序员的开发工作,软件开发系统提供了一批可供重用的代码。•具体表现为一组类,通过建立彼此间的继承关系形成类库,以类的形式提供给程序员重用。输入/输出流类派生体系流类的继承层次iosostreamistreamfstreamiostreamofstreamifstream什么是类库?(续)•在设计和实现面向对象的程序的时候,要用类和类库,才能得到所需的对象,即类的实例。•所以,类库是一种预定义的面向对象的程序库。类库使用举例•以下简单程序就使用了流类库中预定义的对象cout。cout是流类库中ostream_withassign类的对象。#includeiostreamusingnamespacestd;intmain(){coutHello,world!\n;return0;}类库的例子•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++源程序中,如果两个变量名、两个类名或两个函数原型完全相同,则可能造成名字冲突。编译器会报错。•大型程序是由不同的人分工完成的,不同的人可能会在自己的程序中使用了与别人相同的名字,当他们的程序合在一起时,就可能发生名字冲突。因此软件规模越大,就越可能产生名字冲突问题。•例如,有两个头文件://header1.hchar*user_name=myown1;//header2.hchar*user_name=myown2;#includeiostream.h#includeheader1.h#includeheader2.hintmain(){coutHello,user_nameendl;}•程序中有两个重名的user_name变量,编译会报错。名字冲突的危害•在同一个源文件(编译单元)中出现的名字冲突可以由编译器compiler检查出来:–RedefinedSymbols(ambiguoussymbol)•在不同编译单元(如目标文件)之间的名字冲突可能由链接器Linker检查出来:–Identifiermultiplydefined•也可能检查不出来,导致错误链接,从而产生运行时错误runtimeerror。名字冲突的原因•C++中采用的是单一的全局名字空间。在这单一的空间中,如果有两个类、两个变量或两个函数的名字完全相同,就会出现名字冲突。名字空间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;}用命名空间限制符myown1访问变量user_name用命名空间限制符myown2访问变量user_name创建名字空间namespacenamespacename{//declarationanddefinitions};•在名字空间体中声明的实体称为该名字空间的成员。名字空间可以看作是类作用域的推广,即namespace定义了名字空间作用域。作用域的概念scope•标准C++语言中定义了如下几种层次的作用域:•1)局部作用域(localscope):由{}包括起来的一个闭合块,又称为块作用域。•2)函数作用域(functionscope):包含函数体的{}界定的区域。函数的形式参数在整个函数的作用域内有效。•3)类作用域(localscope):不但包含类体的{}范围,而且包含该类所有的成员函数体的范围。•4)名字空间作用域(namespacescope):包含名字空间体{}界定的范围。一个名字空间的成员名字不但在该名字空间有效,而且在使用using编译指令添加该名字或者该名字所在的名字空间的作用域内有效。作用域的概念(续)•在上述各种作用域之外声明和定义的变量名、函数名和类名通常被称为全局名字,分别称为全局变量名、全局函数名、全局类型名等等。•全局名字在整个程序范围内有效。使用全局名字很容易出现名字冲突,所以我们最好将名字定义在某个名字空间中。•一般来说,程序规模越大,程序中出现相同名字的概率就越大,名字空间就越有用。usingnamespace•如果在程序中要大量地使用某个名字空间中的成员,那么就不得不在每次使用某个成员时加上名字空间名称和作用域解析运算符,这将会成为一项繁琐的工作。•可使用usingnamespace命令把一个名字空间中所有的名字引入当前作用域。usingnamespacename;•命令usingnamespace的作用域从其声明之处开始并持续到当前作用域scope结束。#includeiostream.h#includeheader1.h#includeheader2.hintmain(){usingnamespacemyown1;coutHello,user_nameendl;coutHello,myown2::user_nameendl;}需用命名空间限制符myown2访问变量user_nameusingname::member;•可使用usingname::member;命令把名字空间name中的成员引入到当前作用域。如下例所示。#includeiostreamusingnamespacestd;#includeheader1.h#includeheader2.hintmain(){usingnamespacemyown1;coutHello,user_nameendl;usingmyown2::user_name;coutHello,user_nameendl;return0;}本例中使用命令usingmyown2::user_name;使得名字空间myown2中的定义的变量名user_name可以在主函数main()的作用域中可见,请注意这个myown2中的user_name覆盖了当前的作用域中的myown1::user_name。•C++的标准库定义在名字空间std之中。因此在C++程序中经常需要加入以下命令:usingnamesapecestd;•这条语句将名字空间std中的定义的所有名字都添加到当前作用域中,这样你就可以直接使用C++标准库中的类和函数,而不需要在每个名字前加上std::。C++标准库的名字空间std•以下两个程序是等价的。#includeiostreamintmain(){std::coutHello!;return0;}#includeiostreamusingnamespacestd;intmain(){coutHello!;return0;}•如果只用到C++标准库中的某些名字,那么可以对每个名字分别使用using语句来将它们的引入到当前的名字空间。•这种方法的好处在于:在程序中使用C++标准库中的名字时不需要std::限定符,然而也不需要将整个C++标准库所有名字都添加到全局名字空间中。请参见下例。#includeiostreamusingstd::cout;//将对象cout添加到当前作用域usingstd::cin
本文标题:10类库和C++的标准模板库STL
链接地址:https://www.777doc.com/doc-3381750 .html