C++面向对象程序设计_第10章__类库和C++的标准模板库STL
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main( )
{
std: :cout << "Hello, world!\n";
}
C++的标准库定义在 名字空间 std之中.
标准库定义在名字空间std
#include <iostream>
#include <string> using namespace std; //该编译指示引入std 里的所有符号
类库为软件重用提供基础
• OOP提供的继承机制使得程序员 可以在已有类的基础上定义自己 需要的新类,从而实现了软件模 块的重用。
程序员分工进一步细化
• 在面向对象的程序设计范型之下,程序 员的队伍可能要分为两种,它们都以类 作为工作对象 • 一个队伍主要是设计类和类库,另一个 队伍主要是使用类来设计应用程序。 • 分工细化就意味着进步
• (参见example10_2) • 在不同编译单元(如目标文件)之间的 名字冲突可能由链接器Linker检查出来:
– Identifier multiply defined
• 也可能导致错误链接,从而产生运行时 错误 runtime error。
名字冲突的原因
• C++中采用的是单一的全局名字空间 (参见)。在这单一的空间中,如果有 两个类、两个变量或两个函数的名字完 全相同,就会出现名字冲突。
作用域的概念 scope
• 局部作用域 local scopes :
– 块作用域 – 函数作用域 – 文件作用域
• 全局作用域 global scopes
– 全局标识符号:全局变量名、全局函数名、全 局类型名等等 – 全局名字在整个程序范围内有效
名字空间 namespace
• 使用名字空间来划分全局名字空间可 以避免名字冲突。
– 容器类库中有一个List类 – 窗口类库中有一个List类 – 如果一个程序中要同时使用这两个类库就会 发生名字冲突
名字冲突的危害
• 在同一个源文件(编译单元)中出现的 名字冲突可以由编译器 compiler 检查出 来:
– Redefined Symbols ( ambiguous symbol )
• STL的核心内容是3个基本组件:
– 容器 – 算法 – 迭代器
STL中的容器类
• 容器(container)类是用来保存其它对象的,STL 中定义了多种不同类型的容器,例如:
– – – – – – 向量 vector 线性表 list 队列 queue 映射 map 集合 set 字符串string
10.1.2 如何分析、利用类库?
• 要想发挥面向对象方法的优势,程序员必须 知道类库的组织情况。 • 我们可以通过联机帮助或类库参考手册(类 库工作手册)了解: ⒈ 软件开发系统提供的类库的类层次结构。 ⒉ 可能需要用到的类及其父类的属性和方法。 ⒊ 通过联机文档提供的例子学习有关类的使 用方法。
名字空间小结
一、名字空间解决了C++的名字冲突问题
二、注意名字空间namespace的书写格式,和类class相似 或相同。
三、名字空间名必需是唯一的,否则必需在它们的外面 再套上一层名字空间,亦即名字空间可以和类一样的嵌套 使用 四、同名类在声明实例时必需加上名字空间作用域符 “名字空间名::类名” 五、不一定只有类才可加上名字空间的外套,其它如, 局部变量、函数等都可加上名字空间外套。
• 在实际的C++面向对象程序设计中,STL 库将起着举足轻重的作用。 • STL是一个非常庞大、复杂的类库 • 目前已经有不少专著介绍STL • 我们通过简单的实例介绍最基本的应用 方法
10.2.4 标准模板库STL应用举例
1. 2. 3. 4. 5. 向量 vector 线性表 list 队列 queue 映射 map 字符串string
第10章 类库和C++的标准模板库STL
10.1 类库的概念
10.2 C++的标准模板库STL
10.1 类库的概念
1.1.1 1.1.2 1.1.3 1.1.4 什么是类库(class library)? 如何分析、利用类库? 类库的特点 类库是面向对象的软件开发环境的核心
10.1.1 什么是类库?
10.2.2 C++标准库的构成
• 基本的运行库
– 例如支持动态内存分配、运行时类型信息RTTI
Fra Baidu bibliotek
• • • •
C语言的标准库 标准模板库(STL) 输入输出流类库( I/O Stream)和字符串 数值计算库
– 例如支持复数的计算
C++标准库名字空间
#include <iostream>
using namespace std;
衡量应用程序员能力的标准的变化
• 结构化程序设计时代的标准:每天编写的 源代码行数,程序结构清晰。 • 面向对象程序设计时代的标准: • 衡量一个应用程序员的生产力,要看他是 否知道如何来最好地发挥已有类库的功能, • 要看他有没有能力将已有的类库与新问题 紧密的匹配起来, • 还要看他不得不另外编写的代码是不是最 少。
• 类库是类的集合,并且给出了多种类之 间的关系描述。 • 为了便于程序员的开发工作,系统提供 了一批可供重用的代码。 (源程序代码) • 具体表现为一组类,通过建立彼此间的 继承关系形成类库,以类的形式提供给 用户重用。
什么是类库? ( 续)
• 在设计和实现面向对象的程序的时候, 要用类和类库,才能得到所需的对象, 即类的实例。 • 所以,类库是一种预定义的面向对象的 程序库。
10.1.3 类库有什么特点
1. 2. 3. 4. 通用性 可扩充性 概念性与层次性 灵活性
通用性
• 基于重用的目的,选择具有广泛适 用性的东西作为类库的内容,并经 过全面的考虑,使之适用于较多的 情况。
可扩充性
• 在软件开发过程中,可以添加新的 类供以后使用。 • 对已有的类库进行改进时,只要保 持接口不变,修改不会引起外部 (即应用系统)软件的变化。
{
/ / declaration and definitions }
可见,创建名字空间与定义一个类很相似,
实际上类名就是一个名字空间的名字。
using namespace
• 关键字 using 将一个名字空间变为可见, 实际上只是将该名字空间的名字添加到 当前名字空间中。
• 命令using的作用域从其声明之处开始并 持续到当前作用域scope结束。
概念性与层次性
• 类库中的每个类的概念要明确,易 于理解,将具有某些共同性质的类 作为基类。 • 设计类要有一个明确的目标。 • 一个好的类应该是容易理解和使用 的。
10.1.4 类库是面向对象的
软件开发环境的核心
1. OOP开发方法只有基于软件重用的思想, 才能真正提高软件开发的效率和质量。 2. 类库为软件重用提供了基础,程序设计不 必再从零开始。 3. 类库不同于传统的子程序库(函数库), 它的性能大大优于子程序库。
用命名空间限制符 myown1访问变量 user_name
cout<< "\n"<< "Hello, "
<< myown2::user_name << "... and goodbye!\n"; return 0; } (参见example10_3)
用命名空间限制符 myown2访问变量 user_name
//
using namespace myown2;
cout<< "\n"<< "Hello, " << myown2::user_name << "... and goodbye!\n"; return 0;
} (参见example10_4)
创建名字空间
namespace namespacename
类库的例子
• C++ Standard STL library • Microsoft Visual C++系统中提供的MFC 类库。 • MFC Microsoft Foundation Class • Borland C++系统中提供的OWL类库。 • C++ Builder 系统中提供的VCL类库。
int main( )
{ using namespace myown1; cout<< "\n"<< "Hello, "
无需用命名空间限制 符myown1访问变量 user_name
<< user_name << "... and goodbye!\n"; 用命名空间限制符 myown2访问变量 user_name
名字空间的例子
//两个在不同命名空间中定义的名字相同的变量 namespace myown1 { string user_name = "myown1"; } namespace myown2 名字空间的名字
{
string user_name = "myown2"; }
int main()
{ cout<< "\n"<< "Hello, " << myown1::user_name << "... and goodbye!\n";
• 解决的办法就是将程序中相同的名字 定义在两个不同的名字空间中。
名字空间 namespace (续)
• 名字空间就是为解决C++中的变量、函数 等的名字冲突而服务的。 • 程序规模越大,名字空间就越有用。 The larger a program is, the more useful namespaces are to express logical separations of its parts. namespace又译作 :命名空间、名称空间
《C++面向对象程序设计》教学内容
第1章 C++概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C++的标准模板库STL 第11章 输入输出流 第12章 异常处理
1. 向量 vector
• 向量vector类可用来支持动态数组,动态数 组是指可以根据需要改变大小的数组。
• 可以很容易地声明一个vector类对象,例如:
vector <int> iv; vector <int> cv(5); vector <int> cv(5,’x’); vector <int> iv2(iv);
• 迭代器是一种类似于指针的对象。可以使用迭 代器来访问容器中的元素,就像我们使用指针 来访问数组一样。
• STL中定义了五种迭代器:
– – – – – 随机访问迭代器 RandIter 双向迭代器 BiIter 前向迭代器 ForIter 输入迭代器 InIter 输出迭代器 OutIter
STL的简单使用方法
//使用该编译指示using namespace std;在C++标准类库中定义 的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出 错。
10.2.3 标准模板库STL简介
• Standard Template Library ( STL) • 包含常用算法和数据结构的通用库
• 在使用一个名字空间时,并不会覆盖当 前的名字空间。
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; }
10.2 C++的标准模板库STL
10.2.1 10.2.2 10.2.3 10.2.4 名字空间namespace简介 C++标准库的构成 标准模板库STL简介 标准模板库STL应用举例
10.2.1 名字空间namespace简介
• 日常生活中人名相同引起的名字冲突;
• C++程序中出现相同的名字引起的冲突:
• (还有其他容器类,可以参考其他书籍或者查阅 联机手册)
常用算法<algorithm>
• • • • • • • 排序 sort( ) 查找 find( ) 替换 replace( ) 合并 merge( ) 反序 reverse( ) 统计 count( ) 其他等等算法
迭代器(iterator)
{
std: :cout << "Hello, world!\n";
}
C++的标准库定义在 名字空间 std之中.
标准库定义在名字空间std
#include <iostream>
#include <string> using namespace std; //该编译指示引入std 里的所有符号
类库为软件重用提供基础
• OOP提供的继承机制使得程序员 可以在已有类的基础上定义自己 需要的新类,从而实现了软件模 块的重用。
程序员分工进一步细化
• 在面向对象的程序设计范型之下,程序 员的队伍可能要分为两种,它们都以类 作为工作对象 • 一个队伍主要是设计类和类库,另一个 队伍主要是使用类来设计应用程序。 • 分工细化就意味着进步
• (参见example10_2) • 在不同编译单元(如目标文件)之间的 名字冲突可能由链接器Linker检查出来:
– Identifier multiply defined
• 也可能导致错误链接,从而产生运行时 错误 runtime error。
名字冲突的原因
• C++中采用的是单一的全局名字空间 (参见)。在这单一的空间中,如果有 两个类、两个变量或两个函数的名字完 全相同,就会出现名字冲突。
作用域的概念 scope
• 局部作用域 local scopes :
– 块作用域 – 函数作用域 – 文件作用域
• 全局作用域 global scopes
– 全局标识符号:全局变量名、全局函数名、全 局类型名等等 – 全局名字在整个程序范围内有效
名字空间 namespace
• 使用名字空间来划分全局名字空间可 以避免名字冲突。
– 容器类库中有一个List类 – 窗口类库中有一个List类 – 如果一个程序中要同时使用这两个类库就会 发生名字冲突
名字冲突的危害
• 在同一个源文件(编译单元)中出现的 名字冲突可以由编译器 compiler 检查出 来:
– Redefined Symbols ( ambiguous symbol )
• STL的核心内容是3个基本组件:
– 容器 – 算法 – 迭代器
STL中的容器类
• 容器(container)类是用来保存其它对象的,STL 中定义了多种不同类型的容器,例如:
– – – – – – 向量 vector 线性表 list 队列 queue 映射 map 集合 set 字符串string
10.1.2 如何分析、利用类库?
• 要想发挥面向对象方法的优势,程序员必须 知道类库的组织情况。 • 我们可以通过联机帮助或类库参考手册(类 库工作手册)了解: ⒈ 软件开发系统提供的类库的类层次结构。 ⒉ 可能需要用到的类及其父类的属性和方法。 ⒊ 通过联机文档提供的例子学习有关类的使 用方法。
名字空间小结
一、名字空间解决了C++的名字冲突问题
二、注意名字空间namespace的书写格式,和类class相似 或相同。
三、名字空间名必需是唯一的,否则必需在它们的外面 再套上一层名字空间,亦即名字空间可以和类一样的嵌套 使用 四、同名类在声明实例时必需加上名字空间作用域符 “名字空间名::类名” 五、不一定只有类才可加上名字空间的外套,其它如, 局部变量、函数等都可加上名字空间外套。
• 在实际的C++面向对象程序设计中,STL 库将起着举足轻重的作用。 • STL是一个非常庞大、复杂的类库 • 目前已经有不少专著介绍STL • 我们通过简单的实例介绍最基本的应用 方法
10.2.4 标准模板库STL应用举例
1. 2. 3. 4. 5. 向量 vector 线性表 list 队列 queue 映射 map 字符串string
第10章 类库和C++的标准模板库STL
10.1 类库的概念
10.2 C++的标准模板库STL
10.1 类库的概念
1.1.1 1.1.2 1.1.3 1.1.4 什么是类库(class library)? 如何分析、利用类库? 类库的特点 类库是面向对象的软件开发环境的核心
10.1.1 什么是类库?
10.2.2 C++标准库的构成
• 基本的运行库
– 例如支持动态内存分配、运行时类型信息RTTI
Fra Baidu bibliotek
• • • •
C语言的标准库 标准模板库(STL) 输入输出流类库( I/O Stream)和字符串 数值计算库
– 例如支持复数的计算
C++标准库名字空间
#include <iostream>
using namespace std;
衡量应用程序员能力的标准的变化
• 结构化程序设计时代的标准:每天编写的 源代码行数,程序结构清晰。 • 面向对象程序设计时代的标准: • 衡量一个应用程序员的生产力,要看他是 否知道如何来最好地发挥已有类库的功能, • 要看他有没有能力将已有的类库与新问题 紧密的匹配起来, • 还要看他不得不另外编写的代码是不是最 少。
• 类库是类的集合,并且给出了多种类之 间的关系描述。 • 为了便于程序员的开发工作,系统提供 了一批可供重用的代码。 (源程序代码) • 具体表现为一组类,通过建立彼此间的 继承关系形成类库,以类的形式提供给 用户重用。
什么是类库? ( 续)
• 在设计和实现面向对象的程序的时候, 要用类和类库,才能得到所需的对象, 即类的实例。 • 所以,类库是一种预定义的面向对象的 程序库。
10.1.3 类库有什么特点
1. 2. 3. 4. 通用性 可扩充性 概念性与层次性 灵活性
通用性
• 基于重用的目的,选择具有广泛适 用性的东西作为类库的内容,并经 过全面的考虑,使之适用于较多的 情况。
可扩充性
• 在软件开发过程中,可以添加新的 类供以后使用。 • 对已有的类库进行改进时,只要保 持接口不变,修改不会引起外部 (即应用系统)软件的变化。
{
/ / declaration and definitions }
可见,创建名字空间与定义一个类很相似,
实际上类名就是一个名字空间的名字。
using namespace
• 关键字 using 将一个名字空间变为可见, 实际上只是将该名字空间的名字添加到 当前名字空间中。
• 命令using的作用域从其声明之处开始并 持续到当前作用域scope结束。
概念性与层次性
• 类库中的每个类的概念要明确,易 于理解,将具有某些共同性质的类 作为基类。 • 设计类要有一个明确的目标。 • 一个好的类应该是容易理解和使用 的。
10.1.4 类库是面向对象的
软件开发环境的核心
1. OOP开发方法只有基于软件重用的思想, 才能真正提高软件开发的效率和质量。 2. 类库为软件重用提供了基础,程序设计不 必再从零开始。 3. 类库不同于传统的子程序库(函数库), 它的性能大大优于子程序库。
用命名空间限制符 myown1访问变量 user_name
cout<< "\n"<< "Hello, "
<< myown2::user_name << "... and goodbye!\n"; return 0; } (参见example10_3)
用命名空间限制符 myown2访问变量 user_name
//
using namespace myown2;
cout<< "\n"<< "Hello, " << myown2::user_name << "... and goodbye!\n"; return 0;
} (参见example10_4)
创建名字空间
namespace namespacename
类库的例子
• C++ Standard STL library • Microsoft Visual C++系统中提供的MFC 类库。 • MFC Microsoft Foundation Class • Borland C++系统中提供的OWL类库。 • C++ Builder 系统中提供的VCL类库。
int main( )
{ using namespace myown1; cout<< "\n"<< "Hello, "
无需用命名空间限制 符myown1访问变量 user_name
<< user_name << "... and goodbye!\n"; 用命名空间限制符 myown2访问变量 user_name
名字空间的例子
//两个在不同命名空间中定义的名字相同的变量 namespace myown1 { string user_name = "myown1"; } namespace myown2 名字空间的名字
{
string user_name = "myown2"; }
int main()
{ cout<< "\n"<< "Hello, " << myown1::user_name << "... and goodbye!\n";
• 解决的办法就是将程序中相同的名字 定义在两个不同的名字空间中。
名字空间 namespace (续)
• 名字空间就是为解决C++中的变量、函数 等的名字冲突而服务的。 • 程序规模越大,名字空间就越有用。 The larger a program is, the more useful namespaces are to express logical separations of its parts. namespace又译作 :命名空间、名称空间
《C++面向对象程序设计》教学内容
第1章 C++概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C++的标准模板库STL 第11章 输入输出流 第12章 异常处理
1. 向量 vector
• 向量vector类可用来支持动态数组,动态数 组是指可以根据需要改变大小的数组。
• 可以很容易地声明一个vector类对象,例如:
vector <int> iv; vector <int> cv(5); vector <int> cv(5,’x’); vector <int> iv2(iv);
• 迭代器是一种类似于指针的对象。可以使用迭 代器来访问容器中的元素,就像我们使用指针 来访问数组一样。
• STL中定义了五种迭代器:
– – – – – 随机访问迭代器 RandIter 双向迭代器 BiIter 前向迭代器 ForIter 输入迭代器 InIter 输出迭代器 OutIter
STL的简单使用方法
//使用该编译指示using namespace std;在C++标准类库中定义 的名字在本程序中可以使用
//否则,iostream,string 等c++标准类就不可见了,编译就会出 错。
10.2.3 标准模板库STL简介
• Standard Template Library ( STL) • 包含常用算法和数据结构的通用库
• 在使用一个名字空间时,并不会覆盖当 前的名字空间。
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; }
10.2 C++的标准模板库STL
10.2.1 10.2.2 10.2.3 10.2.4 名字空间namespace简介 C++标准库的构成 标准模板库STL简介 标准模板库STL应用举例
10.2.1 名字空间namespace简介
• 日常生活中人名相同引起的名字冲突;
• C++程序中出现相同的名字引起的冲突:
• (还有其他容器类,可以参考其他书籍或者查阅 联机手册)
常用算法<algorithm>
• • • • • • • 排序 sort( ) 查找 find( ) 替换 replace( ) 合并 merge( ) 反序 reverse( ) 统计 count( ) 其他等等算法
迭代器(iterator)