13.1 简介
为了能够在蓝天中翱翔,一架飞机首先需要在跑道上加速直至它的速度足以摆脱地球的引力。当飞机在跑道上隆隆移动时,它不过就是一辆特别笨重的、丑陋的大卡车;而一旦飞上了天空,它就会立刻变成一种完全不同的优雅的、高效的交通工具——这才是它的真正本领。
在本章中,我们处于“奔跑”的途中,我们的最终目的是学习足够的编程语言特性与编程技术,以便能摆脱直接管理计算机内存所带来的困难和束缚。我们希望达到这样一种境界:我们只需用一些类型进行编程,这些类型就完全具备逻辑需求所希望的特性。为了“抵达那里”,我们首先需要解决很多与裸机访问有关的基本限制,例如:
·一个对象在内存中的大小是固定的。
·一个对象存放在内存中的某一特定位置。
·计算机只为这些对象提供了有限的基本操作(如拷贝一个机器字、将两个字的值相加,等等)。
基本上,这些都属于C++内置类型与操作的限制(从C语言继承而来的硬件上的限制;参见22.2.5节与第27章)。在第12章中,我们已经开始设计vector类型,它能控制对其元素的所有访问,并且提供了一些从用户角度看来(而非从硬件角度看)“很自然”的操作。
本章将着重介绍拷贝这一概念。这是一个重要的技术问题:我们对一个复杂对象的拷贝所希望的语义是什么?拷贝之后主体与副本之间的独立程度如何?有几种拷贝操作?我们如何指定使用哪种拷贝操作?拷贝操作与其他基本操作(例如初始化与清理)之间有什么关系?
当不能使用高层类型(如vector与string)时,我们不可避免地需要讨论如何直接操纵内存。我们将讨论数组和指针以及它们之间的关系、它们的用法和使用中容易犯的错误。这些信息对每一个开始接触C++或C低层编程的人都是十分重要的。
我们在学习的过程中应留意vector类型针对vector对象的特有细节以及C++在低层类型基础上构建高层类型的方法。然而,各种语言中的“高层”类型(string、vector、list、map等)是基于相同的机器原语构建的,反映了本章所讨论问题的不同解法。 ...