首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

循环(重复执行一些代码若干次,通常伴随有某个变量值的变化)和决策(decision-making)是两个最基础的编程机制。在前面的章节中已经用过它们,本章将对其作更细致的考察,并看一看它们的替代品。我还将向你介绍C++用于处理(文本)字符串和处理连续的相同类型对象数组的首选机制。这些机制不同于C中使用的机制,而且也或多或少地不同于许多其他流行语言所使用的机制。

一些有着纯函数式语言编程经历的读者也许对C++的循环机制感到陌生。他们可能习惯于使用递归处理许多要求重复的地方。那些来自其他过程式语言(如Visual Basic和Pascal)的人,需要用心注意C++为重复和决策使用的语法。虽然该语法可能与他们过去所使用的类似,但在细节上存在很大的差异。

3.1   一些库类型

3.1.1   std::string—一个库类型

除了上一章中考察的基础类型之外,C++还通过标准库提供了大量的类型。我们把这些类型称作“用户自定义类型(user-defined types)”,最终我将向你展示如何设计并实现你自己的类型。使用基础类型和使用标准库类型(用户自定义类型的主要类别之一)之间的重要区别在于,后者要求我们在源代码中使用它之前,必须先包含适当的头(header)。

std::string是这些类型之一,是C++用以处理字符串(由字符组成的连续序列,用于表示某些文本)的方式。库(我将用“库”来表示“C++标准库”)为std::string提供了大量的功能。最重要的方面之一是,std::string类型的对象可以调整其使用的存储空间的大小,以满足当前所存储的char序列的文本的要求。存储空间的增长(或缩减)可以适应文本字符串的大小。

语言注解:和C使用的char数组相比,使用std::string的代码更为安全,因为它不易导致缓冲区溢出漏洞。这一特性将程序员从原始的C机制所要求的繁重工作中解放出来。对于来自其他编程背景的人来说,也许还存在别的惊奇。例如,和某些其他语言中建立的字符串机制不同,C++字符串是可变的,也就是说,可以改变其内容(除非将其声明为const)。

眼下我们暂且将自己限制于std::string对象的四个属性:

1. 它们可以通过形形色色的方式创建,其中之一是根据一个字符串字面量来创建。因此可以编写

用值“Hello World”为变量greeting创建一个std::string对象。

2. 可以将一个字符串赋给另一个字符串:

这导致message现在含有其自己的“Hello World”副本。

3. 可以从输入流(例如std::cin)中提取字符串,并存储于一个由适当的变量所指定的对象中:

这将导致绑定到message的对象包含有从控制台提取的下一个字符序列,以第一个非空白字符开始,并在下一个空白字符的实例之前立即停止。它将结束空白字符(记住,包括换行字符)留在std::cin的输入缓存中。稍后我们将看看如何提取含有空白字符的文本。

4. 可以将字符串发送到一个输出流,例如std::cout:

这将导致“Hello World”被显示在控制台上(然后输出转移到新的一行)。

3.1.2   std::vector<>—半类型

C++拥有一套用于从现有类型创建新类型的有趣且强悍的机制:类模板(class templates)。编写有用的模板需要大量的经验、知识和技巧。使用由专家设计的类模板,可以让我们的生活倍加轻松,无忧无虑。std::vector<>是一个类模板例子。它提供了一种创建对象的序列(或数组)的方式。std::vector<>对象的重要特性之一是它能自我调整以适应当前所包含对象的数目。它还提供了其他有用的功能。任何时候,如果用户判定存在某些其他东西可能会普遍地有用,他们可以使用C++提供的机制来扩展那些功能。

我将std::vector称为半类型(half type),是因为在成为一个完整的C++类型之前,它还需要某些其他东西。为了从模板创建(实例化)类型,我们必须提供其他信息,就std::vector<>来说,我们要提供它将要包含的对象的类型。

实   验

一个选择得当的程序比很多页的解释效果更好,这里为你准备了一个小程序,输入并试一试:

我打算将此程序的“代码详解”推迟到我讨论完C++中的循环和决策问题之后。你也许觉得这个程序还有改进的余地,比方说,程序假定了输入的正确性。请警惕这类假定,并养成处理它们的习惯。我故意在代码中留下这些问题,因为我希望你检查代码,而不是仅仅听从我的话。以上代码连同早先的程序一起,为下文提供了一些讨论背景。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论