07 2013 档案

摘要:设计具有指针成员的类时,类设计者必须首先需要决定的是该指针应提供什么行为。将一个指针复制到另一个指针时,两个指针指向同一对象。当两个指针指向同一对象时,可能使用任一指针改变基础对象。类似地,很可能一个指针删除了一对象时,另一指针的用户还认为基础对象仍然存在。指针成员默认具有与指针对象同样的行为。然而,通过不同的复制控制策略,可以为指针成员实现不同的行为。大多数 C++ 类采用以下三种方法之一管理指针成员:1. 指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。2. 类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。3. 类采取值型行为。 阅读全文
posted @ 2013-07-31 14:19 HandsomeDragon 阅读(376) 评论(0) 推荐(0)
摘要:0. 复制构造函数只有单个形参,而且该形参是对本类类型对象的引用(常用 const 修饰),这样的构造函数称为复制构造函数。与默认构造函数一样,复制构造函数可由编译器隐式调用。复制构造函数可用于: 根据另一个同类型的对象显式或隐式初始化一个对象。 复制一个对象,将它作为实参传给一个函数。 从函数返回时复制一个对象。 初始化顺序容器中的元素。 根据元素初始化式列表初始化数组元素。对象的定义形式回忆一下,C++ 支持两种初始化形式:直接初始化和复制初始化。复制初始化使用 = 符号,而直接初始化将初始化式放在圆括号中。当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调... 阅读全文
posted @ 2013-07-18 14:50 HandsomeDragon 阅读(845) 评论(0) 推荐(0)
摘要:0. 使用背景对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。也许,在程序的任意点需要统计已创建的特定类类型对象的数量;或者,全局对象可能是指向类的错误处理例程的一个指针;或者,它是指向类类型对象的内在自由存储区的一个指针。然而,全局对象会破坏封装:对象需要支持特定类抽象的实现。如果对象是全局的,一般的用户代码就可以修改这个值。1. static 类成员类可以定义类 静态成员,而不是定义一个可普遍访问的全局对象。通常,非 static 数据成员存在于类类型的每个对象中。不像普通的数据成员,static 数据成员独立于该类的任意对象而存在;每个 static 数据成员是与类关联的对象 阅读全文
posted @ 2013-07-17 16:10 HandsomeDragon 阅读(680) 评论(0) 推荐(0)
摘要:友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。友元关系:一个例子想像一下,除了 Screen 类之外,还有一个窗口管理器,管理给定显示器上的一组 Screen。窗口管理类在逻辑上可能需要访问由其管理的 Screen 对象的内部数据。假定 Window_Mgr 是该窗口管理类的名字,Screen 应该允许 Window_Mgr 像下面这样访问其成员:c 阅读全文
posted @ 2013-07-17 13:54 HandsomeDragon 阅读(383) 评论(0) 推荐(1)
摘要:C++ 标准化过程做出的更重要的贡献之一是:创建和扩展了标准库。容器和算法库是标准库的基础。标准库定义了超过一百个算法。幸运的是,这些算法具有相同的结构,使它们更易于学习和使用。算法与类型无关:它们通常在一个元素序列上操作,这些元素可以存储在标准库容器类型、内置数组甚至是生成的序列(例如读写流所生成的序列)上。算法基于迭代器操作,从而实现类型无关性。大多数算法使用一对指定元素范围的迭代器作为其头两个实参。其他的迭代器实参包括指定输出目标的输出迭代器,或者用于指定第二个输入序列的另一个或一对迭代器。迭代器可通过其所支持的操作来分类。标准库定义了五种迭代器类别:输入、输出、前向、双向和随机访问迭代 阅读全文
posted @ 2013-07-12 10:35 HandsomeDragon 阅读(196) 评论(0) 推荐(0)
摘要:list 容器上的迭代器是双向的,而不是随机访问类型。由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。这些算法包括 sort 及其相关的算法。还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,虽然可以用在 list 上,但却付出了性能上的代价。如果这些算法利用 list 容器实现的特点,则可以更高效地执行。如果可以结合利用 list 容器的内部结构,则可能编写出更快的算法。与其他顺序容器所支持的操作相比,标准库为 list 容器定义了更精细的操作集合,使它不必只依赖于泛型操作。表 11.4 列出了 list 容器特有的 阅读全文
posted @ 2013-07-11 17:35 HandsomeDragon 阅读(232) 评论(0) 推荐(0)
摘要:【3. 反向迭代器】反向迭代器是一种反向遍历容器的迭代器。其将自增(和自减)的含义反过来了:对于反向迭代器,++ 运算将访问前一个元素,而 -- 运算则访问下一个元素。所有容器还定义了 rbegin 和 rend 成员,分别返回指向容器尾元素和首元素前一位置的反向迭代器。与普通迭代器一样,反向迭代器也有常量(const)和非常量(nonconst)类型。图 11.1 使用一个假设名为 vec 的 vector 类型对象阐明了这四种迭代器之间的关系。假设有一个 vector 容器对象,存储 0-9 这 10 个以升序排列的数字:vector vec;for (vector::size_type 阅读全文
posted @ 2013-07-08 17:03 HandsomeDragon 阅读(551) 评论(0) 推荐(0)
摘要:【0. 概述总览】之前已强调标准库所定义的迭代器不依赖于特定的容器。事实上,C++ 语言还提供了另外 3 种迭代器:插入迭代器: 与容器绑定在一起,实现在容器中插入元素的功能。 iostream 迭代器: 可与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。反向迭代器: 实现向后遍历,而不是向前遍历。所有容器类型都定义了自己的 reverse_iterator 类型, 由 rbegin 和 rend 成员函数返回。上述迭代器类型都在 iterator 头文件中定义。【1. 插入迭代器】通过插入迭代器赋值时,迭代器将会插入一个新的元素。C++ 语言提供了 ... 阅读全文
posted @ 2013-07-08 16:31 HandsomeDragon 阅读(435) 评论(0) 推荐(0)