C、程序员面试常见问题.pdf
《C、程序员面试常见问题.pdf》由会员分享,可在线阅读,更多相关《C、程序员面试常见问题.pdf(115页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 一 部 分:简 答 题 Lnew、delete malloc、free 关 系 delete会 调 用 对 象 的 析 构 函 数,和 new对 应 free只 会 释 放 内 存,new调 用 构 造 函 数。malloc与 free是 C+/C语 言 的 标 准 库 函 数,new/delete是 C+的 运 算 符。它 们 都 可 用 于 申 请 动 态 内 存 和 释 放 内 存。对 于 非 内 部 数 据 类 型 的 对 象 而 言,光 用 maloc/free无 法 满 足 动 态 对 象 的 要 求。对 象 在 创 建 的 同 时 要 自 动 执 行 构 造 函 数,对 象
2、在 消 亡 之 前 要 自 动 执 行 析 构 函 数。由 于 malloc/free是 库 函 数 而 不 是 运 算 符,不 在 编 译 器 控 制 权 限 之 内,不 能 够 把 执 行 构 造 函 数 和 析 构 函 数 的 任 务 强 加 于 malloc/freeo 因 此 C+语 言 需 要 一 个 能 完 成 动 态 内 存 分 配 和 初 始 化 工 作 的 运 算 符 n e w,以 及 一 个 能 完 成 清 理 与 释 放 内 存 工 作 的 运 算 符 deleteo 注 意 new/delete不 是 库 函 数。delete 与 delete 口 区 别 dele
3、te只 会 调 用 一 次 析 构 函 数,而 delete口 会 调 用 每 一 个 成 员 的 析 构 函 数。在 More Effective C+中 有 更 为 详 细 的 解 释:“当 delete操 作 符 用 于 数 组 时,它 为 每 个 数 组 元 素 调 用 析 构 函 数,然 后 调 用 operatordelete来 释 放 内 存。delete与 New配 套,delete 与 new 配 套 MemTest*mTest 1=newMemTest 10;MemTest*mTest2=newMemTest;int*pIntl=newint10;int*plnt2=new
4、int;deleteplntl;/-l-deleteplnt2;/-2-deletemTestl;/-3-deletemTest2;/-4-在-4-处 报 错。这 就 说 明:对 于 内 建 简 单 数 据 类 型,delete和 delete口 功 能 是 相 同 的。对 于 自 定 义 的 复 杂 数 据 类 型,delete和 delete不 能 互 用。delete口 删 除 一 个 数 组,delete删 除 一 个 指 针 简 单 来 说,用 new分 配 的 内 存 用 delete删 除 用 new口 分 配 的 内 存 用 delete口 删 除 delete会 调 用 数
5、组 元 素 的 析 构 函 数。内 部 数 据 类 型 没 有 析 构 函 数,所 以 问 题 不 大。如 果 你 在 用 delete时 没 用 括 号,delete就 会 认 为 指 向 的 是 单 个 对 象,否 则,它 就 会 认 为 指 向 的 是 一 个 数 组。3.C C+JA V A共 同 点,不 同 之 处?4.继 承 优 缺 点。类 继 承 是 在 编 译 时 刻 静 态 定 义 的,且 可 直 接 使 用,类 继 承 可 以 较 方 便 地 改 变 父 类 的 实 现。但 是 类 继 承 也 有 一 些 不 足 之 处。首 先,因 为 继 承 在 编 译 时 刻 就 定
6、义 了,所 以 无 法 在 运 行 时 刻 改 变 从 父 类 继 承 的 实 现。更 糟 的 是,父 类 通 常 至 少 定 义 了 子 类 的 部 分 行 为,父 类 的 任 何 改 变 都 可 能 影 响 子 类 的 行 为。如 果 继 承 下 来 的 实 现 不 适 合 解 决 新 的 问 题,则 父 类 必 须 重 写 或 被 其 他 更 适 合 的 类 替 换。这 种 依 赖 关 系 限 制 了 灵 活 性 并 最 终 限 制 了 复 用 性。(待 补 充)5.C+有 哪 些 性 质(面 向 对 象 特 点)封 装,继 承 和 多 态。在 面 向 对 象 程 序 设 计 语 言 中
7、,封 装 是 利 用 可 重 用 成 分 构 造 软 件 系 统 的 特 性,它 不 仅 支 持 系 统 的 可 重 用 性,而 且 还 有 利 于 提 高 系 统 的 可 扩 充 性;消 息 传 递 可 以 实 现 发 送 一 个 通 用 的 消 息 而 调 用 不 同 的 方 法;封 装 是 实 现 信 息 隐 蔽 的 一 种 技 术,其 目 的 是 使 类 的 定 义 和 实 现 分 离。6.子 类 析 构 时 要 调 用 父 类 的 析 构 函 数 吗?析 构 函 数 调 用 的 次 序 是 先 派 生 类 的 析 构 后 基 类 的 析 构,也 就 是 说 在 基 类 的 的 析 构
8、 调 用 的 时 候,派 生 类 的 信 息 已 经 全 部 销 毁 了 定 义 一 个 对 象 时 先 调 用 基 类 的 构 造 函 数、然 后 调 用 派 生 类 的 构 造 函 数;析 构 的 时 候 恰 好 相 反:先 调 用 派 生 类 的 析 构 函 数、然 后 调 用 基 类 的 析 构 函 数 JA V A无 析 构 函 数 深 拷 贝 和 浅 拷 贝 7.多 态,虚 函 数,纯 虚 函 数 8.求 下 面 函 数 的 返 回 值(微 软)int fiinc(x)int countx=0;while(x)countx+;X=x&(x-l);return countx;假 定
9、x=9999。答 案:8思 路:将 x 转 化 为 2 进 制,看 含 有 的 1 的 个 数。9.什 么 是“引 用”?申 明 和 使 用“引 用”要 注 意 哪 些 问 题?答:引 用 就 是 某 个 目 标 变 量 的“别 名”(alias),对 应 用 的 操 作 与 对 变 量 直 接 操 作 效 果 完 全 相 同。申 明 一 个 引 用 的 时 候,切 记 要 对 其 进 行 初 始 化。引 用 声 明 完 毕 后,相 当 于 目 标 变 量 名 有 两 个 名 称,即 该 目 标 原 名 称 和 引 用 名,不 能 再 把 该 引 用 名 作 为 其 他 变 量 名 的 别 名
10、。声 明 一 个 引 用,不 是 新 定 义 了 一 个 变 量,它 只 表 示 该 引 用 名 是 目 标 变 量 名 的 一 个 别 名,它 本 身 不 是 一 种 数 据 类 型,因 此 引 用 本 身 不 占 存 储 单 元,系 统 也 不 给 引 用 分 配 存 储 单 元。不 能 建 立 数 组 的 引 用。10.将“引 用”作 为 函 数 参 数 有 哪 些 特 点?(1)传 递 引 用 给 函 数 与 传 递 指 针 的 效 果 是 一 样 的。这 时,被 调 函 数 的 形 参 就 成 为 原 来 主 调 函 数 中 的 实 参 变 量 或 对 象 的 一 个 别 名 来 使
11、 用,所 以 在 被 调 函 数 中 对 形 参 变 量 的 操 作 就 是 对 其 相 应 的 目 标 对 象(在 主 调 函 数 中)的 操 作。(2)使 用 引 用 传 递 函 数 的 参 数,在 内 存 中 并 没 有 产 生 实 参 的 副 本,它 是 直 接 对 实 参 操 作;而 使 用 一 般 变 量 传 递 函 数 的 参 数,当 发 生 函 数 调 用 时,需 要 给 形 参 分 配 存 储 单 元,形 参 变 量 是 实 参 变 量 的 副 本;如 果 传 递 的 是 对 象,还 将 调 用 拷 贝 构 造 函 数。因 此,当 参 数 传 递 的 数 据 较 大 时,用
12、引 用 比 用 一 般 变 量 传 递 参 数 的 效 率 和 所 占 空 间 都 好。(3)使 用 指 针 作 为 函 数 的 参 数 虽 然 也 能 达 到 与 使 用 引 用 的 效 果,但 是,在 被 调 函 数 中 同 样 要 给 形 参 分 配 存 储 单 元,且 需 要 重 复 使 用*指 针 变 量 名 的 形 式 进 行 运 算,这 很 容 易 产 生 错 误 且 程 序 的 阅 读 性 较 差;另 一 方 面,在 主 调 函 数 的 调 用 点 处,必 须 用 变 量 的 地 址 作 为 实 参。而 引 用 更 容 易 使 用,更 清 晰。11.在 什 么 时 候 需 要
13、使 用“常 引 用”?如 果 既 要 利 用 引 用 提 高 程 序 的 效 率,又 要 保 护 传 递 给 函 数 的 数 据 不 在 函 数 中 被 改 变,就 应 使 用 常 引 用。常 引 用 声 明 方 式:const类 型 标 识 符&引 用 名=目 标 变 量 名;例 1int a;const int&ra=a;ra=l;错 误 a=l;/正 确 例 2string fdo();void bar(string&s);那 么 下 面 的 表 达 式 将 是 非 法 的:bar(foo();bar(nhello world0);原 因 在 于 foo()和”hello world”串
14、 都 会 产 生 一 个 临 时 对 象,而 在 C+中,这 些 临 时 对 象 都 是 const类 型 的。因 此 上 面 的 表 达 式 就 是 试 图 将 一 个 const类 型 的 对 象 转 换 为 非 const类 型,这 是 非 法 的。引 用 型 参 数 应 该 在 能 被 定 义 为 const的 情 况 下,尽 量 定 义 为 const o12.将“引 用”作 为 函 数 返 回 值 类 型 的 格 式、好 处 和 需 要 遵 守 的 规 则?格 式:类 型 标 识 符&函 数 名(形 参 列 表 及 类 型 说 明)/函 数 体 好 处:在 内 存 中 不 产 生
15、被 返 回 值 的 副 本;(注 意:正 是 因 为 这 点 原 因,所 以 返 回 一 个 局 部 变 量 的 引 用 是 不 可 取 的。因 为 随 着 该 局 部 变 量 生 存 期 的 结 束,相 应 的 引 用 也 会 失 效,产 生 runtime error!注 意 事 项:(1)不 能 返 回 局 部 变 量 的 引 用。这 条 可 以 参 照 Effective C+l的 Item 31。主 要 原 因 是 局 部 变 量 会 在 函 数 返 回 后 被 销 毁,因 此 被 返 回 的 引 用 就 成 为 了 无 所 指 的 引 用,程 序 会 进 入 未 知 状 态。(2)
16、不 能 返 回 函 数 内 部 n e w分 配 的 内 存 的 引 用。这 条 可 以 参 照 EffectiveC+川 的 Item 3 k 虽 然 不 存 在 局 部 变 量 的 被 动 销 毁 问 题,可 对 于 这 种 情 况(返 回 函 数 内 部 new分 配 内 存 的 引 用),又 面 临 其 它 尴 尬 局 面。例 如,被 函 数 返 回 的 引 用 只 是 作 为 一 个 临 时 变 量 出 现,而 没 有 被 赋 予 一 个 实 际 的 变 量,那 么 这 个 引 用 所 指 向 的 空 间(由 new分 配)就 无 法 释 放,造 成 memory leak。(3)可
17、 以 返 回 类 成 员 的 引 用,但 最 好 是 const。这 条 原 则 可 以 参 照 EffectiveC+1J Item 30o 主 要 原 因 是 当 对 象 的 属 性 是 与 某 种 业 务 规 则(business rule)相 关 联 的 时 候,其 赋 值 常 常 与 某 些 其 它 属 性 或 者 对 象 的 状 态 有 关,因 此 有 必 要 将 赋 值 操 作 封 装 在 一 个 业 务 规 则 当 中。如 果 其 它 对 象 可 以 获 得 该 属 性 的 非 常 量 引 用(或 指 针),那 么 对 该 属 性 的 单 纯 赋 值 就 会 破 坏 业 务 规
18、 则 的 完 整 性。(4)流 操 作 符 重 载 返 回 值 申 明 为“引 用”的 作 用:流 操 作 符 和,这 两 个 操 作 符 常 常 希 望 被 连 续 使 用,例 如:cout hello e n d l;因 此 这 两 个 操 作 符 的 返 回 值 应 该 是 一 个 仍 然 支 持 这 两 个 操 作 符 的 流 引 用。可 选 的 其 它 方 案 包 括:返 回 一 个 流 对 象 和 返 回 一 个 流 对 象 指 针。但 是 对 于 返 回 一 个 流 对 象,程 序 必 须 重 新(拷 贝)构 造 一 个 新 的 流 对 象,也 就 是 说,连 续 的 两 个 操
19、 作 符 实 际 上 是 针 对 不 同 对 象 的!这 无 法 让 人 接 受。对 于 返 回 一 个 流 指 针 则 不 能 连 续 使 用 操 作 符。因 此,返 回 一 个 流 对 象 引 用 是 惟 一 选 择。这 个 唯 一 选 择 很 关 键,它 说 明 了 引 用 的 重 要 性 以 及 无 可 替 代 性,也 许 这 就 是 C+语 言 中 引 入 引 用 这 个 概 念 的 原 因 吧。赋 值 操 作 符=。这 个 操 作 符 象 流 操 作 符 一 样,是 可以 连 续 使 用 的,例 如:x=j=10;或 者(x=10尸 100;赋 值 操 作 符 的 返 回 值 必
20、须 是 一 个 左 值,以 便 可 以 被 继 续 赋 值。因 此 引 用 成 了 这 个 操 作 符 的 惟 一 返 回 值 选 择。例 3#i nclude int&put(int n);int vals10;int error=-1;void main()(put(0)=10;以 put(O)函 数 值 作 为 左 值,等 价 于 vals0=10;put(9尸 20;/以 put(9)函 数 值 作 为 左 值,等 价 于 vals9=20;coutvals0;coutvals9;int&put(int n)(if(n=0&n=9)return valsn;else c o u tns
21、ubscript error0;return error;(5)在 另 外 的 一 些 操 作 符 中,却 千 万 不 能 返 回 引 用:+-*/四 则 运 算 符。它 们 不 能 返 回 引 用,Effective C+l的 Item23详 细 的 讨 论 了 这 个 问 题。主 要 原 因 是 这 四 个 操 作 符 没 有 side e ffe c t,因 此,它 们 必 须 构 造 一 个 对 象 作 为 返 回 值,可 选 的 方 案 包 括:返 回 一 个 对 象、返 回 一 个 局 部 变 量 的 引 用,返 回 一 个 n e w分 配 的 对 象 的 引 用、返 回 一 个
22、 静 态 对 象 引 用。根 据 前 面 提 到 的 引 用 作 为 返 回 值 的 三 个 规 则,第 2、3 两 个 方 案 都 被 否 决 了。静 态 对 象 的 引 用 又 因 为(a+b)=(c+d)会 永 远 为 true而 导 致 错 误。所 以 可 选 的 只 剩 下 返 回 一 个 对 象 了。13.“引 用”与 多 态 的 关 系?引 用 是 除 指 针 外 另 一 个 可 以 产 生 多 态 效 果 的 手 段。这 意 味 着,一 个 基 类 的 引 用 可 以 指 向 它 的 派 生 类 实 例。例 4Class A;Class B:Class A.;B b;A&ref
23、=b;14.“引 用”与 指 针 的 区 别 是 什 么?指 针 通 过 某 个 指 针 变 量 指 向 一 个 对 象 后,对 它 所 指 向 的 变 量 间 接 操 作。程 序 中 使 用 指 针,程 序 的 可 读 性 差;而 引 用 本 身 就 是 目 标 变 量 的 别 名,对 引 用 的 操 作 就 是 对 目 标 变 量 的 操 作。此 外,就 是 上 面 提 到 的 对 函 数 传 ref和 pointer的 区 别。15.什 么 时 候 需 要“引 用”?流 操 作 符 和、赋 值 操 作 符=的 返 回 值、拷 贝 构 造 函 数 的 参 数、赋 值 操 作 符=的 参 数
24、、其 它 情 况 都 推 荐 使 用 引 用。以 上 2-8 参 考:http:/develop.csai.en/c/N0000002 l.htm16.结 构 与 联 合 有 和 区 别?(1).结 构 和 联 合 都 是 由 多 个 不 同 的 数 据 类 型 成 员 组 成,但 在 任 何 同 一 时 刻,联 合 中 只 存 放 了 一 个 被 选 中 的 成 员(所 有 成 员 共 用 一 块 地 址 空 间),而 结 构 的 所 有 成 员 都 存 在(不 同 成 员 的 存 放 地 址 不 同)。(2).对 于 联 合 的 不 同 成 员 赋 值,将 会 对 其 它 成 员 重 写,
25、原 来 成 员 的 值 就 不 存 在 了,而 对 于 结 构 的 不 同 成 员 赋 值 是 互 不 影 响 的。17.面 关 于“联 合”的 题 目 的 输 出?a)#i nclude unionint i;char x2;)a;void main()(a.x0=10;a.xl=1;printf(H%dn,a.i);)答 案:266(低 位 低 地 址,高 位 高 地 址,内 存 占 用 情 况 是 OxOlOA)b)main()(union/*定 义 一 个 联 合*/int i;struct/*在 联 合 中 定 义 一 个 结 构*/char first;char second;ha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序员 面试 常见问题
限制150内