C++ primer plus 第12章 类和动态内存分配

           在 类 构 造函 数 中 , 可 以 使 用 new 为 数 据 分 配 内 存 , 然 后 将 内 存 地 址 赋 给 类成 员 。 这 样 , 类 便 可 以 处 理 长 度 不 同 的 字 符 串 , 而 不 用 在 类 设 计 时 提 前 固 定 数 组 的 长 度 。 在类 构 造 函 数 中 使 用 new , 也 可 能 在 对 象 过 期 时 引 发 问 题 。 如 果 对象 包 含 成 员 指 针 , 同 时 它 指 向 的 内 存 是 由 new 分 配 的 , 则 释 放 用于 保 存 对 象 的 内 存 ,并 不 会 自 动 释 放 对 象 成 员 指 针 指 向 的 内 存 。 因 此 在 类 构 造 函 数 中 使 用 new 类 来 分 配 内 存 时 , 应 在 类 析 构 函 数 中 使 用delete 来 释 放 分 配 的 内 存 。 这 样 , 当 对 象 过 期 时 , 将 自 动 释 放 其 指 针 成 员 指 向 的 内存 。

           如 果 对 象包 含 指 向 new 分 配 的 内 存 的 指 针 成 员 , 则 将 一 个 对 象 初 始 化 为 另一 个 对 象 , 或 将 一 个 对 象 赋 值 给 另 一 个 对 象 时 , 也 会 出 现 问 题 。 在 默 认 情 况 下 , c + + 逐 个 对 成 员 进 行 初 始 化 和 赋 值 , 这 意 味 着 被 初 始 化, 或 被 赋 值 的对 象 的 成 员 将 与 原 始 对 象 完 全 相 同 。 如 果 原 始 对 象 的 成 员 指 向 一 个 数 据 块 , 则 副 本 成 员 将 指向 同 一 个 数 据 块 。 当 程 序 最 终 删 除 这 两 个 对 象 时 , 类 的 析 构 函 数 将 试 图 删 除 同 一 个 内 存 数 据块 两 次 , 这 将 出 错 。 解 决 方 法 是 : 定 义 一 个 特 殊 的 复 制 构 造 函 数 来 重 新 定 义 初 始 化 , 并 重 载赋 值 运 算 符 。 在 上 述 任 何 一 种 情 况 下 , 新 的 定 义 都 将 创 建 指 向 数 据 的 副 本 , 并 使 新 对 象 指 向这 些 副 本 。 这 样 , 旧对 象 和 新 对 象 都 将 引 用 独 立 的 、 相 同 的 数 据 , 而 不 会 重 叠 。 由 于 同 样 的 原因 , 必 须 定 义 赋 值 运 算 符 。 对 于 每 一 种 情 况 , 最 终 目 的 都 是 执 行 深 度 复 制 , 也 就 是 说 , 复 制实 际 的 数 据 , 而 不 仅 仅 是 复 制 指 向 数 据 的 指 针 。

           对 象 的 存储 持 续 性 为 自 动 或 外 部 时 , 在 它 不 再 存 在 时 将 自 动 调 用 其 析 构 函 数 。 如 果 使 用 new 运 算 符 为 对 象 分 配 内 存 , 并 将 其 地 址 赋 给 一 个 指 针 , 则 当 您 将 delete 用 于 该 指 针 时 将 自 动 为 对 象 调 用 析 构 函 数 。 然 而, 如 果 使 用 定 位 new 运 算 符 ( 而 不 是 常 规 new 运 算 符 ) 为 类对 象 分 配 内 存 , 则 必 须 负 责 显 式 地 为 该 对 象 调 用 析 构 函 数 , 方 法 是 使 用 指 向 该 对 象 的 指 针 调用 析 构 函 数 方 法 。 c ++允 许 在 类 中 包 含 结 构 、 类 和 枚 举 定 义 。 这些 嵌 套 类 型 的 作 用 域 为 整 个 类 , 这 意 味 着 它 们 被 局 限 于 类 中 , 不 会 与 其 他 地 方 定 义 的 同 名 结构 、 类 和 枚 举 发 生 冲 突 。

            c + + 为 类 构 造 函 数 提 供 了 一 种 可 用 来 初 始 化 数 据 成 员 的 特 殊 语 法 。 这种 语 法 包 括 冒 号 和 由 逗 号 分 隔 的 初 始 化 列 表 , 被 放 在 构 造 函 数 参 数 的 右 括 号 后 , 函 数 体 的 左括 号 之 前 。 每 一 个 初 始 化 器 都 山 被 初 始 化 的 成 员 的 名 称 和 包 含 初 始 值 的 括 号 组 成 。 从 概 念 上来 说 , 这 些 初 始 化 操 作 是 在 对 象 创 建 时 进 行 的 , 此 时 函 数 体 中 的 语 句 还 没 有 执 行 。 语 法 如 下:

queue (int qs) : qsize(qs) , items(0) ,front(NULL),rear(NULL)   {}

如 果 数 据成 员 是 非 静 态 const 成 员 或 引 用 , 则 必 须 采 用 这 种 格 式 , 但 可 将 C++ Il 新 增 的 类 内 始 化 用 于 非 静 态 const 成员 。

C++ Il 允 许 类 内 初 始 化 , 即 在 类 定 义 中 进行 初 始 化 :

Class Queue

{

Private:

    Node * front = NULL;

        enum {Q_SIZE = 10};

       Node * rear = NULL;

       Int items = 0;

       Const int qsize = Q_SIZE;

….

}

 

这 与 使 用成 员 初 始 化 列 表 等 价 。 然 而 , 使 用 成 员 初 始 化 列 表 的 构 造 函 数 将 覆 盖 相 应 的 类 内 初 始 化 。 您可 能 已 经 注 意 到 , 简 单 的 c 结 构 相 比 , 需 要 注 意 的 类 细 节 要 多 得多 。 作 为 回 报 , 它 们 的 功 能 也 更 强 。

 


猜你喜欢

转载自blog.csdn.net/Hu_yilang/article/details/57990840